从 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
符号不会导出并且不能直接调用。
关于 NF_INET_XX
如果你在谈论 NF_IP_PRE_ROUTING
和 NF_INET_PRE_ROUTING
我相信 NF_IP_PRE_ROUTING
在最近的内核中已经过时了,据我所知 4.4 已经用NF_INET_PRE_ROUTING
。
希望对您有所帮助。
我在 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
符号不会导出并且不能直接调用。
关于 NF_INET_XX
如果你在谈论 NF_IP_PRE_ROUTING
和 NF_INET_PRE_ROUTING
我相信 NF_IP_PRE_ROUTING
在最近的内核中已经过时了,据我所知 4.4 已经用NF_INET_PRE_ROUTING
。
希望对您有所帮助。