【问题标题】:Receiving socket information from netfilter NF_INET_PRE_ROUTING hook function in linux kernel从linux内核中的netfilter NF_INET_PRE_ROUTING钩子函数接收套接字信息
【发布时间】:2017-05-23 22:53:51
【问题描述】:

我为 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 之间的区别感到困惑。

【问题讨论】:

    标签: android linux kernel hook netfilter


    【解决方案1】:

    内核内部使用__inet_lookup_skb()从skb获取sk,首先调用skb_steal_sock()检查skb->sk是否为NULL,如果是在这种情况下,它会调用__inet_lookup() 来查找sk。

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

    来自内核源代码的一些参考: 123

    关于NF_INET_XX,如果您在谈论NF_IP_PRE_ROUTINGNF_INET_PRE_ROUTING,我相信NF_IP_PRE_ROUTING 在最近的内核中已经过时,据我所知,4.4 已将其替换为NF_INET_PRE_ROUTING

    希望对您有所帮助。

    【讨论】:

    • 谢谢。将通过内核。为了测试,我在 NF_INET_LOCAL_IN 中放了一个钩子。我注意到我能够获取已连接套接字(如 tcp 套接字)的 sock 结构,但无法获取未连接套接字(如 UDP 套接字)的 sock 结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    相关资源
    最近更新 更多