反向端口隧道

Oli*_*Oli 67 tunnel

明天我需要向某人展示一个在我本地机器上运行的网站。通常我会通过在本地路由器上进行端口转发来实现这一点,但由于硬件故障及其更换很糟糕,我当前的路由器不允许我进行端口转发。

因此,坚持这种延迟并且不想将整个事情推送到合适的服务器上,我有一个疯狂的想法:我可以通过 SSH 将我的端口转发到外部服务器吗?

我以前做过端口隧道,但我通常以正确的方式进行:

  • 我连接到一个远程盒子,并要求端口 12345 显示在我本地机器上的端口 12345 上。
  • 我在远程机器上的 P12345 上启动了一些东西
  • 我可以通过 localhost:12345 访问它

想做什么:

  • 连接到远程 PC 并要求它的本地 P12345 从我的本地 P12345 获取东西(通过隧道)
  • 我在本地计算机上的 P12345 上启动了一些东西
  • 其他人可以访问 remote:12345 并查看我的 localhost:12345

Lek*_*eyn 105

将端口 80 从本地机器 ( localhost)转发到端口 8000 上的远程主机的命令是:

ssh -R 8000:localhost:80 oli@remote-machine
Run Code Online (Sandbox Code Playgroud)

这需要对 SSH 服务器进行额外的调整,将这些行添加到/etc/ssh/sshd_config

Match User oli
   GatewayPorts yes
Run Code Online (Sandbox Code Playgroud)

接下来,通过服务器执行重新加载配置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
Run Code Online (Sandbox Code Playgroud)

:以前8000,如果是强制GatewayPorts设置为clientspecified你希望允许公众访问remote-machine:8000

相关手册摘录:

SSH(1)

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

sshd_config(5)

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

也可以看看:

  • `GatewayPorts` 是这里的灵丹妙药。我喜欢你找到了一个版本,它可以让我将这种相当强大的技术限制在某些用户身上。 (7认同)
  • @ArsMagika 我不确定我是否理解你。GatewayPorts 必须在 SSH 服务器上设置,而不是在运行 `ssh` 命令的本地机器上设置。它配置其他客户端是否可以与服务器上的转发端口通信。 (2认同)

小智 17

如果服务器有GatewayPorts no,则在客户端ssh -g -L 8001:localhost:8000 oli@remote-machine执行ssh -R命令后,您可以通过在服务器上执行来获得相同的结果。这将使服务器上的环回端口 8000 可在端口 8001 上的所有接口上访问。