从 linux 内核中的 netfilter NF_INET_PRE_ROUTING 钩子函数接收套接字信息

Receiving socket information from netfilter NF_INET_PRE_ROUTING hook function in linux kernel

我在 linux 内核中为传入数据包编写了一个 netfilter 挂钩函数。有没有办法从钩子函数中获取接收套接字信息。密码是

register() {
        hk.hook = hookfunction;
        hk.hooknum = NF_INET_PRE_ROUTING;
        hk.pf = PF_INET;
        hk.priority = NF_IP_PRI_LAST;
}

static unsigned int hookfunction (void *priv,struct sk_buff,const struct nf_hook_state *state) {
        if (skb->sk) {
                printk("%d", skb->sk->sk_mark);
        }
}

假设我在 15000 端口打开了一个 udp 套接字,一个 udp 数据包到达了 15000 端口。在上面写的钩子函数中,我如何访问在 15000 端口打开的 udp 套接字的 struct sock。有了上面代码,控件不传递 if(skb->sk) 条件,就好像 skb->sk 为空。你能给我建议一种方法来获取套接字的结构袜子,还是我应该把钩子放在其他位置,比如 NF_INET_LOCAL_IN。我也对 NF_INET_XX_XX 和 NF_IP_XX_XX 之间的区别感到困惑。

内核内部使用__inet_lookup_skb()从skb获取sk,skb首先调用skb_steal_sock()检查skb->sk是否为NULL,如果是,则调用__inet_lookup()查找sk。

但是您可能需要稍微调整一下内核,因为 __inet_lookup_skb 符号不会导出并且不能直接调用。

内核源码中的一些引用: 1 2 3

关于 NF_INET_XX 如果你在谈论 NF_IP_PRE_ROUTINGNF_INET_PRE_ROUTING 我相信 NF_IP_PRE_ROUTING 在最近的内核中已经过时了,据我所知 4.4 已经用NF_INET_PRE_ROUTING

希望对您有所帮助。