Netfilter 围绕网络协议栈(主要在网络层)埋下了 5 个钩子(也称 hook)1,用来干预 Linux 网络通信。
内核中的其他模块(如 iptables、IPVS 等)向这些钩子注册回调函数。当数据包进入内核网络协议栈并经过这些钩子时,注册的回调函数自动触发,从而对数据包进行相应的干预和处理。
这 5 个钩子的名称与含义如下:
这 5 个钩子在网络协议栈的位置如图 3-2 所示。
:::center
图 3-2 Netfilter 的 5 个钩子
:::
Netfilter 允许同一个钩子处注册多个回调函数,每个回调函数有明确的优先级,确保按照预定顺序触发。一个钩子处的多个回调函数串联起来便形成了一条“回调链”(Chained Callbacks)。这种设计使得基于 Netfilter 构建的上层应用大多带有“链”的概念,如稍后将介绍的 iptables。
hook 设计模式在其他软件系统中随处可见,如本书后面介绍的 eBPF、Kubernetes 等等,Kubernetes 在编排调度、网络、资源定义等通过暴露接口的方式,允许用户根据自己的需求插入自定义代码或逻辑来扩展 Kubernetes 的功能。 ↩