实现外网利用ssh反向隧道访问内网主机
准备
实现内网穿透都需要一台外网主机,而且是可以访问的
内网主机A
- IP:192.168.189.128
- ssh端口:22
- 用户名:usera
- 密码:passwda
外网主机B
- IP:123.123.123.123
- ssh端口:22
- 用户名:userb
- 密码:passwdb
- 要绑定内网主机的外网端口:2222
配置
外网主机配置
修改/etc/ssh/sshd_config
文件,如果没有添加即可
GatewayPorts yes
重启sshd服务
sudo service sshd restart
内网主机配置
ssh -NfR 2222:localhost:22 userb@123.123.123.123
参数 | 说明 |
---|---|
-f | 建立成功后在后台运行 |
-c | 允许压缩数据 |
-N | 只建立连接,不打开shell |
-R | 将远程主机的某个端口转发到本地主机的指定端口 |
-L | 将本地主机的某个端口转发到远程主机的指定端口 |
会提示输入外网主机的密码
通过ssh的2222端口连接外网主机,就可以代理到内网主机,外网主机执行下面命令测试
ssh localhost -p 2222
改进
至此,完全可以通过外网主机作为桥梁实现对内网主机的ssh访问,但是维持ssh的时间是有限的,一段时间没有数据传输,外网主机和内网主机的连接会断开。
使用autossh
内网主机配置
安装autossh
sudo apt install autossh
在上面操作中,连接外网主机每次需要输入密码,autossh 为了维持连接需要使用非密码登录,这里设置秘钥登录
生成秘钥,如果有ssh秘钥直接进行下步操作
ssh-keygen -t rsa -C "your_email@example.com"
将秘钥添加到外网主机的authorized_keys里面
ssh-copy-id userb@123.123.123.123
会提示输入外网主机密码
内网主机执行
autossh -M 55555 -NfR 2222:localhost:22 userb@123.123.123.123
参数 | 说明 |
---|---|
-M | 外网主机接收内网主机信息的端口 |
其他参数和ssh一致,在隧道断开的时候,autossh会自动重新连接而ssh不会,-M参数就是外网主机监听内网主机发送的信息的端口号,内网主机检测到异常就会自动重连。
外网主机测试
ssh localhost -p 2222