当前位置: 首页>>技术教程>>正文


反向端口隧道

,

问题描述

我明天需要向我的本地机器显示一个网站。通常我会通过我的本地路由器上的端口转发来实现这一点但是由于硬件故障并且它的替换很糟糕,我当前的路由器不允许我进行端口转发。

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

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

  • 我连接到一个远程盒子并要求端口12345显示在我的本地机器上的端口12345上。

  • 我在远程机器上的P12345上启动了一些东西

  • 我可以通过localhost:12345访问它

我想做的事:

  • 连接到远程PC并要求其本地P12345从我当地的P12345(通过隧道)获取东西

  • 我在P12345上的本地计算机上启动了一些东西

  • 其他人可以访问远程:12345并查看我的localhost:12345

最佳解决思路

将端口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

如果GatewayPorts设置为clientspecified并且您希望允许公共访问remote-machine:8000,则必须在8000之前使用:

相关手册摘录:

ssh(1)

-R [bind_address:]port:host:hostport
Specifies that the given port on the remote (server) host is to be forwarded to the given host and port on the local side. This works by allocating a socket to listen to port on the remote side, and whenever a connection is made to this port, the connection is forwarded over the secure channel, and a connection is made to host port hostport from the local machine. By default, the listening socket on the server will be bound to the loopback interface only. This may be overridden by specifying a bind_address. An empty bind_address, or the address ‘*’, indicates that the remote socket should listen on all interfaces. Specifying a remote bind_address will only succeed if the server’s GatewayPorts option is enabled (see sshd_config(5)).

sshd_config(5)

GatewayPorts
Specifies whether remote hosts are allowed to connect to ports forwarded for the client. GatewayPorts can be used to specify that sshd should allow remote port forwardings to bind to non-loopback addresses, thus allowing other hosts to connect. The argument may be ‘no’ to force remote port forwardings to be available to the local host only, ‘yes’ to force remote port forwardings to bind to the wildcard address, or ‘clientspecified’ to allow the client to select the address to which the forwarding is bound. The default is ‘no’.

也可以看看:

次佳解决思路

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1487.html,未经允许,请勿转载。