使用SSH连接不能通过公网访问的机器
众所周知,如果给定一个公网IP,我们只需要接入互联网即可访问;那么如果我想访问不处于公网、且不在同一局域网下的机器,可以做到吗?可能直觉告诉我们,不行。但是这里想说的是,可以,且只需要一条ssh命令即可。场景通俗点描述为:A不能访问B,但是A能连接到外网,并且B也能访问外网,即A、B可以同时连接上公
众所周知,如果给定一个公网IP,我们只需要接入互联网即可访问;那么如果我想访问不处于公网、且不在同一局域网下的机器,可以做到吗?可能直觉告诉我们,不行。但是这里想说的是,可以,且只需要一条ssh命令即可。
场景

通俗点描述为:A不能访问B,但是A能连接到外网,并且B也能访问外网,即A、B可以同时连接上公网主机。
认识ssh的端口转发
对于这个命令,我们用的最多的可能就是用它来连服务器,然后看服务器的log。对于此文章相关的主题,我相信,知道ssh可以实现的并不多。在这里分享这部分内容的同时,也将自己的理解记录下来。
远程端口转发
既然A能连通公网主机,那么A肯定能与公网主机建立ssh连接。所以我们可以先在B上运行下面的命令,命令的意思为,在ec2-ip.ap-northeast-1.compute.amazonaws.com上以ubuntu身份登录,然后将2222端口的数据,转发到B,然后B再将数据转发到localhost:22。其中这个localhost:22的意思为是,localhost的22端口,当然这个localhost可以为127.0.0.1,也可以为任何B可以访问到的ip,至于这个22端口,可以更具需要,改变成相应的端口也是没问题的。
ssh -R 2222:localhost:22 [email protected] -Nf
然后我们在A上,连接上公网主机,如下:

然后再执行:
ssh -p 2222 feiyu@localhost
这句命令是在公网主机上执行的,所以localhost也就是公网主机本身,而2222端口,就是上一条命令中的2222端口,因为公网主机的2222端口,会把数据都转发到B的22端口上去。而这个feiyu就是B机器上的某个用户。
整个流程即如上所示。
本地端口转发
如果A想访问C,但是不能访问,此时B可以访问C并且A能访问B,即条件如下: A->B B->C 此时A应当也能连通到C。好像传递性啊。然后这条命令就是ssh -L。详细如下:
ssh -L 2121:C:21 B
就是A指定SSH绑定本地端口2121,然后指定B将所有的数据,转发到目标主机C的21端口。
隧道的维持
SSH 连接是会超时关闭的,如果连接关闭,隧道无法维持。这里推荐一个小工具,叫做autossh,官网的链接为:http://www.harding.motd.ca/autossh/。其编译比较简单,跟着逛网的教程做即可,过程如下:

至于使用,参考
# 其中 -M 参数指定的端口用来监听隧道的状态,与端口转发无关。
autossh -p 22 -M 6777 -NR 6766:127.0.0.1:22 [email protected]
# 之后你可以在A上通过6766 端口访问B 了:
ssh -p 6766 [email protected]
参考资料: http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.htmlhttps://blog.csdn.net/lidongshengajz/article/details/73482908https://www.cnblogs.com/keerya/p/7612715.html