socat数据转发管道
把 socat 想成一根“万能数据管道”。只要两端能被表示为“流”(stream),它就能把它们连起来——TCP、UDP、文件、终端、串口、SSL、Unix Socket、管道、甚至执行的程序,都可以互联互通。
一、socat 是什么
socat(SOcket CAT) 是一个双向数据转发工具,用来在两种数据通道之间建立连接。
基本模型只有一句话:
数据源 A <====> socat <====> 数据源 B
你可以把:
- TCP 端口
- UDP 服务
- 文件
- shell 程序
- 串口
- Unix socket
- SSL 通道
- PTY 伪终端
任意组合连接起来。
二、工作流理解
典型转发流程如下:
flowchart LR
A[客户端] -->|连接| B[socat]
B -->|转发数据| C[目标服务]
C -->|返回数据| B
B -->|回传| A
socat 不关心数据内容,只负责“搬运”。
三、典型使用场景
场景1:端口转发(最常见)
把本机端口转发到远端服务。
1 | socat TCP-LISTEN:8080,fork TCP:10.0.0.5:80 |
效果:
访问本机:8080 -> 自动转发到 10.0.0.5:80
用途:
- 临时代理
- 内网服务暴露
- 调试服务
场景2:容器服务端口导出
当容器内部服务只监听 127.0.0.1:
1 | socat TCP-LISTEN:8000,fork TCP:127.0.0.1:8000 |
相当于:
0.0.0.0:8000 -> 127.0.0.1:8000
容器服务立刻可被外部访问。
场景3:内网穿透 / 跳板转发
在跳板机上:
1 | socat TCP-LISTEN:2222,fork TCP:内网机器:22 |
效果:
SSH -> 跳板:2222 -> 内网22
免改 SSH config。
场景4:Unix Socket 转 TCP
很多程序只监听 unix socket:
1 | socat TCP-LISTEN:3307,fork UNIX-CONNECT:/var/run/mysqld.sock |
让 TCP 客户端访问 socket 服务。
四、进阶技巧
常见增强参数:
fork 多连接
reuseaddr 端口复用
keepalive 长连接
timeout 超时控制
组合起来:
1 | socat TCP-LISTEN:8080,reuseaddr,fork TCP:backend:80 |
就是轻量代理。