深入理解 netfilter 和 iptables!( 三 )


struct nf_hook_ops { struct list_head list; /* User fills infrom here down. */ nf_hookfn *hook; struct module *owner; u_int8_t pf; unsigned int hooknum; /* Hooks are ordered inascending priority. */ int priority; };
在定义中有 3 个重要成员:
hook: 将要注册的回调函数,函数参数定义与 NF_HOOK 类似,可通过 okfn 参数嵌套其他函数 。
hooknum: 注册的目标 hook 枚举值 。
priority: 回调函数的优先级,较小的值优先执行 。
定义结构体后可通过 int nf_register_hook(struct nf_hook_ops *reg) 或 int nf_register_hooks(struct nf_hook_ops *reg, unsigned int n); 分别注册一个或多个回调函数 。同一 netfilter hook 下所有的 nf_hook_ops 注册后以 priority 为顺序组成一个链表结构,注册过程会根据 priority 从链表中找到合适的位置,然后执行链表插入操作 。
在执行 NF-HOOK 宏触发指定的 hook 时,将调用 nf_iterate 函数迭代这个 hook 对应的 nf_hook_ops 链表,并依次调用每一个 nf_hook_ops 的注册函数成员 hookfn。示意图如下:
netfilter-hookfn1
这种链式调用回调函数的工作方式,也让 netfilter hook 被称为 Chain,下文的 iptables 介绍中尤其体现了这一关联 。
每个回调函数也必须返回一个 netfilter 向量;如果该向量为 NF_ACCEPT,nf_iterate 将会继续调用下一个 nf_hook_ops 的回调函数,直到所有回调函数调用完毕后返回 NF_ACCEPT;如果该向量为 NF_DROP,将中断遍历并直接返回 NF_DROP;**如果该向量为 **NF_REPEAT**,将重新执行该回调函数** 。nf_iterate 的返回值也将作为 NF-HOOK 的返回值,网络栈将根据该向量值判断是否继续执行处理函数 。示意图如下:

深入理解 netfilter 和 iptables!

文章插图
netfilter-hookfn2
netfilter hook 的回调函数机制具有以下特性:
回调函数按优先级依次执行,只有上一回调函数返回 NF_ACCEPT才会继续执行下一回调函数 。
任一回调函数都可以中断该 hook 的回调函数执行链,同时要求整个网络栈中止对数据包的处理 。
iptables
基于内核 netfilter 提供的 hook 回调函数机制,netfilter 作者 Rusty Russell 还开发了 iptables,实现在用户空间管理应用于数据包的自定义规则 。
iptbles 分为两部分:
用户空间的 iptables 命令向用户提供访问内核 iptables 模块的管理界面 。
内核空间的 iptables 模块在内存中维护规则表,实现表的创建及注册 。
内核空间模块 xt_table 的初始化
在内核网络栈中,iptables 通过 xt_table 结构对众多的数据包处理规则进行有序管理,一个 xt_table 对应一个规则表,对应的用户空间概念为 table 。不同的规则表有以下特征:
对不同的 netfilter hooks 生效 。
在同一 hook 中检查不同规则表的优先级不同 。
基于规则的最终目的,iptables 默认初始化了 4 个不同的规则表,分别是 raw、 filter、nat 和 mangle 。下文以 filter 为例介绍 xt_table 的初始化和调用过程 。
filter table 的定义如下:
#define FILTER_VALID_HOOKS ((1NF_INET_LOCAL_IN) | \ (1NF_INET_FORWARD) | \ (1NF_INET_LOCAL_OUT)) static const struct xt_table packet_filter = { .name = "filter", .valid_hooks = FILTER_VALID_HOOKS, .me = THIS_MODULE, .af = NFPROTO_IPV4, .priority = NF_IP_PRI_FILTER, }; (net/ipv4/netfilter/iptable_filter.c)
在 iptable_filter.c[2] 模块的初始化函数 [iptable_filter_init]( 执行如下初始化过程:
通过 .valid_hooks 属性迭代 xt_table 将生效的每一个 hook,对于 filter 来说是 NF_INET_LOCAL_IN,NF_INET_FORWARD和 NF_INET_LOCAL_OUT这 3 个 hook 。
对每一个 hook,使用 xt_table 的 priority 属性向 hook 注册一个回调函数 。
不同 table 的 priority 值如下:


以上关于本文的内容,仅作参考!温馨提示:如遇专业性较强的问题(如:疾病、健康、理财等),还请咨询专业人士给予相关指导!

「辽宁龙网」www.liaoninglong.com小编还为您精选了以下内容,希望对您有所帮助: