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 timeout
  • reuseaddr → 快速重启

否则 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
2
3
iptables -t nat -A PREROUTING \
-p tcp -d 192.168.97.2 --dport 18789 \
-j REDIRECT --to-ports 18789

优势:

  • 内核态转发
  • 无进程开销
  • 延迟更低

拓扑变成:

flowchart LR
Client --> KernelNAT --> Service

没有用户态跳板。