用python从网络接口读取和处理数据包

用python从网络接口读取和处理数据包,python,networking,macos-sierra,tunnel,network-interface,Python,Networking,Macos Sierra,Tunnel,Network Interface,所以我试图用python创建一个隧道协议。我有tun接口设置,路由通过它的所有流量。 但是现在我如何获得重定向到程序中tun接口的数据包来加密它们并将它们发送到服务器? 据我所见,要么是socket.bind()函数,要么是socket.setsockopt()函数。 这是我的界面设置 这就是我现在使用的代码: 导入操作系统,系统 从选择导入选择 f=os.open(“/dev/tun0”,os.ordwr) 操作系统(“ifconfig tun0添加10.6.0.1 10.6.0.2”) 操

所以我试图用python创建一个隧道协议。我有tun接口设置,路由通过它的所有流量。 但是现在我如何获得重定向到程序中tun接口的数据包来加密它们并将它们发送到服务器? 据我所见,要么是socket.bind()函数,要么是socket.setsockopt()函数。 这是我的界面设置

这就是我现在使用的代码:

导入操作系统,系统 从选择导入选择 f=os.open(“/dev/tun0”,os.ordwr) 操作系统(“ifconfig tun0添加10.6.0.1 10.6.0.2”) 操作系统(“ip路由添加0/1 dev tun0”) 尝试: 而1: r=选择([f],[])[0][0] 如果r==f: 数据包=操作系统读取(f,4000) 打印(str(len(packet))+“:”+str(packet)) 除键盘中断外: 打印(“由用户停止”) 操作系统(“ip路由删除0/1 dev tun0”) 这将直接从设备读取数据。那么,有没有一种方法可以使用套接字库单独读取数据包呢

谢谢


OS:macOS Sierra

我会将tun接口设置为混杂模式,这样我就可以监听通过的每个数据包

下面的SO帖子介绍了如何实现这一目标的良好开端:


另一个选项是对网络接口的低级访问¸或用Python编写的虚拟网卡驱动程序。

混乱模式可能不是解决办法,我的tun0接口是点对点设置的,再看看我的问题我添加的详细信息为什么不是?通过一个处于混杂模式的套接字和s.readfrom()可以得到一个数据包及其来源。您必须有两个嗅探器,一个捕获TCP,一个捕获UDP,但这又有什么关系呢。您甚至可以使用asyncore来帮助您提高效率。但好的,您选择了低级别。我希望您必须知道如何手动读取数据包头,也就是说,您需要TCP和UDP规范以及其他设备协议。然后使用struct模块提取元数据和内容。但是首先我建议你去看看OpenVPN是如何做到这一点的。对于结构的使用,NewBoston有一个很好的指南。如果结构版本不起作用,我将使用promisc模式。谢谢:-)我不打算使用promisc模式,但是我如何在Mac OS上不使用tcpdump就可以使用它呢?可能是使用socket.socket.setsockopt()和来自fcntl模块的一些帮助。此外,pyobjc还可能公开一些简单的方法来请求混杂模式。你应该检查一下。此外,也许直接从网络iface读取和写入二进制数据也是在Objective C中实现的,并带有解包和all。如果有pyobjc,应该让你去做。你可以抽出时间学习TCP和UDP报头,天知道还有什么。