libnetfilter_队列:为什么可以';我看不到来自nfq\u get\u有效载荷的数据包的TCP有效载荷吗?
我有一个相当基本的用户空间防火墙应用程序。它正确地从libnetfilter_队列接收数据,我们可以看到所有的IP和TCP头信息,包括源和目标IP、端口、协议等,但我们没有得到任何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
#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小时!