寻找一种通过SOCKS端口转发端口绑定应用程序的方法

我正在运行一个程序,它绑定防火墙后面的主机(运行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