Linux libnetfilter_queue 延迟包问题

1 投票
2 回答
1487 浏览
提问于 2025-04-16 18:57

我需要使用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语言版本,然后把数据包复制到我程序里的一个缓冲区里,接着我给这个数据包下了一个丢弃的命令。在你提到的延迟之后,我通过一个原始套接字重新发送这个数据包。这样做效果很好,而且看起来也挺高效的。

我觉得你崩溃的原因是因为你下命令的速度不够快。

撰写回答