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

标签 c++ c linux networking netfilter

我想为 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/

相关文章:

C++ 数组处理

c++ - 函数的两个版本不会产生相同的结果

c - 为什么我的数据包读取程序返回不正确的数据?

linux - 在树莓派上使用logrotate和syslog-ng(如何删除旧日志?)

c++ - Visual C++ - 匿名方法

c++ - 按降序对这些元素进行排序?

c - 从c中的文件读取时出现空白行问题

objective-c - Objective C 中的 "fabs"是什么?

linux - 使用 ffmpeg 将视频转换为 MP4 (H.264/AAC)

c - Strace 与 C 可执行文件?