咱們在阿里雲開了一臺服務器, 合做方那邊的設備須要向服務器6000端口不停的發送UDP數據包, 我經過SSH和SOCAT把對服務器6000端口的數據包轉發到我本地Macbook Pro的6000端口上以方便開發和測試工做.
目的是解決SSH僅支持TCP的問題
html
其中server_ip
爲阿里雲SSH服務器IP地址或域名. 使用時能夠替換爲你本身的服務器IP地址或域名.git
SSH服務器, SOCAT工具segmentfault
在client
端運行以下命令服務器
ssh -vv -N -R 8000:127.0.0.1:8000 root@server_ip
上面的命令在客戶端和SSH服務器之間創建了一根相互鏈接的隧道. 隧道客戶端地址爲本機地址 127.0.0.1:8000
, 服務器端地址爲 0.0.0.0:8000
(監聽在0.0.0.0
表示綁定服務器的全部接口地址, 這樣客戶端可以訪問服務器端的全部接口地址)網絡
因爲SSH並不直接支持UDP, 所以咱們用到了一個UDP中繼工具
socat
(SOcket CAT)併發
把服務器在UDP 6000端口上收到的UDP數據包轉發到服務器本地8000 TCP端口上. 在 server
端運行以下命令:ssh
socat -T15 udp4-recvfrom:6000,reuseaddr,fork tcp:localhost:8000
此時UDP數據包會經過SSH隧道到達我本機筆記本的8000端口上, 咱們還須要開一個轉換器, 讓本地8000端口接收到的TCP數據包轉換爲UDP數據包, 併發送到本地 6000 UDP端口上. 在 client
端運行以下命令:tcp
socat tcp4-listen:8000,reuseaddr,fork udp:127.0.0.1:6000
如今個人本機就看到了, 從服務器6000端口, 經過SSH隧道過來的UDP數據包了.工具
對於SSH的遠程轉發, 須要在SSH服務器端的
/etc/ssh/sshd_config
配置文件中增長GatewayPorts yes
測試
下圖爲erlang編寫的一個簡單udp服務器接收到數據包時的輸出.
SSH Port Forwarding for TCP and UDP Packets
Performing UDP tunneling through an SSH connection