BLOG
Enjoy when you can, and endure when you must.
JUL 07, 2016/Python
DReverse:让我欢快地访问内网!

好久没用 Python 写些有趣的东西了,有点手痒痒。最近总是有从公网访问内网的需求。VPN 是一种解决方案,不过无论如何这个的和谐几率还是很高,在国内的话通常不那么好用。那就手动打隧道吧,顺便还可以玩玩 Python 的 socket,当然总体说来这其实也很简单,因为是 Python,并不需要考虑底层的东西。于是就诞生了 DReverse。

其实原理很简单,大致就是优先让内网的主机发起连接到公网主机上,并维护该通道,这样双方或者第三者就可以借助该通道与内网的主机通信。这时内网主机自己其实在担任“反向代理”的角色。

有兴趣的朋友可以在我的 Github 中找到源码:

https://github.com/manyunkai/dreverse

 

要运行该工程,首先应注意配置基础环境:

  • 需要 Python 2.7.3 或 Python 3.2 以上版本
  • 需要 PyCrypto 用于 AES 加解密

 

然后就可以在所需的两台主机上分别运行 master 和 slave,我将他们分别称之为控制节点及反向连接节点。

在控制节点(通常是一台运行在公网环境中且具有公网 IP 的设备)运行 master.py,支持的参数:

  • -l 或 --local:所要监听的本地端口,如 127.0.0.1:1081
  • -e 或 --remote:所要监听的远程端口,用于 slave 与 master 建立连接,如 0.0.0.0:50076
  • -s 或 --secret:用于 AES 加密的密钥,需与 slave 的 secret 相对应,必须是 16 位、32 位或 64 位长度,分别对应 AES128、AES256 和 AES 512
  • -t:连接超时时间,如 120,则在 120 之内没有数据交互,则断开连接
  • --log-level:日志级别,可以是 DEBUG、INFO、WARNING、ERROR 或 CRITICAL

如:python -l 127.0.0.1:1081 -e 0.0.0.0:50067 -s nN31mnOq0ek4UBXxecl4WnLeCoYOfTQJ -t 120 --log-level DEBUG

在反向连接节点(通常是一台运行在内网环境中的设备)运行 slave.py,支持的参数:

  • -l 或 --local:目标地址,即远程设备所要通信的“真实”地址,如 127.0.0.1:22
  • -e 或 --remote:所要连接的远程端口,即 master 的地址,如 127.0.0.1:50076
  • -s 或 --secret:用于 AES 加密的密钥,需与 master 的 secret 相对应,必须是 16 位、32 位或 64 位长度,分别对应 AES128、AES256 和 AES 512
  • -t:连接超时时间,如 120,则在 120 之内没有数据交互,则断开连接--log-level:日志级别,可以是 DEBUG、INFO、WARNING、ERROR 或 CRITICAL

如:python slaver.py -l 127.0.0.1:22 -e 192.168.204.1:50067  -s nN31mnOq0ek4UBXxecl4WnLeCoYOfTQJ -t 120 --log-level DEBUG

 

两端都运行起来后,就可形成大致如下交互:

 

当然,本工具主要意图还是学习之用。通过对其进行演变,还可以延伸实现很多有趣的功能。

COMMENTS
LEAVE COMMNT