将数据包注入到不同的 NFQUEUE

将数据包注入到不同的 NFQUEUE

我有一个 NFQUEUE,用于挂接到 ip6tables 中 mangle 表的 PREROUTING 链的 IPv6 数据包。一旦我在用户应用程序中收到数据包,我就会修改标头。实际上,将标头从 IPv6 修改为 IPv4 并重新注入数据包。但是,从日志中,我看到 IPv4 数据包被视为 IPv6 数据包。

  1. 由于每个 NFQUEUE 都映射到 AF_INET 或 AF_INET6,单个 NFQUEUE 是否可以同时处理 IPv4 和 IPv6 数据包?

  2. 是否可以从一个队列接收数据包但将其注入另一个队列?这没有意义,但我想直接将数据包注入 IP 堆栈,并在用户空间中格式化 IP 头。

    • 根据 RFC 3542,不建议将原始套接字与 IPv6 一起使用。
    • 由于性能问题,我无法使用 TUN 设备。使用 TUN 设备时,很多数据包被丢弃。

答案1

  1. 您可以通过绑定两者来对 IPv4 和 IPv6 使用单个队列。

    例如

    nfq_bind_pf(h, AF_INET)
    

    然后

    nfq_bind_pf(h, AF_INET6)
    

    然后队列将处理 4 和 6,您仍然需要让您的应用程序了解 4/6,以便它可以适当地解析 IP 标头。

  2. 您可以将数据包传递到另一个队列。

    NF_QUEUE与队列号一起设置nfq_set_verdict。(当低位给您值时,使用判决值的高 16 位NF_QUEUE)。

相关内容