1,前提条件
环境 | 系统类型 | 本地用户 | SSH服务端口 |
A机位于公司的NAT网络 | 安装在VMware里的Debian 8 64bit虚拟机 | userA | 22 |
B机是一台有公网IP的VPS | CentOS 6 64bit | userVPS | 1022 |
C机位于家庭的NAT网络 | Windows系统 | – | – |
实现目的:使得位于家庭NAT网络内的C机,可以SSH访问位于公司NAT网络内的A机。
2,原理分析
这里先讲向SS反向隧道的原理,如果你对原理不感兴趣,可以跳过这一节。
$ ssh -p 22 -qngfNTR 6766:127.0.0.1:22 usera@VPS的IP #回车以后没有反应是正常的,隧道已经建立
命令解析:
从(位于本地NAT网络里的)本机访问VPS,建立一条SSH隧道(本机的随机端口到VPS的22端口)
同时建立了一条反向隧道,将VPS上的6766端口转发到本机的22端口。
然后,就可以从VPS的6766端口访问本地的22端口了
$ ssh -p 6766 [email protected] #从SSH访问位于NAT网络里的linux机器
从SSH访问位于本地NAT网络里的linux机器,这里的userA当然是本地NAT网络里的linux机器用户啦。
这样做有一个问题,那就是,由本地建立的SSH连接是会超时关闭的,如果连接关闭,隧道无法维持,那么VPS就无法利用反向隧道访问本地NAT网络了,为此我们需要一种方案来提供一条稳定的SSH反向隧道,于是autossh就派上用场了;
另外有个问题是,如果本地的Linux系统重启,那么autossh建立的隧道仍然会失效。所以这里我们采取的做法是:
1,将本地Linux系统的public key发给VPS,建立信任机制,这样,本地Linux系统可以无需VPS的密码而建立一条SSH隧道;
2,将autossh写入系统服务,使之在开机时可以自动建立SSH隧道。