经常会有朋友离开公司或者学校就无法连接内网机器继续工作,为了让大家在家里也能正常工作,这里介绍一下用反向代理的方式渗透内网,从而连接内网的服务器。
0 准备条件
机器 | IP | 用户名 | 备注 |
---|---|---|---|
A | 10.4.9.104 | usera | 位于内网的目标服务器,可以上网(保证可以访问公网机器) |
B | 123.123.123.123 | userb | 位于公网的服务器,充当桥梁 |
C | 192.168.0.138 | * | 家里的个人电脑,可以上网 |
在这三台机器中,可连接性是 A、C 均可访问 B,其余方向均不能访问,我们的目的是使得 C 可以通过 B 连接到 A。注意公网的机器IP
只是举个例子,请勿攻击他人服务器。
1 方案
方案分为两步:首先在内网机器 A 上建立到公网机器 B 的反向代理,然后就可以以公网机器 B 为跳板,访问到内网机器 A。
autossh参数解析
我们建立反向代理使用的指令为autossh -fCNR
,由于autossh
与ssh
功能基本一致,但是在连接断开的时候autossh
会自动 重新连接而ssh
不会,考虑到连接的稳定性,选择autossh
,下面简单解释一下参数:
-f 后台执行autossh指令
-C 允许压缩数据
-N 不执行远程指令
-M 监控端口,若检测到连接异常,则重新建立连接
-R 将远程主机(服务器)的某个端口转发到本地主机指定的端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定访问主机的端口
ssh免密访问
由于autossh
在每次建立连接的时候都需要输入密码,长时间未输入则会断开连接,因此,为了保证连接的稳定性,我们需要配置内网机器 A 到公网机器 B 的免密访问。配置指令如下:
[usera@ServerA ~]$ ssh-keygen
[usera@ServerA ~]$ ssh-copy-id userb@123.123.123.123 # IP of server B: 123.123.123.123
如此一来,从 A 登录到 B 就不再需要输入密码了。
autossh反向代理
在内网机器 A 上执行命令:
# autossh -M [监控端口] -fCNR [B机器IP或省略]:[B机器(转发)端口]:[A机器的IP]:[A机器的sshd端口] [登录B机器的用户名@B机器的IP]
[usera@ServerA ~]$ autossh -M 51209 -fCNR 51208:localhost:22 userb@123.123.123.123
其中,-M 51209
指定了监控端口,该端口用于内网机器 A 和公网机器 B 相互发送连接信息,如果连接异常,则 A 会重新建立与 B 的连接。此处为了保证连接稳定,建议监控端口和转发端口设置在 49152 到 65535之间,这些端口是TCP/IP
协议中的动态端口,一般不会被系统应用占用。
当执行完指令后,使用以下命令在机器 A 或 B 上来检查转发端口判断是否建立成功,此处选择在机器 A 上检测:
[usera@ServerA ~]$ netstat -antpul | grep ':51209'
若建立成功则会有相应的输出,否则无输出。
还可以去公网机器 B 上测试是否可以连通内网机器 A,连接方式为访问本地端口 51208
,从而访问内网机器 A:
[userb@ServerB ~]$ ssh usera@localhost -p 51208
若可以访问,则说明反向连接建立成功。
2 测试
若方案中的流程都执行无误的话,那么机器 C 就可以通过访问机器 B 来连通机器 A, 即用个人电脑先访问公网机器 B:
[*@ServerC ~]$ ssh userb@123.123.123.123
接着在公网机器 B 上连接内网机器 A:
[userb@ServerB ~]$ ssh usera@localhost -p 51208
此外,还可以在机器 B 上建立脚本方便对机器 A 的访问,因为五位数的端口对于我这样的老年人来说实在不友好。