/TinyNet

Primary LanguagePython

网络编程学习

背景

使用Python来实现一个类似于OpenVPN的隧道,用UDP隧道来打通NAT网络。 VPN隧道的实现依赖于Linux内核提供的 tun/tap 虚拟网络接口,只要不是太古董级别的Linux系统,或者其他类Unix系统就都可以支持。可以查看是否存在设备文件 /dev/net/tun,如果存在则表示支持 tun/tap 功能,对于早些的Linux内核,设备文件还可能是 /dev/tun。

其中 tun 是模拟的三层网络设备,只支持三层以上的协议,只能做到点对点隧道,而 tap 则可以模拟二层网络设备,arp 协议等二层协议也是支持的,可以实现多机组成的虚拟局域网。tun 也可以通过数据转发的方式实现互通。

服务端代码为了更高的性能和不依赖第三方库使用Python3完成,客户端就尽量兼容更多版本的Python。网络使用常用的 tun 虚拟网卡。�

实现

简单来说使用 tun 实现的VPN就是 /dev/net/tun 设备实现了应用层直接处理网络数据包的能力。当使用 /dev/net/tun 创建了虚拟网卡设备后,发到这个网卡的数据包会被 /dev/net/tun 拦截并返回给打开它上上层程序,上层程序可以通过 udp、tcp 甚至 icmp 协议将原始的数据包发送到目标主机。当目标主机通过网络接受到数据包后再写入到 /dev/net/tun 设备中,/dev/net/tun 再将数据包注入到内核的网络协议栈按照正常到达的数据包来处理。VPN大部分采用的是通过 udp 协议发送到对端的,如果是通过 tcp 协议传输,tcp 包内部包裹着另一个 tcp 包,如果发生了丢包重传现象,内部的 tcp 包和外部的 tcp 包可能发生混乱。

server.py

服务端程序,使用Python3标准,只使用标准库

client.py

TODO