gpt4 book ai didi

c++ - 数据包在 libnetfilter_queue 中永远循环

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:11 26 4
gpt4 key购买 nike

我想为 TCP/UDP 流量实现网络延迟模型,如 Linux libnetfilter_queue delayed packet problem 中所述.我听从了 Andy 的建议,将整个数据包复制到我的程序并将其放置在优先队列中。随着时间的流逝,优先级队列中的数据包将被删除并使用 RAW 套接字进行分派(dispatch)。

我面临的问题是:libnetfilter_queue 对数据包的初始捕获是通过匹配端口 (sudo iptables -A OUTPUT -p udp --dport 8000 -j NFQUEUE --queue-num 0) 完成的。当这些数据包被 RAW 套接字重新注入(inject)时,它们会再次被 libnetfilter_queue 拾取(因为端口保持不变)并因此继续永远循环。

我真的很迷茫,想不出出路。请帮助我。

最佳答案

使用skb->标记。这是一个仅存在于主机 IP 堆栈中的标记。它不会影响网络数据包本身的任何内容。

您可以使用 iptables 使用 '--mark' 过滤器过滤它。使用它从您的延迟链返回,以便您重新插入的数据包不会再次延迟。

iptables -A DELAY -m mark --mark 0xE -j RETURN
iptables -A DELAY -j DELAY

您可以使用 setsockopt(fd, SOL_SOCKET, SO_MARK, ...) 配置原始套接字以应用标记。您只需在打开 socket 后执行此操作一次。标记值将自动应用于您通过套接字发送的每个数据包。

关于c++ - 数据包在 libnetfilter_queue 中永远循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10473087/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com