我正在运行一个程序,该程序绑定防火墙后面的主机(运行 Windows 10)上的特定端口,并且我没有权限直接通过我的网络进行端口转发。相反,我尝试通过 SOCKS 隧道将此连接转发到外部服务器(运行 Debian),以使其可公开访问。
我遇到的问题是,我使用的 SSH 命令在本地绑定端口,导致程序无法正确绑定端口本身并正确启动。(更改程序不是一种选择;它必须绑定。)
我正在通过 SSH 使用以下命令来设置 SOCKS 隧道:
ssh -vg -D 8123 meself@[external IP]
我已经使用以下 curl 验证了这个隧道是否有效,它会转储 Google 的索引页:
curl --socks5 127.0.0.1:8123 http://www.google.com/
此外,netstat 还显示连接处于活动状态:
netstat -t | grep "[external IP]"
TCP [internal IP] [external IP]:ssh ESTABLISHED InHost
我尝试使用 FreeCap 捕获主机上程序的流量,并强制其通过 SOCKS 重定向,但这似乎不起作用。FreeCap 表示代理可以正常工作,但程序仍尝试本地绑定端口 8123。
还值得注意的是,该程序是用 Java 编写的。我在主机上执行该程序的命令是:
java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8123 -jar [program .jar]
在上述条件下,会出现端口 8123 已绑定的错误。
我的最终目标是使我的主机上运行的程序看起来好像可以直接从外部服务器访问,这样当客户端连接到服务器时,他们相信他们直接连接到主机上的程序,并且主机上的程序相信它直接连接到客户端。
我接下来该去哪里?不引入 VPN 可以做到吗?
(注意:我有权通过这种方式绕过防火墙。) (另请注意:我仅选择 8123 作为示例端口。)
答案1
如果我理解你的问题没有错的话,你想在机器 1 上运行一个程序(服务器)。这个程序监听端口 x,由于某些防火墙规则,无法从远程访问该端口。现在你想通过 ssh 隧道绕过防火墙到达机器 2,这样远程客户端就可以连接到机器 2 上的端口 y,然后转发到机器 1 上的端口 x。
为了实现这一点,您需要在机器 2 的端口 y 上建立一个监听套接字,将所有连接转发到机器 1 和端口 x。
要使用 ssh 及其隧道/SOCKS 代理功能执行此操作,您可以使用 -L 选项从机器 2 启动到机器 1 的 ssh 连接:
machine2# ssh -L portY:localhost:portyX user@machine1
或者反过来,使用 -R 选项从机器 1 到机器 2(确保机器 2 上启用了 GatewayPorts):
machine1# ssh -R machine2:portY:localhost:portyX user@machine2
当然,端口 x 和端口 y 也可以相同。我只是为了更清楚起见,做了区分。
有关详细信息,请参阅 ssh 手册页:https://linux.die.net/man/1/ssh