我正在运行一个程序,它绑定防火墙后面的主机(运行Windows 10)上的特定端口,而且我没有权限直接通过networking进行端口转发。 相反,我试图通过SOCKS隧道通过外部服务器(运行Debian)转发此连接,以便公开访问。
我遇到的问题是,我使用的SSH命令将本地端口绑定,呈现程序无法正确绑定端口本身,并正确启动。 (改变程序不是一个选项,它必须绑定。)
我通过SSH使用以下命令来设置一个SOCKS隧道:
ssh -vg -D 8123 meself@[external IP]
我已经validation了这个隧道使用了下面的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从主机上的程序捕获stream量,并强制它通过SOCKSredirect,但这似乎并没有工作。 FreeCap表示代理function正常,但程序仍尝试本地绑定端口8123。
还值得注意的是,该程序是用Java编写的。 我用来在主机上执行程序的命令是:
java -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=8123 -jar [program .jar]
在上面的条件下,这就吐出了一个端口8123已经绑定的错误。
我的最终目标是使外部服务器可以直接访问我的主机上运行的程序,这样当客户端连接到服务器时,他们相信他们直接连接到主机上的程序,主机上的程序认为它直接连接到客户端。
我从哪里出发? 这可以做到不引入VPN?
(注意:我有权以这种方式绕过防火墙。) (另请注意:我只挑选了8123作为示例端口。)
如果我理解你的问题,你想在机器1上运行一个程序(服务器)。这个程序监听端口x,因为一些防火墙规则,无法从远程访问。 现在,您希望通过ssh隧道将防火墙绕过机器2,远程客户机可以连接到机器2上的端口y,并将其转发到机器1上的端口x。
要存档,需要在端口y上的机器2上监听套接字,将所有连接转发给机器1和端口x。
要使用ssh及其tunneling / SOCKS代理function来执行此操作,您可以使用从机器2到机器1的-L选项启动ssh连接:
machine2# ssh -L portY:localhost:portyX user@machine1
或者从机器1到机器2的-R选项(确保机器2上的GatewayPorts被启用):
machine1# ssh -R machine2:portY:localhost:portyX user@machine2
当然,端口x和端口y也可以是相同的。 我只是把它们区分开来,使之更加清晰。
有关详细信息,请参见ssh手册页面: https : //linux.die.net/man/1/ssh