我正在编写一个 NAT 的实现,并且需要使用原始套接字。我已经习惯了 Twisted 架构,并且喜欢它处理并发连接的方式。
进入 Twisted 协议的数据经过处理、NAT 化、制表并发送出原始套接字。进入原始套接字的数据被操纵、查找、NAT 并定向到适当的协议实例。
有一个原始套接字就足够了吗?如果同时有大量连接进来怎么办。不扭曲处理,或者扭曲在无连接协议中几乎没有优势。如果有优势,任何人都可以将我引向原始套接字扭曲示例
我正在编写一个 NAT 的实现,并且需要使用原始套接字。我已经习惯了 Twisted 架构,并且喜欢它处理并发连接的方式。
进入 Twisted 协议的数据经过处理、NAT 化、制表并发送出原始套接字。进入原始套接字的数据被操纵、查找、NAT 并定向到适当的协议实例。
有一个原始套接字就足够了吗?如果同时有大量连接进来怎么办。不扭曲处理,或者扭曲在无连接协议中几乎没有优势。如果有优势,任何人都可以将我引向原始套接字扭曲示例
Twisted 很好地支持无连接协议。例如,参见listenUDP
。
中有用于操作 IP 级协议数据的模块twisted.pair
,但并非所有模块都有效;特别是,tuntap 支持不起作用。
据我所知,没有这样的例子,但据我所知,一个原始套接字应该没问题。但是,您需要编写自己的传输,将套接字包装在IReadDescriptor
/中IWriteDescriptor
并使用IReactorFDSet
. 但是,如果您足够熟练地知道首先需要原始套接字,那么这应该不会太难。
在扭曲的源代码中四处挖掘,您会发现twisted.pair,它不再真正维护,但为您提供了大约 90% 的原始套接字所需的内容。
我在某处有一些示例代码,展示了如何在 BSD 上使用 /dev/bpf 。唯一需要注意的是,它是纯 python,所以没有 tcpdump 样式的数据包过滤器(端口 80 和主机 blah.com)——你只需要从消防水管中喝水。