Netfilter钩子函数无法读取TCP数据包负载内容的问题求助
Netfilter钩子函数无法读取TCP数据包负载内容的问题求助
各位好,我最近在写Netfilter钩子函数,想读取TCP数据包的负载内容,但遇到了一个头疼的问题——能成功抓到TCP包,也能获取到端口、包长度这些信息,但负载部分输出全是0,我找了好久都没发现问题所在,恳请大家帮忙看看!
我的钩子函数代码如下:
unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) // 这个函数是钩子函数,抓到包时会执行 // `struct sk_buff`是抓到的数据包,三个参数里只用到了中间这个 { struct iphdr* p = ip_hdr(skb); if (p->protocol == 6) // 筛选TCP包 { printk(KERN_INFO "TCP packet!"); printk(KERN_INFO "---len=%d", skb->len); struct tcphdr* t = (struct tcphdr*)skb_transport_header(skb); u16 srcport = ntohs(t->source), dstport = ntohs(t->dest); printk(KERN_INFO "---srcport=%hu,dstport=%hu", srcport, dstport); // 尝试获取TCP负载的起始指针,t->doff是TCP头长度(以4字节为单位) unsigned char *data_point = (char*)t + t->doff*4; // 针对目标端口12345的包,打印前40字节负载 if (srcport == 12345 || dstport == 12345) for(int i=0; i<10; i++) printk(KERN_INFO "%u %u %u %u", data_point[i*4], data_point[i*4+1], data_point[i*4+2], data_point[i*4+3]); } return NF_ACCEPT; // 放行该数据包 }
运行后内核日志输出如下:
[ 3752.004248] TCP packet!
[ 3752.004254] ---len=58
[ 3752.004257] ---srcport=12345,dstport=35620
[ 3752.004259] 0 0 0 0
[ 3752.004262] 0 0 0 0
[ 3752.004264] 0 0 0 0
[ 3752.004266] 0 0 0 0
[ 3752.004268] 0 0 0 0
可以看到包长度是58,struct tcphdr头一般是20字节左右,加上IP头的20字节,理论上应该有18字节的负载,但输出全是0,实在搞不懂问题出在哪,麻烦各位大佬帮忙分析一下,谢谢了!
备注:内容来源于stack exchange,提问作者zhzhy
相关产品推荐
相关产品推荐

