现在假设有主机local_A, 主机remote_B, remote_B可以被外界访问,而local_A不行。
这种情况下,我们可以通过ssh的远端端口转发的功能,来实现外界访问local_A的特定端口。在local_A上执行下面的命令为向外界暴露local_A的80端口,
ssh -f -N -R 8080:localhost:80 zwl@remote_B
-f
表示在backgroud运行,-N
表示只做隧道建立的连接,并不登录交互式bash,-R
后面的参数表示当有访问remote_B的8080端口的时候,信息转给local_A, localA发给他看到的localhost:80
端口。理论上,到这里我们在任意的一个可以连接remote_B的浏览器上输入,http://remote_B:8080/
即可连接到local_A上的80端口,并显示其中的网页。但一顿操作猛如虎,看到的却是无法连接。
这里说一下排查问题的过程。
sudo lsof -i TCP:8080
看到的是localhost:8080
端口被使用。问题就出在这,这里应该显示被使用的端口是*:8080
,前者表示你仅仅能在remote_B上连接这个端口,即local_A。
查过之后,发现解决方案是:需要配置remote_B上的/etc/ssh/sshd_config
中的GatewayPorts yes
。修改后重启sshd,问题解决。