Linux下ssh反向隧道进行内网穿透
1. 使用情景
经常会有如下场景,你在内网有一台服务器A,可以访问内网,也可以访问外网,当你想从外网访问到这个这台内网服务器时,就需要用到ssh反向代理了;
例如你想在外网ssh到主机A,因为你的服务器A没有公网IP所以你无法直接访问;这时你可以借助公网主机B来实现。
如上图,拥有公网IP的主机B如何ssh到内网主机A呢?
2. 构建反向ssh隧道
在主机A上执行如下命令
ssh -p2803 -qngfNTR 6023:192.168.0.2:22 root@96.45.*.*
执行后输入主机B的密码,保持连接不要断开
-p 表示公网主机的ssh端口为2803
上面语句表示,可以通过在主机B上执行ssh localhost -p 6023 登陆到主机A
原理是通过主机A主动ssh访问主机B并留下反访问自己的端口2803
3. 打洞
通过公网主机,构建隧道,使分别位于nat后的主机可以通讯。如果想要使任何其它外网主机C都可以通过主机B远程ssh到主机A,则需要修改主机B上的SSH服务配置文件
操作如下:
1、 在主机B上编辑sshd配置文件/etc/ssh/sshd_config
GatewayPorts yes
2、 然后重启sshd
sudo systemctl restart sshd
4. 维持隧道稳定
上面隧道已经建立成功,可是如果主机A的ssh连接断开(超时或者重启),隧道就会消失,那么有没有办法自动维持ssh稳定呢?在ssh连接断开时自动重连,或者在开机时自动连接ssh。
有,autossh
维持隧道稳定可以使用autossh
4.1、安装autossh
在线安装
redhat下安装
$ yum install autossh
离线安装
$ sudo apt-get install gcc make
$ wget http://fossies.org/linux/privat/autossh-1.4e.tgz
$ tar -xf autossh-1.4e.tgz
$ cd autossh-1.4e
$ ./configure
$ make
$ sudo make install
4.2、修改命令
ssh -p2803 -qngfNTR 6023:192.168.0.2:22 root@96.45.*.*
修改为
autossh -p 2803 -M 6777 -NR '*:6023:192.168.0.2:22' root@96.45.*.*
注释:
-M 为监听端口,与转发无关
如果需要后台执行,可以加-f参数,可是后台执行无法输入密码,需要提前配置好ssh密钥
5、 隧道传输文件
在主机B上可以使用scp命令传输文件
如将主机B上/home/hi.txt 传输到主机A上,可以在主机B上输入命令
scp -P 6023 /home/hi.txt root@localhost:/home/
如将主机A上/home/hi.txt 传输到主机B上,可以在主机B上输入命令
scp -P 6023 root@localhost:/home/hi.txt /home/