如何利用SSH反向隧道连接NAT网络内的机器
Requirement
如下图所示:
PC想要访问公司内部server提供的服务,但由于公司内网有限制措施(采用NAT,防火墙等),只允许公司内部机器访问外部网络,反之则不行。现在需要在公司外部通过PC访问内网,除了通过VPN外,也可以通过搭建SSH反向隧道实现。
Prerequisite
- 一台公共服务器当中转站(PC和公司内部网络的电脑都能访问)。
- 安装openssh。
- Mobaxterm -- option (非必须,功能十分强大的终端软件)
Usage
下面以Jerry遇到的问题为例子来描述:Jerry在公司内部有台Windows机器,上面装有ubuntu18.04的虚拟机,并且有一台云服务器,现在我想在家里用自己的Windows电脑通过SSH连接到公司内部的那台ubuntu虚拟机,连接步骤如下:
Ubuntu默认安装了openssh client,现在要安装openssh server,运行如下命令:
sudo apt install openssh-server
编辑sshd_config
sudo vim /etc/ssh/sshd_config
添加
GatewayPorts clientspecified
重启ssh服务
sudo service sshd restart
通过命令行或Mobaxterm进行连接
命令行
在ubuntu上运行如下命令,与云服务器搭建ssh反向隧道:
假设云服务器的 ip为1.1.1.1,云服务器能被访问的端口为 55555sudo ssh -fN -R :55555:localhost:22 1.1.1.1
注意:-f意味着ssh连接成功后将在后台运行,上面的命令实现了当外部 client访问云服务器的上述 port时,云服务器会将该端口转发到我的 ubuntu的 22端口,通过该方式我可以在公司外部通过ssh连接到我在公司内部的 ubuntu。若要确定反向隧道是否搭建成功,可先登录云服务器输入
sudo netstat -nap | grep 55555
,若是有类似如下的结果:tcp 0 1.1.1.1:55555 0.0.0.0:* LISTEN 30149/sshd: root
则说明反向隧道搭建成功,此时你可以在云服务器上直接输入:
ssh -p 55555 <ubuntu_username>@1.1.1.1
即可在云上直接通过ssh连接到我的ubuntu。注意上面的ubuntu_username为我的ubuntu登录用户名,而不是云服务器的用户名。
- Mobaxterm
选中Tunneling
, 并选择New SSH tunnel
,然后选中Remote port forwarding
,具体如下:
上述的“Local server” 对应我在公司的ubuntu,“SSH server”对应我的云服务器,“Remote clients”对应公司外部的PC。配置完后再start该tunnel,即可实现与命令行一致的功能。