Netfilter说白了就是针对不同的协议(协议类型和hook节点我们上一章已经讲过)在kernel中放置了不同的hook节点,等数据包sk_buff,到来的时候,要给hook节点进行过滤,下图为IP层的五个hook点的位置:
在讲具体流程之前我们要介绍一个结构体:struct nf_hook_ops
struct nf_hook_ops {
struct list_head list; //链表
/* User fills in from here down. */
nf_hookfn *hook; //hook的处理函数
struct module *owner;
u_int8_t pf; //协议类型
unsigned int hooknum; //hook点,也就是上图的5个hook点
/* Hooks are ordered in ascending priority. */
int priority; //优先级(越小优先级越高)
};
从结构体的内容可以看书,它是双向循环链表的数据结构,在kernel代码中很常见到list_head。
下面我们分析hooks的注册流程。
首先我们要注册h