明天我需要向别人展示我本地机器上运行的网站。通常我会通过本地路由器上的端口转发来实现这一点,但由于硬件故障且更换件质量不佳,我当前的路由器不允许我进行端口转发。
因此,由于陷入这种延迟并且不想将整个事情推送到合适的服务器上,我有了一个疯狂的想法:我可以通过 SSH 将我的端口转发到外部服务器吗?
我以前做过端口隧道,但我通常以正确的方式进行:
- 我连接到一个远程盒子并要求端口 12345 显示在我的本地机器的端口 12345 上。
- 我在远程机器上的 P12345 上启动了一些操作
- 我可以通过 localhost:12345 访问它
我想去做:
- 连接到远程 PC 并要求它是本地 P12345 从我的本地 P12345 获取东西(通过隧道)
- 我在 P12345 上的本地计算机上启动了一些操作
- 其他人可以访问 remote:12345 并查看我的 localhost:12345
答案1
将端口 80 从本地计算机(localhost
)转发到端口 8000 的远程主机的命令是:
ssh -R 8000:localhost:80 oli@remote-machine
这需要在 SSH 服务器进行额外的调整,添加以下行/etc/ssh/sshd_config
:
Match User oli
GatewayPorts yes
接下来通过服务器执行重新加载配置sudo reload ssh
。
该设置GatewayPorts yes
导致 SSH 在通配符地址上绑定端口 8000,因此它可供remote-machine
( remote-machine:8000
) 的公共地址使用。
如果您需要有不将所有内容绑定到通配符地址的选项,请更改GatewayPorts yes
为GatewayPorts clientspecified
。由于ssh
默认情况下绑定到环回地址,因此您需要指定一个空的bind_address
来绑定通配符地址:
ssh -R :8000:localhost:80 oli@remote-machine
如果设置为并且您想允许公众访问 ,则:
之前是8000
强制性的。GatewayPorts
clientspecified
remote-machine:8000
相关手册摘录:
-R [bind_address:]port:host:hostport
指定远程(服务器)主机上的给定端口将转发到本地端的给定主机和端口。此方法通过分配套接字来监听远程端的端口,并且每当与此端口建立连接时,连接都会通过安全通道转发,并从本地计算机与主机端口 hostport 建立连接。默认情况下,服务器上的监听套接字将仅绑定到环回接口。这可以通过指定 bind_address 来覆盖。空的 bind_address 或者地址“*”表示远程套接字应该在所有接口上监听。仅当服务器的 GatewayPorts 选项启用时,指定远程 bind_address 才会成功(请参阅 sshd_config(5))。
GatewayPorts
指定是否允许远程主机连接到为客户端转发的端口。GatewayPorts 可用于指定 sshd 应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。参数可以是“no”,以强制远程端口转发仅适用于本地主机;“yes”以强制远程端口转发绑定到通配符地址;或者“clientspecified”以允许客户端选择转发绑定到的地址。默认值为“否”。
也可以看看:
答案2
如果服务器有,您可以在客户端执行命令后在服务器上GatewayPorts no
执行,从而实现相同的效果。这将使服务器上的环回端口 8000 可在端口 8001 上的所有接口上访问。ssh -g -L 8001:localhost:8000 oli@remote-machine
ssh -R