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

就是轻量代理。