这个问题是我的后续问题上一个问题。
我的逻辑是,内核防火墙位于网络访问层和互联网层之间,因为它需要访问 IP 数据包标头来读取源 IP 地址和目标 IP 地址,以便在确定是否存在之前进行过滤数据包的目的地是主机,或者如果数据包的目的地是其他地方,则应转发到下一跳。
不知何故,说防火墙是互联网层的一部分似乎也是合乎逻辑的,因为那是路由表所在的位置,并且防火墙在某些方面类似于路由表规则。
答案1
防火墙不存在于一个地方在内核网络堆栈中。例如,在 Linux 中,支持防火墙功能的底层基础设施是由网络过滤器数据包过滤框架。 netfilter 框架本身无非是一个内核协议栈中各个点的钩子集。
Netfilter提供了五个钩子:
NF_IP_PRE_ROUTING
通过初始健全性检查的数据包将被传递到
NF_IP_PRE_ROUTING
挂钩。这发生在做出任何路由决策之前。NF_IP_LOCAL_IN
发往主机本身的数据包将被传递到
NF_IP_LOCAL_IN
钩子。NF_IP_FORWARD
发往另一个接口的数据包将传递到
NF_IP_FORWARD
挂钩。NF_IP_LOCAL_OUT
本地创建的数据包在做出路由决策后传递
NF_IP_LOCAL_OUT
,尽管路由可能因挂钩而改变。NF_IP_POST_ROUTING
钩子
NF_IP_POST_ROUTING
是数据包在网络上传输之前可以传递到的最终钩子。
防火墙由一个内核模块组成,该模块为netfilter框架提供的每个钩子注册一个回调函数;以及用于配置防火墙的用户空间工具。每次将数据包传递给钩子时,都会调用相应的回调函数。回调函数可以自由地操作触发回调的数据包。回调函数还确定是否进一步处理数据包;掉落;由回调本身处理;排队,通常用于用户空间处理;或者是否应该为数据包再次调用相同的钩子。
Netfilter 通常与iptables数据包过滤器。作为Gnouc 已经在你之前的问题中指出了iptables 有一个内核模块 ,ip_tables
它与 netfilter 接口,还有一个用户空间程序 ,iptables
用于配置内核中的数据包过滤器。事实上,iptables 数据包过滤器提供了多种工具,每种工具都与不同类型的数据包处理相关:
用户空间工具
iptables
和ip_tables
内核模块关心的是IPv4数据包过滤。用户空间工具
ip6tables
和ip6_tables
内核模块关心的是IPv6数据包过滤。用户空间工具
arptables
和arp_tables
内核模块关心的是ARP数据包过滤。
除了 iptables 数据包过滤器之外,ebtables
用户空间工具和eb_tables
内核模块关心链路层以太网帧过滤。这些工具有时统称为扩展表,因为类似的基于表的架构。
该架构提供了基于以下内容的数据包选择抽象:桌子数据包沿着。每个表都包含包过滤规则组织于链条。五个预定义链:PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING 对应于 netfilter 提供的五个内核挂钩。规则所属的表决定了规则应用于特定 netfilter 挂钩时的相对顺序:
- 该
raw
表先于任何其他表过滤数据包。 - 该
mangle
表用于更改数据包。 - 该
nat
表用于网络地址解读(例如端口转发)。 - 该
filter
表用于数据包过滤,它不应该改变数据包。 - 该
security
表用于由 Linux 安全模块 (LSM)(例如 SELinux)实现的强制访问控制 (MAC) 网络规则。
Jan Engelhardt 的下图显示了表和链如何对应 OSI 模型的不同层:
今年早些时候,一个新的数据包过滤框架被称为nftables已合并到主线 Linux 内核版本 3.13 中。 nftables 框架旨在取代现有的 xtables 工具。它也基于 netfilter 基础设施。
类 Unix 操作系统中其他基于内核的防火墙包括IP过滤器(多平台),PF(OpenBSD,移植到各种其他 BSD 变体和 Mac OS X),NPF(NetBSD),ip防火墙(FreeBSD,移植到各种操作系统)。