Linux libnetfilter_queue延迟了数据包问题

时间:2011-06-04 15:14:46

标签: python linux networking netfilter

我必须使用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实现延迟,或者我必须复制pkt,删除它并使用标准socket.socket.send()发送副本吗?

谢谢

2 个答案:

答案 0 :(得分:3)

很抱歉迟到的回复,但我需要做这样的事情,虽然稍微复杂一点。我使用了库的C版本,并将数据包复制到程序中的缓冲区,然后发出了DROP判定。在与延迟相关的超时后,我使用原始套接字重新注入数据包。这很好用,看起来效率很高。

我认为你崩溃的原因是因为你没有足够快地作出判决。

答案 1 :(得分:0)

我无法回答您的问题,但为什么不在传出接口上使用“netem”流量队列模块来延迟数据包呢?

可以配置tc队列以对以某种方式“标记”的数据包应用不同的策略;标记此类数据包的常规方法是使用netfilter模块(例如iptables或nfqueue)。