我在本地计算机上运行一个 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_config
man 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 后会重新读取其配置。
可能的其他问题:
- 服务器上的防火墙可能会阻止
8080
来自互联网的端口连接。 - 本地 HTTP 服务器可能会拒绝使用
example.com
(比较为什么原始站点可以运行,但端口转发到同一站点却失败?)。