socat:Linux/Unix下的TCP端口转发器

不用 防火墙 ( firewall )软件, Linux/Unix 系统能否实现 端口转发 ( port-forwarding )呢? socat ( SOcket CAT )是一个多用途双向数据转接工具,如何在 Linux 系统中安装呢?

socat 功能跟 NetCat 一样,但更安全(支持 chroot ),兼容多种协议, 支持操作 文件 ( file )、 管道 ( pipe )、 设备 ( device )、 TCP 套接字、 Unix 套接字、 SOCKS 客户端、 CONNECT 代理以及 SSL 等等。

本文译自:socat: Linux/UNIX TCP Port Forwarder

典型用途

  1. TCP 端口转发 ( port forwarding );
  2. 外部套接字嗅探;
  3. 攻击弱防火墙(安全测试);
  4. Unix 套接字的 shell 操作接口;
  5. IPv6 转接;
  6. 安全测试和研究;

安装

Debian/Ubuntu 下,只需执行 apt 命令:

1
sudo apt update && sudo apt install socat

以下示例命令可能在你的电脑上 开端口 或者通过 套接字 连接其他互联网用户。 使用这个工具必须有 TCP/IPUnix 网络方面的知识。

端口转发

80 端口转发到 202.54.1.5

1
socat TCP-LISTEN:80,fork TCP:202.54.1.5:80

TCP-LISTEN:80 表示监听本地 80 端口; fork 表示创建子进程处理新连接; TCP:202.54.1.5:80 表示将新连接转发到 202.54.1.5:80

经过以上命令,所有到 80 端口的 TCP 连接将被转发到 202.54.1.5 ,效果跟 netcat 一样。

连接SSH服务器

你可以连接远程 SSH 服务器( server1 ),使用 pty 作为 socatssh 的通讯方式,将它作为 ssh 的控制 tty ( ctty ),也作为新进程组所有者( setsid ), 这样 ssh 可以从 socat 获取密码。

1
2
(sleep 5; echo YOURSSHPASSWORDHERE; sleep 5; echo date; sleep 1) | \
socat - EXEC:'ssh -l userName server1.nixcraft.net.in',pty,setsid,ctty

访问Unix套接字

Unix 套接字是非常常见的本地通讯方式,但是能够操作这类套接字的工具命令不多, socat 是其中一个。 下面这个例子,通过 HAProxyUnix 套接字,获取其运行信息,包含 PID 、启动时间等:

1
echo "show info" | socat unix-connect:/var/tmp/haproxy stdio

高级端口转发

1
2
3
socat -d -d -lmlocal2 \
TCP4-LISTEN:80,bind=myaddr1,su=nobody,fork,range=10.0.0.0/8,reuseaddr \
TCP4:www.nixcraft.net.in:80,bind=myaddr2

这个例子在 accept() 系统调用 后 fork 子进程进行处理,因此可同时处理多个并发连接。 安全性方面也有所提高: forksunobody 用户,避免权限泄露; 只允许来自 10.0.0.0/8 网段的连接。 由于设置了 reuseaddr ,就算子进程套接字还没有完全关闭,主进程退出即可重启。 由于指定 -lmlocal2 选项, accept 循环前日志将输出到 stderr ,之后以 local2 为标识转发到 syslog

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

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