反向端口隧道

反向端口隧道

明天我需要向别人展示我本地机器上运行的网站。通常我会通过本地路由器上的端口转发来实现这一点,但由于硬件故障且更换件质量不佳,我当前的路由器不允许我进行端口转发。

因此,由于陷入这种延迟并且不想将整个事情推送到合适的服务器上,我有了一个疯狂的想法:我可以通过 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 yesGatewayPorts clientspecified。由于ssh默认情况下绑定到环回地址,因此您需要指定一个空的bind_address来绑定通配符地址:

ssh -R :8000:localhost:80 oli@remote-machine

如果设置为并且您想允许公众访问 ,则:之前是8000强制性的。GatewayPortsclientspecifiedremote-machine:8000

相关手册摘录:

SSH(1)

-R [bind_address:]port:host:hostport
指定远程(服务器)主机上的给定端口将转发到本地端的给定主机和端口。此方法通过分配套接字来监听远程端的端口,并且每当与此端口建立连接时,连接都会通过安全通道转发,并从本地计算机与主机端口 hostport 建立连接。默认情况下,服务器上的监听套接字将仅绑定到环回接口。这可以通过指定 bind_address 来覆盖。空的 bind_address 或者地址“*”表示远程套接字应该在所有接口上监听。仅当服务器的 GatewayPorts 选项启用时,指定远程 bind_address 才会成功(请参阅 sshd_config(5))。

sshd_配置(5)

GatewayPorts
指定是否允许远程主机连接到为客户端转发的端口。GatewayPorts 可用于指定 sshd 应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。参数可以是“no”,以强制远程端口转发仅适用于本地主机;“yes”以强制远程端口转发绑定到通配符地址;或者“clientspecified”以允许客户端选择转发绑定到的地址。默认值为“否”。

也可以看看:

答案2

如果服务器有,您可以在客户端执行命令后在服务器上GatewayPorts no执行,从而实现相同的效果。这将使服务器上的环回端口 8000 可在端口 8001 上的所有接口上访问。ssh -g -L 8001:localhost:8000 oli@remote-machinessh -R

相关内容