我有一个 NFQUEUE,用于挂接到 ip6tables 中 mangle 表的 PREROUTING 链的 IPv6 数据包。一旦我在用户应用程序中收到数据包,我就会修改标头。实际上,将标头从 IPv6 修改为 IPv4 并重新注入数据包。但是,从日志中,我看到 IPv4 数据包被视为 IPv6 数据包。
由于每个 NFQUEUE 都映射到 AF_INET 或 AF_INET6,单个 NFQUEUE 是否可以同时处理 IPv4 和 IPv6 数据包?
是否可以从一个队列接收数据包但将其注入另一个队列?这没有意义,但我想直接将数据包注入 IP 堆栈,并在用户空间中格式化 IP 头。
- 根据 RFC 3542,不建议将原始套接字与 IPv6 一起使用。
- 由于性能问题,我无法使用 TUN 设备。使用 TUN 设备时,很多数据包被丢弃。
答案1
您可以通过绑定两者来对 IPv4 和 IPv6 使用单个队列。
例如
nfq_bind_pf(h, AF_INET)
然后
nfq_bind_pf(h, AF_INET6)
然后队列将处理 4 和 6,您仍然需要让您的应用程序了解 4/6,以便它可以适当地解析 IP 标头。
您可以将数据包传递到另一个队列。
NF_QUEUE
与队列号一起设置nfq_set_verdict
。(当低位给您值时,使用判决值的高 16 位NF_QUEUE
)。