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

时间:2017-05-23 22:53:52

标签: android linux kernel hook netfilter

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

iteratee

假设我在端口15000处打开了udp套接字,并且udp数据包到达端口15000.在上面写的钩子函数中,如何访问在端口15000打开的udp套接字的struct sock。使用上面的代码,控件不会传递if(skb-> sk)条件,就好像skb-> sk为null。你能告诉我一个获取socket的struct sock的方法,或者我应该把钩子放在像NF_INET_LOCAL_IN这样的其他位置。我也对NF_INET_XX_XX和NF_IP_XX_XX之间的区别感到困惑。

1 个答案:

答案 0 :(得分:0)

内核在内部使用__inet_lookup_skb()从skb获取sk,首先调用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已将其替换为{{ 1}}。

希望有所帮助。