socat 的核心是双向流管道而非简单端口转发;常见断连因缺 fork 或后端不支持 keep-alive,需加 tcp-nodelay/keepalive 等选项;IPv4/IPv6 需显式指定;SSH 跳转可结合 EXEC 或 ProxyCommand;相比 nc 和 iptables,socat 支持协议转换、TLS、日志及 hexdump 调试。

socat 是 Linux 下最灵活的网络工具之一,但直接套用常见命令容易失败——关键在于理解它“双向流管道”的本质,而不是当成简单的端口转发器。
为什么 socat 转发后连接立刻断开?
典型现象:执行 socat TCP4-LISTEN:8080,fork TCP4:192.168.1.100:80 后,curl 一次就断,后续请求全失败。
-
fork必须加,否则监听进程只处理一个连接就退出 - 若目标服务(如 nginx)不支持 keep-alive 或主动关闭连接,
socat会同步关闭本端;可加tcp-nodelay,keepalive,keepidle=60,keepintvl=30缓解 - IPv4/IPv6 混用易出错:明确写
TCP4或TCP6,别依赖系统默认解析
如何把本地端口映射到远程服务器的内网服务?
场景:你本地没权限改防火墙,但能 SSH 到跳板机,想访问跳板机后方的数据库(10.0.2.5:3306)。
- 在本地运行:
socat TCP4-LISTEN:3307,fork,reuseaddr TCP4:jump-host-ip:22 - 再配 SSH 端口转发:
ssh -L 3308:10.0.2.5:3306 user@jump-host-ip -p 3307(注意端口错开) - 更简洁方案(单条命令):
socat TCP4-LISTEN:3307,fork "EXEC:sshs -W 10.0.2.5:3306 user@jump-host-ip",前提是跳板机装了sshs或用ssh -o ProxyCommand="..."嵌套
socat 和 nc / iptables 的核心区别在哪?
不是功能多寡问题,而是数据流向控制粒度:
-
nc是单次管道,无状态,不能自动重连或 fork 子进程 -
iptables工作在内核态,只能做地址/端口转换,无法修改协议、加 TLS、注入头信息 -
socat每个地址对(address pair)都是独立流处理器,支持OPENSSL、EXEC、PTY、FILE等几十种地址类型,比如:socat OPENSSL:api.example.com:443,verify=0 TCP4:localhost:8080可透传 HTTPS 流量并忽略证书校验
调试时怎么看到实际传输的数据?
别用 tcpdump 抓包反推——socat 自带 hexdump 和日志能力:
- 加
system:"hexdump -C"查看原始字节:socat -v TCP4-LISTEN:8080,fork SYSTEM:"hexdump -C | head -20" - 记录完整会话:
socat -lf /tmp/socat.log TCP4-LISTEN:8080,fork TCP4:backend:80,日志里每行带时间戳和方向标识(>>表示流入,表示流出) - 注意:开启
-v或-d会显著降低吞吐,生产环境禁用
真正难的不是写对一条命令,而是意识到 socat 的每个地址参数都自带缓冲、超时、重试、加密等隐式行为——漏掉一个 fork 或写错 TCP4 大小写,整条链路就静默失败。

















