Ubuntu 系统 socat 详细介绍与使用教程 - 映射任意两种数据通道

发布时间:2026/6/5 7:58:08

Ubuntu 系统 socat 详细介绍与使用教程 - 映射任意两种数据通道 一、socat 是什么socat的全名是 Socket CAT。它是一个 Linux 网络工具。它的作用是在两个数据流之间建立双向通道让数据在两端之间传输。socat 是 netcat 的增强版。netcat 大家也叫它网络瑞士军刀。和 netcat 相比socat 有这些优点支持的协议多支持 TCP、UDP、IPv6、SSL/TLS、UNIX 套接字、串口、管道、文件等 100 多种地址类型能同时处理多个连接通过fork选项实现还在持续更新netcat 从 2007 年后基本不更新了socat 还在持续开发组合灵活任意两种地址类型之间都能建立通道简单来说socat 就是一个协议转换器它能把任意两种数据通道连在一起。二、在 Ubuntu 上安装 socat2.1 用 APT 安装Ubuntu 的官方软件源里已经包含了 socat。我们直接用 apt 安装就行sudoaptupdatesudoaptinstall-ysocat2.2 检查安装是否成功安装完成后运行下面的命令查看版本信息socat-V如果安装成功会看到类似这样的输出socat version 1.7.4.1 on Jun 4 2026 11:22:332.3 查看帮助socat-h# 查看帮助mansocat# 查看完整手册三、socat 基本语法3.1 命令格式socat[选项]地址1地址2socat 的工作原理很简单它在地址1和地址2之间建立一条双向数据通道。数据从一端进来从另一端出去。两边的地址类型可以是不同的比如一边是 TCP另一边是文件。3.2 常用全局选项选项说明-d增加一级调试输出最多用-d -d-u单向模式数据从地址1流向地址2-U单向模式数据从地址2流向地址1-v显示数据传输的内容-T 秒设置空闲超时时间-t 秒设置超时时间3.3 常用地址类型地址类型格式说明TCP 连接TCP:host:port作为客户端连接远程 TCP 端口TCP 监听TCP-LISTEN:port作为服务端监听 TCP 端口UDP 连接UDP:host:port作为客户端连接远程 UDP 端口UDP 监听UDP-LISTEN:port作为服务端监听 UDP 端口标准输入输出-或STDIO标准输入输出流文件FILE:path读写文件打开文件OPEN:path打开文件执行命令EXEC:cmd执行程序并和它交互ShellSHELL:通过 shell 执行命令SSL 监听OPENSSL-LISTEN:port监听 SSL/TLS 加密端口SSL 连接OPENSSL:host:port连接 SSL/TLS 加密端口UNIX 套接字UNIX-CONNECT:path连接 UNIX 域套接字串口FILE:/dev/ttyUSB0读写串口设备虚拟串口PTY,link/path创建虚拟串口伪终端TUN 设备TUN:ip/mask创建 TUN 隧道接口SOCKS 代理SOCKS:host:port通过 SOCKS 代理连接3.4 常用地址选项选项说明fork为每个连接创建子进程让服务端能同时处理多个连接reuseaddr允许端口复用避免出现 “Address already in use” 错误bindip绑定到指定的网卡 IPrange网段限制只有指定 IP 范围的客户端才能连接retry次数连接失败时的重试次数interval秒两次重试之间的等待时间四、实战教程4.1 回显服务Echo Server这是最简单的例子。我们用 socat 做一个回显服务输入什么它就返回什么。服务端监听 1234 端口socat - TCP-LISTEN:1234,fork客户端连接服务端socat - TCP:127.0.0.1:1234在客户端输入任意文字服务端会把内容原样显示出来。这就是 socat 的基本工作方式两端之间建立通道数据双向流动。4.2 TCP 端口转发这是 socat 最常用的场景。它可以替代 nginx 的 stream 模块来做端口转发。场景把本机的 8080 端口转发到远程服务器 192.168.1.100 的 3306 端口MySQL客户端 → 本机:8080 → socat → 192.168.1.100:3306运行命令socat-dTCP-LISTEN:8080,fork,reuseaddr TCP:192.168.1.100:3306TCP-LISTEN:8080监听本机的 8080 端口fork支持多个客户端同时连接reuseaddr端口复用TCP:192.168.1.100:3306转发目标验证转发是否生效mysql-h127.0.0.1-P8080-uroot-p如果只想监听某一块网卡比如内网网卡 10.0.0.1socat TCP-LISTEN:8080,bind10.0.0.1,fork,reuseaddr TCP:192.168.1.100:3306如果只想让某些 IP 访问只允许 192.168.1.0/24 这个网段socat TCP-LISTEN:8080,fork,reuseaddr,range192.168.1.0/24 TCP:192.168.1.100:33064.3 UDP 端口转发场景把本机 UDP 53 端口转发到内网 DNS 服务器 192.168.1.10:53socat-dUDP-LISTEN:53,fork,reuseaddr UDP:192.168.1.10:53验证dig本机IP www.example.com如果需要指定只用 IPv4把UDP-LISTEN换成UDP4-LISTEN把UDP换成UDP4socat-T5UDP4-LISTEN:53,reuseaddr,fork UDP4:192.168.1.10:53-T5表示空闲 5 秒后自动断开。4.4 文件传输场景两台服务器之间临时传文件不需要 SSH 或 FTP。接收端IP: 10.0.0.5先启动监听把收到的数据写入文件socat-uTCP-LISTEN:9876,reuseaddr OPEN:/tmp/big.iso,create-u单向模式数据从网络流向文件create文件不存在时自动创建发送端读取文件并发送socat-uFILE:/data/big.iso TCP:10.0.0.5:9876文件传完后 socat 会自动退出。查看传输进度# 在接收端实时查看文件大小watch-n1ls -lh /tmp/big.iso4.5 串口远程访问场景通过 TCP 远程访问串口设备比如路由器或树莓派的调试串口。串口主机把/dev/ttyUSB0映射到 TCP 端口 2000socat-d-dTCP-LISTEN:2000,fork,reuseaddr FILE:/dev/ttyUSB0,nonblock1,raw,echo0,b9600参数说明nonblock1非阻塞模式raw原始数据模式不做转换echo0关闭本地回显b9600波特率设为 9600根据的设备修改比如 b115200远程客户端连接串口socat - TCP:串口主机IP:2000连上之后就可以像本地一样操作串口设备了。4.6 虚拟串口场景没有物理串口硬件但是需要测试串口程序。比如在开发一个串口通信程序手边没有设备可以用 socat 创建一对虚拟串口来模拟。socat 使用PTY地址类型来创建虚拟串口。PTY 是 Linux 的伪终端Pseudo Terminalsocat 把它包装成串口设备。创建一对互相连通的虚拟串口socat-d-dPTY,link/tmp/vport0,raw,echo0PTY,link/tmp/vport1,raw,echo0参数说明PTY创建一个伪终端设备link/tmp/vport0创建一个软链接指向真实的 PTY 设备方便程序打开raw原始数据模式不做转换echo0关闭回显否则发送的数据会被原样返回运行后socat 会输出类似这样的信息2026/06/04 12:00:00 socat[12345] N PTY is /dev/pts/2 2026/06/04 12:00:00 socat[12345] N PTY is /dev/pts/3 2026/06/04 12:00:00 socat[12345] N starting data transfer loop with FDs [5,5] and [7,7]这表示两个虚拟串口已经连通了。/tmp/vport0和/tmp/vport1就像一根串口线的两端在一端写入的数据另一端就能读出来。测试虚拟串口打开两个终端窗口。终端 A用 screen 连接 vport0sudoaptinstall-yscreenscreen/tmp/vport0终端 B用 screen 连接 vport1screen/tmp/vport1在终端 A 中输入文字终端 B 中就能看到。反过来也一样。也可以用 Python 或 C 写的串口程序来打开/tmp/vport0和/tmp/vport1进行测试。让虚拟串口在后台运行如果不想占用终端窗口可以加-d -d并把日志重定向然后用放到后台socat-d-dPTY,link/tmp/vport0,raw,echo0PTY,link/tmp/vport1,raw,echo02/var/log/socat-vserial.log把虚拟串口映射到 TCP 端口如果想让远程机器也能访问这个虚拟串口socat-d-dPTY,link/tmp/vport0,raw,echo0TCP-LISTEN:2000,fork,reuseaddr远程机器连接 TCP 2000 端口就等于连上了/tmp/vport0。注意link创建的是软链接指向的是/dev/pts/x这样的真实设备。如果的程序对设备路径有要求比如只接受/dev/ttyUSB*可以把 link 改成对应的路径比如link/dev/ttyUSB99但需要 root 权限。4.7 SSL/TLS 加密隧道场景给一个不支持 HTTPS 的 HTTP 服务加上 SSL 加密。第一步生成自签名证书openssl req-newkeyrsa:2048-nodes-keyoutcert.key\-x509-days365-outcert.crtcatcert.key cert.crtserver.pem第二步启动 SSL 代理socat OPENSSL-LISTEN:8443,fork,reuseaddr,certserver.pem,verify0\TCP:127.0.0.1:80OPENSSL-LISTEN:8443监听 8443 端口启用 SSL/TLScertserver.pem指定证书文件verify0不验证客户端证书仅用于测试TCP:127.0.0.1:80转发到本地 HTTP 服务第三步客户端通过 HTTPS 访问curl-khttps://localhost:8443-k表示跳过证书验证因为自签名证书默认不被信任。如果是非 HTTP 场景可以用 socat 直接连 SSL 端口socat - OPENSSL:127.0.0.1:8443,verify0注意在正式使用时不要用verify0。应该用 CA 签名的证书做双向验证防止中间人攻击。4.8 正向 Shell远程执行命令场景在远程服务器上提供一个交互式 Shell。服务端监听端口把输入交给 bash 执行socat TCP-LISTEN:1234,fork,reuseaddr EXEC:/bin/bash客户端连接后就能执行命令socat - TCP:服务器IP:1234安全提醒这种方式没有任何认证只能用于内网调试。千万不要在公网使用。4.9 提供静态文件下载场景快速让其他人下载一个文件。socat-UTCP-LISTEN:8080,fork,reuseaddr OPEN:/path/to/file.txt-U表示单向模式数据从文件流向网络客户端。客户端连接后就能获取文件内容socat-uTCP:服务器IP:8080 OPEN:downloaded.txt,create4.10 TUN 隧道组网场景通过 TUN 设备把两台机器连到同一个虚拟网络里。服务端socat TCP-LISTEN:1234,fork TUN:192.168.100.1/24,up客户端socat TCP:服务器IP:1234 TUN:192.168.100.2/24,up连上之后两端各自拥有 192.168.100.x 的 IP 地址可以直接互相通信。五、用 systemd 管理 socat 服务如果直接在终端运行 socat终端关了服务就停了。所以我们用 systemd 来管理 socat 进程这样更可靠。5.1 TCP 端口转发服务创建服务文件sudovim/etc/systemd/system/socat-tcp-forward.service写入以下内容[Unit] Descriptionsocat TCP Port Forward Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userroot Grouproot ExecStart/usr/bin/socat -d -d TCP4-LISTEN:8080,reuseaddr,fork TCP4:192.168.1.100:3306 Restartalways RestartSec3 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target5.2 UDP 端口转发服务创建服务文件sudovim/etc/systemd/system/socat-udp-forward.service写入以下内容[Unit] Descriptionsocat UDP Port Forward Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userroot Grouproot ExecStart/usr/bin/socat -d -d -T5 UDP4-LISTEN:53,reuseaddr,fork UDP4:192.168.1.10:53 Restartalways RestartSec3 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target5.3 启动和管理服务# 重新加载 systemd 配置sudosystemctl daemon-reload# 启动服务sudosystemctl start socat-tcp-forward# 设置开机自启sudosystemctlenablesocat-tcp-forward# 查看服务状态sudosystemctl status socat-tcp-forward# 查看服务日志sudojournalctl-usocat-tcp-forward-f# 停止服务sudosystemctl stop socat-tcp-forward# 重启服务sudosystemctl restart socat-tcp-forward六、常用技巧6.1 调试如果遇到问题加上-d -d可以看到详细信息比如连接建立、数据传输、断开等socat-d-dTCP-LISTEN:8080,fork TCP:192.168.1.100:3306把调试日志保存到文件socat-d-dTCP-LISTEN:8080,fork TCP:192.168.1.100:33062/var/log/socat.log6.2 自动重连客户端断线后自动重连socat - TCP:server:8080,retry10,interval2retry10最多重试 10 次interval2每次间隔 2 秒6.3 限制访问来源只允许指定网段访问socat TCP-LISTEN:8080,fork,reuseaddr,range10.0.0.0/8 TCP:192.168.1.100:33066.4 指定 IPv4 或 IPv6有时候TCP-LISTEN可能只监听了 IPv6。如果想明确用 IPv4socat TCP4-LISTEN:8080,fork,reuseaddr TCP4:192.168.1.100:3306如果想明确用 IPv6socat TCP6-LISTEN:8080,fork,reuseaddr TCP6:[::1]:33066.5 查看传输的数据用-v选项可以看到传输的数据内容适合调试socat-v- TCP-LISTEN:8080,fork七、常见问题问题原因解决方法E bind: Address already in use端口被占用加reuseaddr或换端口或用ss -tlnp查看哪个进程占了端口客户端连上后马上断开EOF没加fork服务端加fork选项传大文件中途断开版本太旧或 IPv6 映射问题升级到 1.7.x 以上加pfip4选项串口输出乱码波特率或数据位不匹配指定b115200,raw,echo0连接超时防火墙挡了开放端口sudo ufw allow 8080/tcpSSL 连接失败证书有问题检查证书路径测试时加verify0服务端只接受一个连接缺少fork加fork选项八、socat 和 netcat 的对比特性socatnetcat (nc)协议支持100 多种地址类型只有 TCP/UDPIPv6支持支持有限SSL/TLS原生支持不支持同时处理多个连接fork原生支持需要脚本配合串口通信支持不支持自动重连retry/interval不支持维护状态还在更新基本不更新了九、总结socat 的核心思路很简单在任意两个数据流之间建立双向通道。正因为这个设计足够简单所以它的组合方式非常多。记住这个公式socat [选项] 数据源A 数据源BA 和 B 可以是 TCP、UDP、文件、串口、Shell、SSL……可以任意组合。日常最常用的几个场景端口转发socat TCP-LISTEN:端口,fork TCP:目标IP:目标端口文件传输socat -u FILE:文件 TCP:IP:端口SSL 加壳socat OPENSSL-LISTEN:端口,cert证书,fork TCP:本地端口串口远程socat TCP-LISTEN:端口,fork FILE:/dev/ttyUSB0,raw学会 socat就拥有了一个任意协议、任意方向、可加加密的数据传输工具。参考链接“socat – Multipurpose Relay.”dest-unreach.org, http://www.dest-unreach.org/socat/.“socat(1) - Linux man page.”linux.die.net, https://linux.die.net/man/1/socat.“Ubuntu使用socat进行端口转发.”腾讯云开发者社区, 21 July 2021, https://cloud.tencent.com/developer/article/1850929.“Socat 命令总结.”博客园, 24 Dec. 2024, https://www.cnblogs.com/kqdssheng/p/18628559.“socat命令.”Linux命令手册, https://www.linux-man.cn/command/socat/.“Mastering Socat in Linux.”linuxvox, https://linuxvox.com/blog/socat-linux/.

相关新闻