反向端口隧道


59

我明天需要向某人展示在我的本地计算机上运行的网站。通常,我可以通过本地路由器上的端口转发来完成此操作,但是由于硬件故障以及替换问题很糟糕,我当前的路由器不允许我进行端口转发。

因此,我被这个延迟所困扰,不想把整个东西都推到合适的服务器上,我有个疯狂的主意:我可以通过SSH将端口转发到外部服务器吗?

我之前已经做过端口隧道传输,但是我通常会以正确的方式来做:

  • 我连接到远程设备,并要求在本地计算机上的端口12345上显示端口12345。
  • 我在远程计算机上的P12345上启动了一些操作
  • 我可以通过localhost:12345访问它

想做什么:

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

Answers:


96

用于将端口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-machineremote-machine:8000)的公共地址。

如果需要选择不绑定通配符地址上的所有内容,请更改GatewayPorts yesGatewayPorts clientspecified。因为ssh默认情况下绑定到环回地址,所以您需要bind_address为绑定通配符地址指定一个空:

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

如果将设置为,并且您想允许公众访问,则必须使用:之前。8000GatewayPortsclientspecifiedremote-machine:8000

相关手册摘录:

ssh(1)

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

sshd_config(5)

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

也可以看看:


7
GatewayPorts是这里的魔术子弹。我喜欢您已经找到了一个版本,可以让我将这种相当强大的技术限制于某些用户。
奥利

1
让我感到困惑的是,必须在运行实际ssh命令以启动反向隧道(本地)的计算机上设置GatewayPort。在我看来,另一端(远程)处理从何处接受连接是更合乎逻辑的,因为那是您连接到何处并被重定向到的地方。我花了很长时间才解决这个问题。
2014年

2
@ArsMagika我不确定我是否理解你。必须在SSH服务器上而不是在运行ssh命令的本地计算机上设置GatewayPort 。它配置其他客户端是否可以与服务器上的转发端口进行通信。
Lekensteyn 2014年

该解决方案的缺点:您无法在Web服务器的访问日志中确定客户端的IP地址。有什么办法解决这种麻烦吗?
Twonky

@Twonky如果您不需要知道客户端的确切IP地址(只是它是一个远程IP地址而不是“ localhost”),并且您的本地服务器正在侦听通配符地址(即接受来自任何地址的连接),那么您可以尝试转发到-R :8000:127.0.1.1:80(或任何其他127.x.x.x地址)。否则,您将无法学习远程IP地址。
Lekensteyn

14

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.