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:port
  • TCP-LISTEN:port
  • UDP:host:port
  • UDP-LISTEN:port
  • SSL:host:port
  • SSL-LISTEN:port

文件 / 系统

  • FILE:/path/file
  • STDIN
  • STDOUT
  • PIPE
  • PTY(伪终端)
  • 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