反向代理渗透内网

用autossh实现从外网连接内网服务器

Posted by Echo on December 9, 2018

经常会有朋友离开公司或者学校就无法连接内网机器继续工作,为了让大家在家里也能正常工作,这里介绍一下用反向代理的方式渗透内网,从而连接内网的服务器。

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 ,由于autosshssh功能基本一致,但是在连接断开的时候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 的访问,因为五位数的端口对于我这样的老年人来说实在不友好。