如何将本地服务导出到有公共域的服务器?

如何将本地服务导出到有公共域的服务器?

我对此还很陌生。但我有两台设备,都运行 Debian。一台是学校服务器(具有公共域),我没有 root 访问权限。第二台是带有桥接适配器到本地网络的虚拟机。在 上运行 nginx 网站localhost:80。我想从 访问该网站public_domain.com:8080

当我尝试将端口转发到服务器时。我发现未GatewayForwarding启用,并且我没有权限更改它。我尝试了:

ssh -R 8080:localhost:80 -g name@server -N 
ssh -R 0.0.0.0:8080:localhost:80 -g name@server -N

当我在服务器上使用 netstat 时,我得到了返回列Local address 127.0.0.1:8080 并且 curl localhost:8080 工作正常,但是当我尝试执行此操作时,public_domain.com:8080我得到了空的响应。

还有其他方法可以实现将本地服务“导出”到公共领域吗?

答案1

如果输出netstat显示类似这样的内容...

tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN

...那么你就找到了问题所在;绑定到本地主机地址 ( ) 的套接字127.0.0.1无法从本地系统以外的任何地方访问。根据sshd手册页:

默认情况下,服务器上的 TCP 侦听套接字将仅绑定到环回接口。这可以通过指定 bind_address 来覆盖。空的 bind_address 或 address*表示远程套接字应侦听所有接口。仅当服务器的 GatewayPorts 选项启用时,指定远程 bind_address 才会成功(请参阅 sshd_config(5))。

我强调了关键点:除非GatewayPorts在遥控器中启用服务器配置,您的转发端口将始终绑定到localhost


当然,您可以通过在服务器上运行一个简单的 tcp 代理来轻松解决这个问题,该代理会监听<the public address>:8080并将连接转发到127.0.0.1:8080。例如,使用socat

socat tcp-listen:8080,fork,bind=1.2.3.4 tcp:localhost:8080

(替换1.2.3.4为远程主机的公共地址。)

您可以将代理命令作为ssh命令的一部分执行:

ssh -R 8080:localhost:80 -g name@server \
  socat tcp-listen:8080,fork,bind=1.2.3.4 tcp:localhost:8080

如果socat远程服务器上没有安装,您可以将其安装到您的主目录中。

相关内容