libnetfilter_队列:为什么可以';我看不到来自nfq\u get\u有效载荷的数据包的TCP有效载荷吗?

libnetfilter_队列:为什么可以';我看不到来自nfq\u get\u有效载荷的数据包的TCP有效载荷吗?,tcp,iptables,netfilter,Tcp,Iptables,Netfilter,我有一个相当基本的用户空间防火墙应用程序。它正确地从libnetfilter_队列接收数据,我们可以看到所有的IP和TCP头信息,包括源和目标IP、端口、协议等,但我们没有得到任何TCP负载信息 设置非常标准,我不会全部包括在内,但这里有一些亮点: #define MAX_BUFFER_SIZE 65535 nfq_set_mode(qh, NFQNL_COPY_PACKET, MAX_BUFFER_SIZE) 所以我们要求退回整包 在主线中,我们有: rv = recv(fd, nfq_bu

我有一个相当基本的用户空间防火墙应用程序。它正确地从libnetfilter_队列接收数据,我们可以看到所有的IP和TCP头信息,包括源和目标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);
    }
}
static int handle_数据包(struct nfq_q_handle*qh,struct nfgenmsg*nfmsg,struct nfq_data*dat,void*data)
{
结构nfqnl_msg_packet_hdr*nfq_hdr=nfq_get_msg_packet_hdr(dat);
无符号字符*nf_数据包;
int len=nfq\u get\u有效载荷(dat和nf\u数据包);
结构iphdr*iph=((结构iphdr*)nf_数据包);
iphdr_size=iph->ihl协议==6){
结构tcphdr*tcp=((结构tcphdr*)(nf_数据包+iphdr_大小));

无符号短tcphdr_大小=(tcp->doff感谢Joel指出问题不在C代码中,而是在iptables规则中。在NFQUEUE规则之前有一个
-m conntrack--ctstate建立,相关的-j ACCEPT
规则,所以我只得到了连接设置包…哎哟。

你能把你正在使用的
iptables
命令发布到p吗将数据放入NFQUEUE?听起来你可能只收到了握手包,而不是数据包…乔尔C:谢谢-就是这样!!在我的NFQUEUE规则之前,我有一个conntrack重新发布/建立的规则!!谢谢,我只想要我的4小时!