我有这个端口转发解决方案用于测试目的。有一个远程服务器名为盒子和一台名为塔,在两个独立的网络上。盒子可以通过互联网访问。
在塔,我运行以下命令:
ssh -R 80:localhost:80 box.sleblanc
这连接到盒子并在端口 80 上设置一个套接字,该套接字将访问 Web 服务塔,端口 80。当与盒数:80,我发现日志中的 Web 服务似乎来自127.0.0.1。我觉得这很烦人,因为我无法可靠地区分合法来自本地主机的连接和来自代理的连接。
通过将BindAddress
选项设置为不同的东西(例如192.168.0.100)与代理的连接实际上显示为该地址,这解决了我的问题,但它强制我的服务在本地主机以外的网络地址上运行。
我发现运行curl --interface 127.0.0.2 localhost:80
会产生来自 IP 地址的请求127.0.0.2
,这满足了我能够区分合法本地请求与代理请求的要求,但是,当设置BindAddress
为127.0.0.2, SSH 无法再到达盒子,作为127.0.0.0/8网络不可路由。
最终,我的问题是:如何将 SSH 客户端绑定到多个不同的地址,以便客户端可以连接到 Internet 主机,而远程端口重定向将来自除127.0.0.1?即严格将远程转发端口的连接绑定到本地地址127.0.0.2?
玩弄索卡特,我发现了这个解决方案:
% socat TCP4-Listen:1234,fork TCP:127.0.0.1:80,bind=127.0.0.2 &
% ssh -R 80:127.0.0.1:1234 box.sleblanc
这会设置一个套接字,侦听端口 1234 上的传入连接,并通过绑定到本地地址将它们转发到 127.0.0.1:80127.0.0.2。它完全按照预期工作,但我想知道是否有一种方法可以将其简化为 SSH 命令。