很多工程师都用过 nc、curl、telnet。但如果你只用过这些工具,那你其实还没有真正掌握 Linux 的数据流世界。在Linux 里有一个工具,可以做到:
TCP ↔ TCP
TCP ↔ UDP
TCP ↔ 文件
TCP ↔ Unix Socket
TCP ↔ 串口
TCP ↔ Shell
TCP ↔ SSL
甚至:
终端 ↔ 网络容器 ↔ 本机设备 ↔ 网络
这个工具就是:socat
很多资深工程师都认为:
socat 是 Linux 网络世界的万能连接器。
一句话总结:
socat = connect anything to anything
如果你掌握了socat,你几乎可以打通Linux的所有数据通道。
一、工程师最常见的 4 个痛点
日常开发中经常遇到这些问题:
场景 1:调试端口
服务启动了:curl不通
你怀疑:
但没有一个工具可以 快速验证数据流。
场景 2:端口转发
例如:
本地8080转发到远程服务器 80
或者:容器端口 → 本地
场景 3:协议转换
例如:
TCP → UDPTCP → UNIX SOCKETSSL → TCP
场景 4:模拟终端或设备
例如:
这些问题其实都属于同一个本质:数据流连接
而 socat 的核心能力就是:连接任意数据流
二、socat 的核心模型
socat 的设计其实非常简单:
Address A <----> Address B
结构:
+------------+ +------------+| Address A | <----> | Address B |+------------+ +------------+ \ / \ / +------------+ | socat | +------------+
Address 可以是:
TCPUDPSTDINFILEPTYUNIX SOCKETOPENSSLEXECSYSTEM
这意味着:
任何IO都可以互联
三、5 分钟上手 socat
安装
Ubuntu
macOS
CentOS
第一个 socat 程序
创建一个 TCP echo server
socat TCP-LISTEN:1234,fork EXEC:/bin/cat
连接:
输入:
输出:
数据流:
client | v+------+| TCP |+------+ | v+------+|socat |+------+ | v/bin/cat
四、30 个工程师最常用 socat 命令
下面这些命令是 生产环境最常见的用法。
一类:端口调试
1 创建 TCP server
socat TCP-LISTEN:8080,fork -
2 TCP client
socat - TCP:example.com:80
手动发送 HTTP:
GET / HTTP/1.1Host: example.com
3 Echo server
socat TCP-LISTEN:2000,fork EXEC:/bin/cat
4 UDP server
socat UDP-LISTEN:9999,fork -
5 UDP client
socat - UDP:127.0.0.1:9999
二类:端口转发
6 本地端口转发
socat TCP-LISTEN:8080,fork TCP:example.com:80
数据流:
client |localhost:8080 | socat |example.com:80
7 HTTPS 转发
socat TCP-LISTEN:8443,fork TCP:example.com:443
8 内网服务暴露
socat TCP-LISTEN:80,fork TCP:127.0.0.1:8080
9 远程端口代理
socat TCP-LISTEN:9000,fork TCP:10.0.0.5:80
三类:文件传输
10 发送文件
socat -u FILE:file.txt TCP:remote:9000
11 接收文件
socat TCP-LISTEN:9000 OPEN:file.txt,creat
12 文件复制
socat FILE:a.txt FILE:b.txt
四类:Unix Socket
13 Unix socket server
socat UNIX-LISTEN:/tmp/test.sock,fork -
14 Unix client
socat - UNIX-CONNECT:/tmp/test.sock
15 TCP ↔ Unix socket
socat TCP-LISTEN:8080,fork UNIX-CONNECT:/tmp/app.sock
架构:
client | TCP 8080 | socat |unix socket | application
五类:SSL
16 SSL client
socat - OPENSSL:example.com:443
17 SSL server
socat OPENSSL-LISTEN:443,cert=server.pem,key=server.key,fork TCP:127.0.0.1:8080
六类:终端模拟
18 创建伪终端
结构:
app1 |pty1 |socat |pty2 |app2
19 TCP ↔ shell
socat TCP-LISTEN:4444,fork EXEC:/bin/bash
20 串口调试
socat - /dev/ttyUSB0,raw,echo=0
七类:调试神器
21 打印数据流
socat -v TCP-LISTEN:8080,fork TCP:example.com:80输出:> GET / HTTP/1.1< HTTP/1.1 200 OK
22 hex dump
socat -x TCP-LISTEN:8080,fork TCP:example.com:80输出:0000 47 45 54 20
八类:容器调试
23 Kubernetes 端口映射
socat TCP-LISTEN:8080,fork TCP:pod-ip:80
24 Docker socket 代理
socat TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock
九类:工程师骚操作
25 创建 HTTP mock
socat TCP-LISTEN:9000,fork SYSTEM:"echo HTTP/1.1 200 OK"
26 临时 API server
socat TCP-LISTEN:8080,fork EXEC:handler.sh
27 流量镜像
socat TCP-LISTEN:8080,fork TCP:server:80
28 临时反向代理
socat TCP-LISTEN:80,fork TCP:internal:8080
29 CLI HTTP 调试
printf "GET / HTTP/1.0\r\n\r\n" | socat - TCP:example.com:80
30 TCP ↔ 程序
socat TCP-LISTEN:9000,fork EXEC:./app
五、socat 为什么这么强
socat 的核心思想其实非常简单:
Linux 世界只有两种东西:
socat 做的事情就是:
read(A)write(B)read(B)write(A)
结构:
+------+ |read A| +------+ | v +-------+ |buffer | +-------+ | v +-------+ |write B| +-------+
反向也是一样。
六、socat vs nc
很多人问:
socat 和 nc 有什么区别?
简单来说:
nc = 简单 socket 工具socat = IO 框架
能力对比:
七、真正的高手如何用 socat
很多高级工程师把 socat 用作:
1 网络调试工具
2 协议转换器
3 端口代理
4 设备模拟
八、Linux IO 的一个核心认知
Linux 有一句经典哲学:
而 socat 背后的哲学是:
因此:
全部都可以 互相连接。
九、总结
如果你是工程师,我强烈建议掌握 3 个工具:
strace 看系统调用tcpdump 看网络包socat 控制数据流
掌握 socat 后,你几乎可以:
连接 Linux 世界的一切 IO
一句话总结:
socat 是 Linux 数据通道的终极连接器。
文章推荐
netcat:你必须会的Linux网络调试工具
lsof如何揭示Linux一切皆文件的终极真相