我对此还很陌生。但我有两台设备,都运行 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
远程服务器上没有安装,您可以将其安装到您的主目录中。