通过反向 SSH 隧道和 URL 访问本地主机 Web 服务器

通过反向 SSH 隧道和 URL 访问本地主机 Web 服务器

我在本地计算机上运行一个 Web 服务器,LAN 上的所有计算机都可以轻松访问它。我还有一个远程服务器,其公共 IP 地址/URL 指向它 (example.com)。我无法从网络外部访问我的本地服务器,因为我被困在 ISP 的 NAT 后面(他们不会授予任何公共 IP 或端口转发),因此我尝试配置反向 SSH 隧道以授予公共访问权限。

我正在本地服务器上运行以尝试创建隧道。ssh -R 8080:localhost:80 [email protected] -i $SSH_KEY -N

使用远程服务器上的 eLinks,我可以访问 127.0.0.1:8080,并且它可以正确显示本地服务器上的站点。但是,在浏览器中访问 example.com:8080 不会显示任何内容。我尝试使用本地端口转发将传入流量重定向到 127.0.0.1:8080,但不起作用。还有其他想法可以将传入流量从 Web 浏览器重定向到我的 SSH 隧道吗?

答案1

-R 8080:localhost:80通常是不够的。参见man 1 ssh[强调我的]:

-R [bind_address:]port:host:hostport
[…]

指定将到远程(服务器)主机上给定 TCP 端口或 Unix 套接字的连接转发到本地。

[…]

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

127.0.0.1:8080您在服务器上的尝试表明监听套接字已绑定到环回接口。很可能它没有绑定到任何其他接口。

您需要明确指定bind_address或使用*或使用空字符串作为bind_address。带有空的选项bind_address如下所示(请注意前导:):

-R :8080:localhost:80

此外,服务器上的状态也很重要GatewayPorts。从sshd_configman 5 sshd_config

GatewayPorts

指定是否允许远程主机连接到为客户端转发的端口。默认情况下,sshd(8)将远程端口转发绑定到环回地址。这可以防止其他远程主机连接到转发端口。GatewayPorts可用于指定sshd应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。该参数可能是no强制远程端口转发仅对本地主机可用,yes强制远程端口转发绑定到通配符地址,或clientspecified允许客户端选择转发绑定到的地址。默认值为no

要实现您想要的效果,选项不能是no。注意no是默认值,因此未指定GatewayPorts仍然意味着no。 的值yes将使-R 8080:localhost:80像 一样工作-R :8080:localhost:80

GatewayPorts clientspecified针对服务器配置和ssh -R :8080:localhost:80 …客户端提出建议。

更改配置文件后,您需要重新启动 SSH 服务器或以其他方式告诉它重新加载配置。OpenSSHsshd在收到挂断信号 SIGHUP 后会重新读取其配置。


可能的其他问题:

相关内容