netfilter机制就不详述了,只想纪录一下netfilter模块匹配顺序。
比如下面的hook结构:
struct nf_hook_ops my_hook = {
.hook = hook_func,
.hooknum = NF_INET_PRE_ROUTING,
.pf = PF_INET,
.priority = NF_IP_PRI_FIRST,
};
优先级定义为:NF_IP_PRI_FIRST,
如果有两个以上的模块都声明自己是NF_IP_PRI_FIRST,那么谁先?谁后呢?
加载模块的顺序为:
insmod myhook1
insmod myhook2
经实测,优先级匹配顺序类似队列的FIFO模式,先到先得,实际是myhook1先处理,
如果myhook1返回NF_ACCEPT,myhook2才能获取数据包,
myhook1返回NF_STOP或NF_DROP,myhook2都获取不到包。
类似iptables -A的加载顺序,后来的规则追加在后面,是否能执行取决于前面规则的执行结果。
iptables -I模式正好相反,是类似“栈”的模式,后进先得,总是把规则插入到匹配链的最前面。