用socat转发端口

socatSOcket CAT )是一个多用途双向套接字数据转接工具。

socatNetCat 类似,但功能更强大,也更安全(支持 chroot )。它兼容多种协议,支持操作 文件 ( file )、 管道 ( pipe )、 设备 ( device )、 TCP 套接字、 Unix 套接字、 SOCKS 客户端、 CONNECT 代理以及 SSL 等等。

安装

Linux

Linux 系统,使用包管理器进行安装,以 Debian/Ubuntu 为例:

1
apt update && apt install socat

OSX

OSX 系统,使用装包神器 brew 进行安装:

1
brew update && brew install socat

端口转发

TCP

监听本地 80 端口,并将请求转发(代理)到 10.0.0.1:8080 上:

1
socat TCP-LISTEN:80,reuseaddr,fork TCP:10.0.0.1:8080

UDP

监听本地 53 端口,并将请求转发(代理)到 10.0.0.1:5353 上:

1
socat UDP-LISTEN:53,reuseaddr,fork UDP:10.0.0.1:5353

SSL

socat 支持 SSL ,用来解除证书认证非常有用。这个例子在本地监听 143 端口,然后转发到带 SSL 加密服务器 993 端口。这样就可以使用不支持 SSL 的客户端,跟 SSL 服务进行通信:

1
socat tcp-listen:143,fork openssl:imap.qq.com:993,verify=1

当初帮一个读者调试作业,需要解析 IMAP 协议,以为主流邮箱应该都强制 SSH 了。但其实没有,143 端口还是开放的。

文件转发

这个例子监听本地 55555 端口,当有客户端连接上来,就把指定文件发过去:

1
socat TCP-LISTEN:55555,reuseaddr,fork /path/to/file

还可以结合特殊的设备文件,比如 /dev/null ,得到一个只会关闭连接的 TCP 服务器:

1
socat TCP-LISTEN:55555,reuseaddr,fork /dev/null

这个例子通常没啥意义。有一次在调试客户端时,需要验证服务器不按套路出牌,意外关闭连接的场景,就相当用 socat 来实现这个行为。觉得挺有意思的,就记下来。

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: