socat概述
Socat(SOcket CAT)可以理解为 “瑞士军刀级别的网络管道工具”。它的核心思想非常优雅:把两个“数据端点(address)”连接起来,让数据在它们之间双向流动。端点既可以是 TCP/UDP socket,也可以是文件、TTY、PIPE、Unix Socket,甚至是 SSL、PTY。
一句话总结:
Socat = 任意 I/O ↔ 任意 I/O 的双向桥接器
Socat 的定位
netcat(nc)的 超集
既是调试工具,也是生产可用的 协议/端口/通道转发器
在 DevOps / SRE 场景中,常用于:
- 端口转发
- 本地调试
- 容器 / K8s 网络绕行
- Unix Socket ↔ TCP 转换
- TLS/明文“翻译官”
基本语法
1 | socat [options] <address1> <address2> |
- address1:数据源
- address2:数据目的地
- 数据是 双向的(full-duplex)
数据流抽象模型
flowchart LR
A[Address 1
TCP / FILE / UNIX / STDIN] <-->|双向数据流| B[Address 2
TCP / PTY / PIPE / SSL]
Socat 不关心“协议语义”,它只负责 字节流的搬运。
常见 Address 类型
网络相关
TCP:host:portTCP-LISTEN:portUDP:host:portUDP-LISTEN:portSSL:host:portSSL-LISTEN:port
文件 / 系统
FILE:/path/fileSTDINSTDOUTPIPEPTY(伪终端)UNIX:/path/socket
常用命令示例
TCP 端口转发(最常见)
1 | socat TCP-LISTEN:8080,fork,reuseaddr TCP:127.0.0.1:80 |
含义:
- 本地监听 8080
- 每个连接 fork 一个进程
- 转发到 127.0.0.1:80
Unix Socket ↔ TCP 转换(数据库/容器必备)
1 | socat TCP-LISTEN:3307,fork UNIX:/var/run/mysqld/mysqld.sock |
用途:
- 把 MySQL 的 unix socket 暴露成 TCP
- 对调试容器、跨 namespace 访问非常友好
反向端口转发(穿透防火墙)
1 | socat TCP:公网IP:9000 TCP:127.0.0.1:22 |
典型用途:
- 内网机器无公网 IP
- 主动连出,把 SSH 暴露出去
进阶fork、reuseaddr 等关键参数
fork(生产必开)
1 | fork |
- 每个连接一个子进程
- 不然只接受一次连接就退出
reuseaddr
1 | reuseaddr |
- 端口 TIME_WAIT 可复用
- 高频重启必备
完整示例
1 | socat TCP-LISTEN:8080,reuseaddr,fork TCP:10.0.0.10:80 |