socat四层转发
socat转发解读
命令是在做 TCP 四层转发(L4 proxy):
socat TCP-LISTEN:18789,bind=192.168.97.2,fork TCP:127.0.0.1:18789
拆开看:
TCP-LISTEN:18789→ 监听端口bind=192.168.97.2→ 只绑定该 IP(非常关键)fork→ 每个连接派生子进程TCP:127.0.0.1:18789→ 转发到本机 loopback
逻辑拓扑:
flowchart LR Client --> A[192.168.97.2:18789] A --> B[socat] B --> C[127.0.0.1:18789] C --> D[real service]
本质是:
给 “只监听 localhost 的服务” 加一个对外入口。
优化版本
socat -T 30 TCP-LISTEN:18789,bind=192.168.97.2,reuseaddr,fork TCP:127.0.0.1:18789
增加:
-T 30→ idle timeoutreuseaddr→ 快速重启
否则 TIME_WAIT 会教你做人。
使用场景
1.服务错误绑定
例如:
listen 127.0.0.1
但你又:
- 不方便改配置
- 或程序写死
于是 socat 成了“热补丁”。
2.Docker/namespace绕行
比如:
- 容器监听 127.0.0.1
- host 想访问
socat 可以打洞。
隐藏风险
1.fork = 高并发炸弹
每个连接一个进程:
10000 connections
≈ 10000 processes
如果:
- 遭遇 CC 攻击
- 或扫描
直接拖垮宿主机
4.更现代的替代方案(强烈建议)
2.建议直接改服务监听
0.0.0.0
永远是第一选择。
3.iptables/nft NAT(性能更高)
1 | iptables -t nat -A PREROUTING \ |
优势:
- 内核态转发
- 无进程开销
- 延迟更低
拓扑变成:
flowchart LR Client --> KernelNAT --> Service
没有用户态跳板。