在 图1 中,蓝色部分就是 Netfilter 挂载钩子函数的位置,所以 Netfilter 定义了 5 个常量来表示这 5 个位置,如下代码:
- // 文件:include/linux/netfilter_ipv4.h
- #define NF_IP_PRE_ROUTING 0
- #define NF_IP_LOCAL_IN 1
- #define NF_IP_FORWARD 2
- #define NF_IP_LOCAL_OUT 3
- #define NF_IP_POST_ROUTING 4
上面代码中的常量与 图1 中挂载钩子函数的位置一一对应,如常量 NF_IP_PRE_ROUTING 对应着 图1 的 PRE_ROUTING 处。
如 图2 所示,Netfilter 的每个挂载点都使用一个链表来存储钩子函数列表。在内核中,定义了一个名为 nf_hooks 的数组来存储这些链表,如下代码:
- // 文件:net/core/netfilter.c
- struct list_head nf_hooks[32][5];
struct list_head 结构是内核的通用链表结构。
从 nf_hooks 变量定义为一个二维数组,第一维是用来表示不同的协议(如 IPv4 或者 IPv6,本文只讨论 IPv4,所以可以把 nf_hooks 当成是一维数组),而第二维用于表示不同的挂载点,如 图2 中的 5 个挂载点。