我为 linux 内核中的传入数据包编写了一个 netfilter Hook 函数。有没有办法从钩子(Hook)函数中获取接收套接字信息。代码是
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。在上面编写的钩子(Hook)函数中,我如何访问在端口 15000 打开的 udp 套接字的 struct sock。使用上面的代码,控件不会通过 if(skb->sk) 条件,就好像 skb->sk 为空一样。你能给我建议一种方法来获取套接字的结构 socks ,还是我应该把钩子(Hook)放在其他位置,比如 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
符号未导出且无法直接调用。
关于 NF_INET_XX
如果你在谈论 NF_IP_PRE_ROUTING
和 NF_INET_PRE_ROUTING
我相信 NF_IP_PRE_ROUTING
在最近的内核中已经过时了,据我所知,4.4 已将其替换为 NF_INET_PRE_ROUTING
。
希望对您有所帮助。
关于android - 从linux内核中的netfilter NF_INET_PRE_ROUTING钩子(Hook)函数接收socket信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44146312/