socat 是什么
socat 是「两个数据通道之间的桥」:把标准输入输出、文件、管道、TCP、UDP、UNIX socket、串口等地址类型两两对接,语法统一成 socat 地址1 地址2。它比 nc 更工程化:可选 fork 支持并发连接、reuseaddr 让重启时不被端口占用卡住、-d -d 打印调试日志,因此适合做常驻的小型端口转发、地址类型桥接和连接测试。要注意它只做字节搬运,不做协议转换——HTTP 流量转到数据库端口,对端依然看不懂。
基本信息
| 适用平台 | GNU/Linux(发行版包 socat),macOS 需自行安装 |
|---|---|
| 语法 | socat [选项] 地址1 地址2 |
| 常用地址 | TCP-LISTEN:端口、TCP:主机:端口、UDP、UNIX-LISTEN、短横线表示标准输入输出 |
| 关键选项 | fork 支持并发,reuseaddr 允许地址重用,-d -d 打调试日志 |
| 常驻托管 | 建议交给 systemd 管理并设置自动重启 |
| 能力边界 | 只做字节搬运,不解析或转换协议 |
典型使用场景
- 把本机端口转发到另一台机器的服务端口,临时做跳板访问。
- 把 UNIX socket 暴露成 TCP 端口,方便远程工具连接本机服务。
- 测试某个端口能否连通:用标准输入直接接到远端端口。
- 临时把开发机服务暴露给同内网的同事联调。
- 桥接不同地址类型,例如把串口数据转成 TCP 流。
常用写法
常用写法
socat TCP-LISTEN:8080,fork,reuseaddr TCP:127.0.0.1:80 # 本机 8080 转到 80
socat TCP-LISTEN:3307,fork TCP:10.0.0.9:3306 # 转发数据库端口
socat - TCP:10.0.0.5:80 # 标准输入接到远端端口
socat UNIX-LISTEN:/tmp/app.sock,fork TCP:127.0.0.1:9000 # unix socket 转 TCP
socat -d -d TCP-LISTEN:8080,fork TCP:127.0.0.1:80 # 打印调试日志
ss -lntp | grep 8080 # 确认监听已建立
pkill -f 'TCP-LISTEN:8080' # 用完立即清理临时转发常用选项对照
| 选项 | 作用 | 使用要点 |
|---|---|---|
| TCP-LISTEN | 监听 TCP 端口 | 不加 fork 只能接一个连接后退出 |
| fork | 每个连接派生子进程 | 常驻转发必须加,否则只能服务一次 |
| reuseaddr | 允许地址重用 | 避免重启时报地址已被占用 |
| -d -d | 打印调试日志 | 连不上时的第一手信息 |
| -v | 打印数据流内容 | 会记录敏感数据,排查完及时清理 |
| 短横线 | 标准输入输出 | 用于一次性的连通性测试 |
不加 fork 时 socat 只服务一个连接,处理完就退出,典型表现是「第一次能用,之后端口没人听」。常驻转发一定写成 fork,reuseaddr 的组合,并交给 systemd 托管自动重启。
socat 不做协议转换:把 HTTP 请求转发到数据库端口只会得到乱码或被直接断开,它只是把字节原样搬运,协议兼容性完全由两端应用决定。
临时转发用完要立即清理,否则端口长期被占用,后续部署正式服务时报端口冲突,排查方向容易跑偏。可以只监听内网地址,减少暴露面。