SSH: 使用SSH+SOCAT中繼UDP數據包

咱們在阿里雲開了一臺服務器, 合做方那邊的設備須要向服務器6000端口不停的發送UDP數據包, 我經過SSH和SOCAT把對服務器6000端口的數據包轉發到我本地Macbook Pro的6000端口上以方便開發和測試工做. 目的是解決SSH僅支持TCP的問題html

網絡

圖片描述

其中server_ip爲阿里雲SSH服務器IP地址或域名. 使用時能夠替換爲你本身的服務器IP地址或域名.git

SSH端口轉發須要的工具

SSH服務器, SOCAT工具segmentfault

SSH的TCP端口轉發

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端口轉發

因爲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

相關文章
相關標籤/搜索