转载自开源中国 零号_特工 的博客 利用SSH端口转发作内网穿透
背景
在学校里用到的都是校园网,每个校园网会动态分配一个IP地址,且连外网需要web页面登录账号,长时间不使用账号会自动下线。现在需要从外网SSH进入内网的机器进行操作,甚至还需要将内网机器上部署的机器让外网用户访问。
说明
机器代号 | IP | 备注 |
---|---|---|
A | 172.16.200.11 | 内网机器 |
B | 120.45.XXX.XXX | 阿里云服务器 |
C | ANY | 外网机器 |
A和B均为Linux系统,所有Linux终端的操作为了避免权限问题,全部以root用户操作。
原理
A可以访问B,C也可以访问B。这是前提条件,否则无法实现穿透。 A将自己的ssh默认的22端口反向代理到B的10020端口上,B再将本地10020端口转发到10021端口。C直接访问B的10021端口,就可以达到访问A的22端口的效果。
注意
这里B服务器必须做一次本地端口转发,因为A反向代理到B的10020端口之后,只有B本身可以访问10020端口,其他机器是访问不了的,必须做一次本地端口转发。
操作步骤
1. 保持内网机器可以一直访问外网
在linux终端下登录校园网账号其实就是发送一个post请求带上自己的用户名密码就可以实现。 在A机器上执行命令如下:
curl -d "DDDDD=用户名" -d "upass=密码" -d "0MKKey=" http://172.16.200.13
由于校园网长时间没有访问就会自动断开,为了保持外网的连接,利用crontab每10分钟执行登录一次。
编辑crontab定时任务:
crontab -e
添加一行记录
*/10 7-23 * * * curl -d "DDDDD=用户名" -d "upass=密码" -d "0MKKey=" http://172.16.200.13
对于crontab参数不明白的请自行百度。每个学校登录校园网账号的方式可能有区别,改成自己的登录方法,然后加入crontab定时任务即可。
2. 安装autossh
由于ssh连接长时间不使用会自动断开,为了保持ssh连接需要安装autossh,它会自动监听ssh连接的状态,自动重连。利用yum可以直接安装。
yum install autossh
3. 端口转发
在A机器上将A的22端口反向代理到B的10020端口上。A执行:
autossh -M 10019 -f -CNR -p 22 '*:10020:127.0.0.1:22' root@120.45.XXX.XXX
-M 表示autossh监听ssh连接状态的端口
-f 后台运行autossh
后面接的是SSH的命令。SSH常用命令参数解释如下:
-f 后台运行
-C 允许压缩数据
-N 不执行任何命令
-R 将端口绑定到远程服务器,反向代理
-L 将端口绑定到本地客户端,正向代理
-p 转发服务器B的SSH登录端口号,默认为22
接下来,在B机器上将10020端口本地转发到10021端口。B执行:
ssh -fCNL "*:10021:localhost:10020" localhost
B机器不需要安装autossh,因为本地端口转发的ssh连接不会自动断开。
最后,在C机器上执行:
ssh -p 10021 root@120.45.XXX.XXX
输入A机器root密码就可以登录A机器,达到内网穿透的目的。如果C机器是windows系统可以安装Xshell等软件实现访问。
总结
本文的方法不仅仅可以将A的22号端口映射到外网,也可以将其他端口,如80端口等,映射到外网。如果A机器80端口部署了一个网站,那么通过本文的方法,外网即可访问该网站。