不用 防火墙 ( firewall )软件, Linux/Unix 系统能否实现 端口转发 ( port-forwarding )呢? socat ( SOcket CAT )是一个多用途双向数据转接工具,如何在 Linux 系统中安装呢?
socat 功能跟 NetCat 一样,但更安全(支持 chroot ),兼容多种协议, 支持操作 文件 ( file )、 管道 ( pipe )、 设备 ( device )、 TCP 套接字、 Unix 套接字、 SOCKS 客户端、 CONNECT 代理以及 SSL 等等。
典型用途
- TCP 端口转发 ( port forwarding );
- 外部套接字嗅探;
- 攻击弱防火墙(安全测试);
- Unix 套接字的 shell 操作接口;
- IPv6 转接;
- 安全测试和研究;
安装
Debian/Ubuntu 下,只需执行 apt 命令:
|
|
以下示例命令可能在你的电脑上 开端口 或者通过 套接字 连接其他互联网用户。 使用这个工具必须有 TCP/IP 和 Unix 网络方面的知识。
端口转发
将 80 端口转发到 202.54.1.5 :
|
|
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 作为 socat 和 ssh 的通讯方式,将它作为 ssh 的控制 tty ( ctty ),也作为新进程组所有者( setsid ), 这样 ssh 可以从 socat 获取密码。
|
|
访问Unix套接字
Unix 套接字是非常常见的本地通讯方式,但是能够操作这类套接字的工具命令不多, socat 是其中一个。 下面这个例子,通过 HAProxy 的 Unix 套接字,获取其运行信息,包含 PID 、启动时间等:
|
|
高级端口转发
|
|
这个例子在 accept() 系统调用 后 fork 子进程进行处理,因此可同时处理多个并发连接。 安全性方面也有所提高: fork 后 su 到 nobody 用户,避免权限泄露; 只允许来自 10.0.0.0/8 网段的连接。 由于设置了 reuseaddr ,就算子进程套接字还没有完全关闭,主进程退出即可重启。 由于指定 -lmlocal2 选项, accept 循环前日志将输出到 stderr ,之后以 local2 为标识转发到 syslog 。
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: