轉載:http://www.wenquan.name/?p=1158html
提及來有點土,事到現在才第一次用socat.前端
不過今天看了一眼,netcat(nc)這東西ms已經N年沒有人維護了.最早有個叫nc110的東西,因爲太普及, 以致於人們都不想再去改動它的功能.結果致使多年來沒有任何進步…現任的RHEL5裏面好像也是由nc110改出來的.另外分支出來一個netcat,這個在google上直接netcat最容易出來,但也好多年沒有人動過了…因爲這些狀況,才使得socat應運而生.雖然它已經生了好多年了,不過我才認識…linux
用socat試幾個netcat經常使用的用法,對好比下:shell
1. 聽tcp 12345端口
# nc -l 127.0.0.1 12345
# socat tcp-listen:12345 -安全
2. 向遠處tcp 12345端口發點字
# echo 「test」 | nc 127.0.0.1 12345
# echo 「test」 | socat - tcp-connect:127.0.0.1:12345服務器
3. 聽udp 23456端口
# nc -u -l 127.0.0.1 23456
# socat udp-listen:23456 -socket
4. 向遠處udp 23456端口發點字
# echo 「test」 | nc -u 127.0.0.1 23456
# echo 「test」 | socat - udp-connect:127.0.0.1:23456tcp
5. 聽unix socket /tmp/unix.socket
# nc -U -l /tmp/unix.socket
netcat沒有-U選項
# socat unix-listen:/tmp/unix.socket -工具
6. 向本地unix socket /tmp/unix.socket發點字
# echo 「test」 | nc -U /tmp/unix.socket
netcat沒有-U選項
# echo 「test」 | socat - unix-connect:/tmp/unix.sock學習
7. 聽本地unix datagram socket /tmp/unix.dg.sock
nc110搞不定,netcat也搞不定
# socat unix-recvfrom:/tmp/unix.dg.sock -
8. 向本地unix datagram socket /dev/log發點字
nc110搞不定,netcat也搞不定
# echo 「test」 | socat - unix-sendto:/tmp/unix.dg.sock
-----------------------------------------------------------------------------------------------------------------------------------
1、實際問題
snmp監聽端口默認爲UPD 161,當監控服務器沒法直接訪問時,就須要用到端口映射來解決!
一樣問題還有dns服務器的UPD 53端口。
2、使用nc來映射UPD端口
假設被監控服務器的IP爲192.168.1.1;用於端口映射的主機爲某個公網IP如59.1.1.1;須要映射的端口爲UDP 161轉發端口設爲1161(自定義建議1024以上端口)
在端口映射服務器上操做,要安裝nc,通常系統都會安裝;
【注:nc存在安全漏洞,必定要設定防火牆】
首先使用mkfifo創建管道文件
#mkfifo /tmp/snmpfifo
經過nc創建端口映射 -l爲監聽模式 -u爲UDP -p爲本地端口;將內網監控161端口映射到本地的1161端口上;
#nc -l -u -p 1161 < /tmp/snmpfifo | nc -u 192.168.1.1 161 > /tmp/snmpfifo
查看netstat 1161是否監聽
#netstat -nlp |grep :1161
udp 0 0 0.0.0.0:1161 0.0.0.0:* 31472/nc
在監控服務器上進行測試是否能採集到數據:
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
....
#snmpwalk -c public -v2c 59.1.1.1:1161 if
設定成功;這裏存在一個問題就是nc監聽的端口每次一鏈接就會掛起,採起一個比較笨的辦法就是寫個restart.sh腳本放在crontab中每分鐘執行一次;
產生該問題的主要緣由我在下面講socat的時候會分析的;
針對snmp採集這樣是沒有問題,若是dns服務就不行啦!
3、採用nc升級版本的socat來實現UDP端口映射
軟件包下載地址:http://www.dest-unreach.org/socat/download/
安裝無非就是configure make make install
socat的主要特色就是在兩個數據流之間創建通道;且支持衆多協議和連接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等
這裏不一一介紹啦!
有興趣能夠查看官方文檔:http://www.dest-unreach.org/socat/doc/socat.html
咱們說說如何使用socat創建UPD端口映射
#socat udp4-listen:11161,reuseaddr,fork UDP:[監控服務器IP]:161
udp4-listen:在本地創建的是一個udp ipv4協議的監聽端口;
reuseaddr,綁定本地一個端口;
fork,設定多連接模式,即當一個連接被創建後,自動複製一個一樣的端口再進行監聽;
【注:nc就是由於缺乏fork模式,因此每次監聽只能處理一次鏈接】 socat是一個強大的軟件,但願與有這方面需求的同仁一塊兒學習這個好的工具! ps:不管是nc方式仍是socat方式,啓動監聽模式都是在前端佔用一個shell,因此請在後臺執行或者使用screen工具等等!