You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 13:34:39