最近買的云上mongo數據庫但是數據庫不支持外網訪問,準備做iptables轉發但是一直不成功,騰訊云官方給予的解釋是受服務器內啟動的docker影響 做iptables轉發會沖突,所以只能另想辦法,我發現使用socat做轉發也很好用,所以記錄一下開源給大家。
socat介紹:
socat
是一個功能強大的多功能網絡工具,它可以在兩個數據流之間建立連接,同時可以轉換它們的特性。它的名字源自于 "SOcket CAT",意味著它可以像 cat
命令一樣,但用于網絡連接。
以下是 socat
的一些主要特點和功能:
-
多協議支持:
socat
支持多種不同的協議,包括 TCP、UDP、IPv4、IPv6、UNIX 套接字等。 -
連接兩個數據流:
socat
可以連接兩個數據流,這兩個數據流可以是文件、套接字、管道等。 -
端口轉發: 你可以使用
socat
在不同的主機之間進行端口轉發,使得網絡服務可以在不同主機之間進行通信。 -
代理和中繼: 你可以使用
socat
作為代理或中繼,將數據流從一個位置轉發到另一個位置,這在網絡調試和故障排除時非常有用。 -
加密和認證:
socat
支持 SSL 和 TLS 加密,以及基本的認證功能,可以確保數據在傳輸過程中的安全性。 -
虛擬串口: 在某些情況下,
socat
還可以創建虛擬串口,模擬物理串口的功能,用于串口通信和調試。
總的來說,socat
是一個非常靈活和強大的工具,可以在網絡和系統管理、開發和調試等方面發揮重要作用。
tcp端口轉發:
注:我在192.168.1.10這臺服務器執行下面的命令讓端口轉發到內網IP:10.106.0.20的6379端口上,執行完下面的命令就可以在訪問192.168.1.10:20001端口就可以轉發到內網IP的6379端口上,也就可以使用外網訪問我們的內網數據庫。
socat TCP4-LISTEN:20001,fork TCP4:10.106.0.20:6379? &
執行完命令我們可以使用netstat -lntp 查看本地是否啟動一個為20001的端口
然后我們使用命令:telnet?10.106.0.20:6379 27017 測試能否連通服務器如下圖表示成功
注:如果是云上服務器記得開啟服務器安全組20001端口,和后端服務器允許服務器192.168.1.10訪問6379端口。
#TCP4-LISTEN表示監聽一個TCP4端口(IPv4),fork表示每個連接都創建一個新進程處理數據流,TCP4:10.106.0.20:6379表示將數據轉發到目標主機B的6379端口。這樣,所有發送到主機A的20001端口的數據流都會被轉發到主機B上的6379端口。會在A主機監聽20001端口,所有訪問A:20001端口的,會返回B:6379的資源。
UDP端口轉發:
除了TCP端口轉發,socat還支持UDP端口轉發。假設有一臺主機A,它的IP地址為192.168.100.10,上面運行著一個DNS服務器,監聽在53端口。現在需要將53端口的UDP數據流轉發到另一臺主機B上的5353端口,可以使用以下命令:
socat UDP4-LISTEN:53,fork UDP4:192.168.100.20:5353? &
其中,UDP4-LISTEN表示監聽一個UDP4端口(IPv4),UDP4:192.168.100.20:5353表示將數據轉發到目標主機B的5353端口。