将数据包注入不同的NFQUEUE

我有一个NFQUEUE,用于IPv6数据包,挂在ip6tables的PREROUTING链表中。 一旦我在用户应用程序中收到一个数据包,我修改了标题。 事实上,修改了从IPv6到IPv4的报头,并重新注入了数据包。 但是,从日志中,我发现IPv4数据包正在像IPv6数据包一样被对待。

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

  2. 是否有可能从一个队列接收数据包,但插入不同的队列? 这是没有道理的,但我想直接注入一个数据包到IP堆栈的IP头在用户空间格式化。

    • 根据RFC 3542,不build议使用带有IPv6的原始套接字
    • 我无法使用TUN设备来解决性能问题。 很多数据包正在使用TUN设备。

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

    例如

    nfq_bind_pf(h, AF_INET) 

    然后

     nfq_bind_pf(h, AF_INET6) 

    然后队列将处理4和6,你仍然需要让你的应用程序4/6知道,所以它可以适当地parsingIP头。

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

    nfq_set_verdict设置NF_QUEUE和队列号。 (当低位给出NF_QUEUE值时,使用判定值的高16位)。