Linux libnetfilter_queue 延迟包问题
我需要使用Linux内核的libnetfilter_queue(具体来说是它的Python绑定)和dpkt来过滤和修改网络流量,并且我想实现延迟转发数据包。
正常的过滤功能运行得很好,但如果我尝试用这样的函数来延迟数据包
def setVerdict(pkt, nf_payload):
nf_payload.set_verdict_modified(nfqueue.NF_ACCEPT, str(pkt), len(pkt))
t = threading.Timer(10, setVerdict, [pkt, nf_payload])
t.start()
程序就崩溃了,没有抛出任何异常(肯定是低级别的崩溃)。我可以直接用libnetfilter来实现延迟吗,还是说我必须复制数据包,丢弃原来的,然后用标准的socket.socket.send()
发送复制的那个?
谢谢
2 个回答
0
我不能直接回答你的问题,但为什么不试试在发送数据的接口上使用“netem”流量队列模块来延迟数据包呢?
你可以设置tc队列,对以某种方式“标记”的数据包应用不同的处理规则;通常,标记这些数据包的方法是使用一个叫做netfilter的模块(比如iptables或nfqueue)。
3
抱歉回复得晚了,不过我需要做类似的事情,虽然稍微复杂一些。我使用了这个库的C语言版本,然后把数据包复制到我程序里的一个缓冲区里,接着我给这个数据包下了一个丢弃的命令。在你提到的延迟之后,我通过一个原始套接字重新发送这个数据包。这样做效果很好,而且看起来也挺高效的。
我觉得你崩溃的原因是因为你下命令的速度不够快。