请考虑以下场景。
- 服务器 A 可以访问 serverX:9000。
- 服务器 A 可以访问 serverB:7000。
- 服务器 B 无法直接访问服务器 A 上的端口。
- 服务器 B 想要访问 serverX:9000,但是没有直接访问权限。
解决这个问题的经典方法是使用 ssh 端口转发。
ssh -R 9000:serverX:9000 serverB -p 7000
假设,我不想在服务器 B 上运行 sshd,也不想在服务器 A 上运行 ssh,而是想在两者上运行未经身份验证的网络实用程序(例如socat
或nc
),并解决相同的问题。
是否可以仅使用 socat/nc 实现远程端口转发,而无需 ssh?
答案1
通过构建 TCP 性别转换器,Socat 可以实现这一点。
在 serverB 上运行一个双监听器,等待 9000 上的连接,然后分叉一个子进程,等待 7000 上的连接,最后转发流量:
socat TCP-LISTEN:9000,reuseaddr,fork TCP-LISTEN:7000,reuseaddr
在服务器 A 上运行双客户端,该客户端不断尝试连接到服务器 B:7000,并在成功后建立到服务器 X:9000 的转发。请注意,这会产生永久网络流量,在防火墙上生成日志,并且未加密:
socat TCP:serverB:7000,forever,interval=1,fork TCP:serverX:9000
连接会延迟转发,您可以通过间隔设置(秒,浮点数)来控制最大等待时间