socat 就是 SOcket CAT,可在兩個任意的 addresses之間傳遞資料的工具。address可以是 network socket, file descriptor, TCP/UDP over IPv4/IPv6, pip, readline, stdio .... 。
基本的指令為
socat [options] <bi-address> <bi-address>
提供兩個 address 給 socat,socat 就能將左邊的資料流,對接起來,左邊的 address 輸出資料給右邊,右邊的 address 輸出資料給左邊,是兩個 addresses 之間的資料串接通道。
network service testing
以往通常是用 telnet
指令來測試遠端 service 的 port,現在可用 socat 取代
檢測 service port
# -d[ddd] 增加日誌詳細程度,-dd Prints fatal, error, warning, and notice messages.
socat -dd - TCP:192.168.1.88:3306
# -v 顯示詳細資訊
# -z 不傳送資料,效果為立即關閉連線,快速得出結果
nc -vz 192.168.1.88 3306
# -vv 顯示更詳細的內容
# -w2 timeout 時間設為 2 秒
# 用 nc 做簡單的 port scan
nc -vv -w2 -z 192.168.1.88 20-500
TCP/UDP
在本機啟動監聽的 TCP Port,將 stdin 傳給客戶端,收到的資料傳到 stdout
# 服務端啟動命令,socat/nc
socat TCP-LISTEN:7000 -
# -l --listening
nc -l 7000
# 客戶端連線命令,socat/nc
socat TCP:192.168.1.157:7000 -
nc 192.168.1.157 7000
udp
socat UDP-LISTEN:7000 -
socat UDP:192.168.1.157:7000 -
TLS
ref: Securing Traffic Between two Socat Instances Using SSL
產生 server cert
# 產生 public/private key pair
openssl genrsa -out server.key 2048
# 產生 self signed certicate
openssl req -new -key server.key -x509 -days 3650 -out server.crt
# 產生 pem
cat server.key server.crt > server.pem
chmod 600 server.key server.pem
同樣的方式產生 client certificate
# 產生 public/private key pair
openssl genrsa -out client.key 2048
# 產生 self signed certicate
openssl req -new -key client.key -x509 -days 3650 -out client.crt
# 產生 pem
cat client.key client.crt > client.pem
chmod 600 client.key client.pem
# server side
socat openssl-listen:4433,reuseaddr,cert=server.pem,cafile=client.crt,verify=0 -
# client side
socat - openssl-connect:192.168.1.157:4433,cert=client.pem,cafile=server.crt,verify=0
port redirect
# 將 8080 連接埠重新導向至遠端 80 連接埠(單一連線)
socat TCP-LISTEN:8080 TCP:192.168.1.157:80
# 將 8080 連接埠重新導向至遠端 80 連接埠(同時多條連線)
socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.157:80
# 將 8080 連接埠重新導向至遠端 80 連接埠(以 nobody 權限 fork process)
socat TCP-LISTEN:8080,fork,reuseaddr,su=nobody TCP:192.168.1.157:80
file transfer
如果要將檔案從 A 傳到 B
先在 A
socat -u open:filename tcp-listen:12345
然後到 B
socat -u tcp:192.168.1.157:12345 open:filename,create
# 也可以直接 stdout 重定向
socat -u tcp:192.168.1.157:12345 - > filename
如果用 nc
# 先在接收方啟動 server端
nc -l -p 8080 > filename
# 再在傳送方啟動 client 端傳送資料
nc 192.168.1.157 8080 < filename
web server
socat \
-v -d -d \
TCP-LISTEN:8080,crlf,reuseaddr,fork \
SYSTEM:"
echo HTTP/1.1 200 OK;
echo Content-Type\: text/plain;
echo;
echo \"Server: \$SOCAT_SOCKADDR:\$SOCAT_SOCKPORT\";
echo \"Client: \$SOCAT_PEERADDR:\$SOCAT_PEERPORT\";
"
然後就能直接用 browser 連接 http://localhost:8080/
讀寫分離
#server
socat open:filename\!\!open:log.txt,create,append tcp-listen:12345,reuseaddr,fork
\!\!
是因為 linux 要對 !
做 escape, !!
的左邊是 read,右邊是 write
open:filename 是讀取 filename 檔案內容
open:log.txt 是將收到的資料寫入 log.txt
#client
socat TCP:192.168.1.157:12345 -
可取得 filename 的檔案內容
沒有留言:
張貼留言