libnetfilter_queue:为什么我看不到来自 nfq_get_payload 的数据包的 TCP 负载?

libnetfilter_queue: Why can't I see the TCP payload of packets from nfq_get_payload?

我有一个相当基本的用户 space 防火墙应用程序。它从 libnetfilter_queue 正确接收数据,我们可以看到所有 IP 和 TCP header 信息,包括源和目标 IP、端口、协议等,但我们没有获得任何 TCP 负载信息。 ..

设置非常标准,我不会全部包括在内,但这里是亮点:

#define MAX_BUFFER_SIZE 65535
nfq_set_mode(qh, NFQNL_COPY_PACKET, MAX_BUFFER_SIZE)

所以我们要回完整的包裹...

在主线程中我们有:

rv = recv(fd, nfq_buffer, sizeof(nfq_buffer), 0);
printf("\nGot packet len: %d", rv);
if (rv > 0)
        nfq_handle_packet(nfq_h, (char*)nfq_buffer, rv);

在这里,在标准 HTTP 调用中,我将获得长度为 140 的数据包。但是,在回调处理程序中,数据包长度始终为 64:

static int handle_packet(struct nfq_q_handle* qh, struct nfgenmsg* nfmsg, struct nfq_data* dat, void* data)
{
    struct nfqnl_msg_packet_hdr* nfq_hdr = nfq_get_msg_packet_hdr(dat);
    unsigned char* nf_packet;
    int len = nfq_get_payload(dat,&nf_packet);
    struct iphdr *iph = ((struct iphdr *) nf_packet);
   iphdr_size = iph->ihl << 2;

    if (iph->protocol == 6){
        struct tcphdr *tcp = ((struct tcphdr *) (nf_packet + iphdr_size));    
        unsigned short tcphdr_size = (tcp->doff << 2);

        printf("\nGot a packet!! len: %d iphdr: %d tcphdr: %d", len, iphdr_size, tcphdr_size);
    }
}

在 TCP 中,len 始终为 64(iphdr 为 20,tcphdr 为 44)...始终。我从来没有得到 TCP 有效载荷。我做错了什么???

感谢 Joel 指出问题不在 C 代码中,而在 iptables 规则中。在 NFQUEUE 规则之前有一个 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 规则,所以我只收到连接设置数据包...糟糕。