From:https://blog.catcatarb.com/socat-ipv4-ipv6-port/
socat是一個非常強大的多功能命令列工具,它能夠建立幾乎任何類型的連接,包括資料轉送、端口轉發、管道、套接字轉換等。socat可以用於實現IPv4 到IPv6(或反之)的端口轉發。

socat是一個非常強大的多功能命令列工具,它能夠建立幾乎任何類型的連接,包括資料轉送、端口轉發、管道、套接字轉換等。socat可以用於實現IPv4 到IPv6(或反之)的端口轉發,但要注意,它並不會直接實作NAT64 類型的網路位址轉換。
以下是使用socat來實現簡單的IPv4 到IPv6 端口轉發的範例:
安裝
|
1 |
apt install socat |
基本指令格式
socat的基本指令格式為:
|
1 |
socat [options] <address1> <address2> |
IPv4 到IPv6 端口轉發範例
假設你想要將本機IPv4 位址上的端口轉發到遠端IPv6 位址的端口。可以使用以下命令:
|
1 |
socat TCP4-LISTEN:<local-port>,fork TCP6:[<ipv6-addr>]:<remote-port> |
其中:
TCP4-LISTEN:<local-port>:監聽本地IPv4 位址上的指定端口。fork選項允許socat處理多個連線。TCP6:[<ipv6-addr>]:<remote-port>:指定遠端的IPv6 位址和端口。
範例1
例如,如果你想要將本地的8080 端口轉送到IPv6 位址2001:0db8:85a3:0000:0000:8a2e:0370:7334的80 端口,你可以這樣做:
|
1 |
socat TCP4-LISTEN:8080,fork TCP6:[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80 |
範例2
如果您需要同時使用socat進行TCP 和UDP 的端口轉發,您將需要執行兩個單獨的socat命令,因為每個socat實例只能處理一種類型的協定。假設您想要將本機的TCP 和UDP 端口8080 都轉送到IPv6 位址2001:0db8:85a3:0000:0000:8a2e:0370:7334上的端口80,您可以使用以下兩個指令:
TCP 轉發
|
1 |
socat TCP4-LISTEN:8080,fork TCP6:[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80 |
UDP 轉發
|
1 |
socat UDP4-LISTEN:8080,fork UDP6:[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80 |
注意事項
- 確保
socat安裝在你的系統上。可透過套件管理器(如apt或yum)安裝。 socat的使用可能需要一定的網路知識,特別是在理解網路位址和端口的映射方面。- 確保任何防火牆或安全策略允許這種類型的連線。
socat是一個非常靈活的工具,可以用於各種複雜的網路操作。根據你的具體需求,你可能需要調整指令參數來適應你的環境。
進階篇1:
使用Systemd 服務
如果你的系統使用systemd作為其初始化系統和服務管理器,你可以建立一個systemd服務檔案來管理socat。
- 建立Systemd 服務檔案: 例如,在
/etc/systemd/system/socat.service中建立以下內容:
|
1 2 3 4 5 6 7 8 9 |
[Unit] Description=Socat Service [Service] ExecStart=/usr/bin/socat TCP4-LISTEN:8080,fork TCP6:[2001:db8:85a3::8a2e:370:7334]:80 Restart=on-failure [Install] WantedBy=multi-user.target |
啟動和停止服務:
- 啟動服務:
sudo systemctl start socat.service - 停止服務:
sudo systemctl stop socat.service
進階篇2:
使用腳本和後台進程
- 建立一個控制腳本: 可以寫一個腳本來啟動和停止
socat。這個腳本可以儲存socat進程的PID 到一個檔案中,然後使用這個PID 來停止進程。例如,建立一個名為socat_control.sh的腳本,內容如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/bin/bash PIDFILE="/tmp/socat.pid" start() { socat TCP4-LISTEN:8080,fork TCP6:[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:80 & echo $! > "$PIDFILE" } stop() { if [ -f "$PIDFILE" ]; then kill $(cat "$PIDFILE") rm -f "$PIDFILE" else echo "Socat is not running." fi } case "$1" in start) start ;; stop) stop ;; *) echo "Usage: $0 {start|stop}" exit 1 esac |
- 使腳本可執行: 透過執行以下命令使腳本可執行:
|
1 |
chmod +x socat_control.sh |
- 使用腳本:
- 要啟動
socat,運行:./socat_control.sh start - 要停止
socat,運行:./socat_control.sh stop
進階篇3:
創建腳本來同時進行 TCP 和 UDP 的端口轉發
創建包裝腳本
- 創建一個新腳本:
|
1 |
sudo nano /usr/local/bin/socat_wrapper.sh |
- 在腳本中添加內容:
|
1 2 3 4 |
#!/bin/bash /usr/bin/socat TCP4-LISTEN:您的本地TCP端口,fork TCP6:[您的IPv6地址]:您的远程TCP端口 & /usr/bin/socat UDP4-LISTEN:您的本地UDP端口,fork UDP6:[您的IPv6地址]:您的远程UDP端口 & wait |
- 使腳本可執行:
|
1 |
sudo chmod +x /usr/local/bin/socat_wrapper.sh |
創建 systemd 服務文件
- 創建服務文件:
|
1 |
sudo nano /etc/systemd/system/socat_combined.service |
- 添加以下內容:
|
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description=Socat Combined Port Forwarding Service [Service] ExecStart=/usr/local/bin/socat_wrapper.sh Restart=always RestartSec=3 [Install] WantedBy=multi-user.target |
管理服務
啟動:sudo systemctl start socat_combined.service
暫停:sudo systemctl stop socat_combined.service
設置開機自啟:sudo systemctl enable socat_combined.service
檢查狀態:sudo systemctl status socat_combined.service
