banner
ximalaya

ximalaya

这里是openkava 的blog,关注程序开发的一切技术。 ZZ 表示转载的文章,如涉及版权,请和我联系删除。 在这里你可以看到关于以下技术的文章: 移动开发技术,ANDROID ,IOS,WINDOWS PHONE平台开发,企业ERP开发,动态脚本PYTHON ,OPENGL ES 3D技术,游戏开发技术,HTML5 ,JAVASCRIPT ,MYSQL,AMAZON EC2 ,GOOGLE GAE ,GOOGLE CLOUD SQL 等 。 本站发展历程: 2010年,正式把所有的blog移到这里,租用godaddy的空间,记录生活和工作上的一些心得。 下面是关于我的个人介绍,写在这里权当凑字数啦。 职业:软件开发,开发经验6年,管理经验3年; 工作上使用的技术:C#, SQL SERVER 个人使用的技术:PYTHON,PHP, CSS, JAVA ,ANDROID ,object-c 等等 联系我请发邮件:<a href="http://blog.openkava.com/openkava@gmail.png"><img class="alignnone size-full wp-image-96" title="邮箱" src="http://blog.openkava.com/openkava@gmail.png" alt="" width="174" height="24" /></a>

socat 工具做端口轉發

linux:

socat TCP4-LISTEN:188,reuseaddr,fork TCP4:192.168.1.22:123 &

(在本地監聽 188 端口,並將請求轉發至 192.168.1.22 的 123 端口)

windows:

cmd:> socat TCP4-LISTEN:1234,reuseaddr,fork TCP4:192.168.1.22:3389

TCP4-LISTEN:在本地建立的是一個 TCP ipv4 協議的監聽端口;
reuseaddr:綁定本地一個端口;
fork:設定多連接模式,即當一個連接被建立後,自動複製一個同樣的端口再進行監聽

socat 啟動監聽模式會在前端佔用一個 shell,因此需使其在後台執行。
socat -d -d tcp4-listen:8900,reuseaddr,fork tcp4:10.5.5.10:3389 # 端口轉發

server : socat exec:/bin/sh  tcp4.x.x.x:999
client: socat tcp-listen:999 - # 服務端開啟 sh 終端,顯示到客戶端
socat -d -d tcp4-listen:8901,reuseaddr,fork tcp4:10.120.0.208:3389
socat -d -d tcp4-listen:8903,reuseaddr,fork tcp4:10.5.5.10:1433

ssl tunnel :
server tcp-listen:8888 ,reuseaddr,fork , tcp4:10.0.0.client
client tcp4:10.0.0.server tcp-connect:hostname:8888

tun: 創建兩個伺服器和客戶端之間一條通道
socat -d -d tcp-listen:9999,reuseaddr tun:10.0.0.1/23,up #server
socat socat tcp.x.x.x:9999 tun:10.0.0.2/24 ,up

 


說起來有點土,事到如今才第一次用 socat.
不過今天看了一眼,netcat (nc) 這東西 ms 已經 N 年沒有任何人維護了。最先有個叫 nc110 的東西,由於太普及,以至於人們都不想再去改動它的功能。結果導致多年來沒有任何進步… 現任的 RHEL5 裡面好像也是由 nc110 改出來的。另外分支出來一個 netcat, 這個在 google 上直接 netcat 最容易出來,但也好多年沒有任何人動過了… 由於這些情況,才使得 socat 應運而生。雖然它已經生了好多年了,不過我才認識…
用 socat 試幾個 netcat 常用的用法,對比如下:

  1. 聽 tcp 12345 端口

nc -l 127.0.0.1 12345#

socat tcp-listen:12345 -#

  1. 向遠處 tcp 12345 端口發點字

echo “test” | nc 127.0.0.1 12345#

echo “test” | socat - tcp-connect:127.0.0.1:12345#

  1. 聽 udp 23456 端口

nc -u -l 127.0.0.1 23456#

socat udp-listen:23456 -#

  1. 向遠處 udp 23456 端口發點字

echo “test” | nc -u 127.0.0.1 23456#

echo “test” | socat - udp-connect:127.0.0.1:23456#

  1. 聽 unix socket /tmp/unix.socket

nc -U -l /tmp/unix.socket#

netcat 沒有 - U 選項

socat unix-listen:/tmp/unix.socket -#

  1. 向本地 unix socket /tmp/unix.socket 發點字

echo “test” | nc -U /tmp/unix.socket#

netcat 沒有 - U 選項

echo “test” | socat - unix-connect:/tmp/unix.sock#

  1. 聽本地 unix datagram socket /tmp/unix.dg.sock
    nc110 搞不定,netcat 也搞不定

socat unix-recvfrom:/tmp/unix.dg.sock -#

  1. 向本地 unix datagram socket /dev/log 發點字
    nc110 搞不定,netcat 也搞不定

echo “test” | socat - unix-sendto:/tmp/unix.dg.sock#

 

----------第二篇放一起了-------
linux 下實現 UDP 端口映射
原文鏈接: http://www.hiadmin.com/?tag=socat

一、實際問題
snmp 監聽端口默認為 UPD 161,當監控伺服器無法直接訪問時,就需要用到端口映射來解決!
同樣問題還有 dns 伺服器的 UPD 53 端口。
二、使用 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 服務就不行啦!
三、採用 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 工具等等!

 

附:
socat 官方文檔:http://www.dest-unreach.org/socat/doc/socat.html


socat 是一個 netcat (nc) 的替代產品,可以稱得上 nc++。socat 的特點就是在兩個流之間建立一個雙向的通道。socat 的地址類型很多,有 ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl, 等等。看一個例子:

c:&gt;socat - tcp:192.168.1.18:80

這個命令等同於 nc 192.168.1.18 80。 socat 裡面,必須有兩個流,所以第一個參數 - 代表標準的輸入輸出,第二個流連接到 192.168.1.18 的 80 端口。再看一個反向 telnet 的例子:

on server:
c:&gt;socat tcp-listen:23 exec,pty,stderr

這個命名把 cmd 綁定到端口 23,同時把 cmd 的 Stderr 重定向到 stdout。

on client:
c:&gt;socat readline tcp:server:23

連接到伺服器的 23 端口,即可獲得一個 cmd shell。readline 是 gnu 的命令行編輯器,具有歷史功能。

再看文件傳遞的例子。nc 也經常用來傳遞文件,但是 nc 有一個缺點,就是不知道文件什麼時候傳完了,一般要用 Ctrl+c 來終止,或者估計一個時間,用 - w 參數來讓他自動終止。用 socat 就不用這麼麻煩了:

on host 1:
c:&gt;socat -u open.exe,binary tcp-listen:999

on host 2:
c:&gt;socat -u tcp:host1:999 open.exe,create,binary

這個命令把文件 myfile.exe 用二進制的方式,從 host 1 傳到 host 2。-u 表示數據單向流動,從第一個參數到第二個參數,-U 表示從第二個到第一個。文件傳完了,自動退出。

再來一個大家喜歡用的例子。在一個 NAT 環境,如何從外部連接到內部的一個端口呢?只要能夠在內部運行 socat 就可以了。

外部:
c:&gt;socat tcp-listen:1234 tcp-listen:3389

內部:
c:&gt;socat tcp:outerhost:1234 tcp:192.168.12.34:3389

這樣,你外部機器上的 3389 就影射在內部網 192.168.12.34 的 3389 端口上。

socat 還具有一個獨特的讀寫分流功能,比如:

c:&gt;socat open.txt!!open.txt,create,append tcp-listen:80,reuseaddr,fork

這個命令實現一個假的 web server,客戶端連過來之後,就把 read.txt 裡面的內容發過去,同時把客戶的數據保存到 write.txt 裡面。”!!” 符號用戶合併讀寫流,前面的用於讀,後面的用於寫。

 

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。