目录
一、前言
二、Netfilter 构成
三、Netfilter 转发框架
四、Netfilter 与 iptables
五、Netfilter 与 ebtables
一、前言
Netfilter 是 Linux 内核的数据包处理框架,由 Rusty Russell 于 1998 年开发, 旨在改进以前的 ipchains(Linux2.2.x)和 ipfwadm(Linux2.0.x)数据包处理框架。
二、Netfilter 构成
Netfilter 详细构成如下所示:
从上图我们可以看出,Netfilter 框架采用了高内聚、低耦合的模块化设计理念。主要由 Netfilter hook API、内核防火墙子模块、用户态配置工具/应用程序 3 部分组成。
- Netfilter hook API:Netfilter 在网络协议栈处理数据包的关键流程中定义了 5 个 Hook 点,其它内核防火墙子模块(比如 ip_tables.ko)可以向这些 hook 点注册处理函数,这样当数据包经过这些 hook 点时,其上注册的处理函数将被依次调用。
- 内核防火墙子模块:Netfilter 提供了整个防火墙的框架,各个协议基于 Netfilter 框架来自己实现自己的防火墙功能。每个协议都有自己独立的表来存储自己的配置信息,他们之间完全独立的进行配置和运行。
- 链路层(2 层)防火墙子模块:ebtables,对运行在 Bridge 中协议报文进行处理。
- ARP(2.5 层)防火墙子模块:arptables,对 ARP 协议报文进行处理。
- 网络层(3 层)防火墙子模块:iptables(IPv4)、ip6tables(IPv6)分别对 IPv4协议栈与IPv6协议栈中的报文进行处理。
- nf_tables:旨在替换现有的 {ip,ip6,arp,eb}tables 框架,它使用现有的 Netfilter hook API,为 {ip,ip6}tables 提供一个新的包过滤框架、一个新的用户空间实用程序(nft)和一个兼容层。 Centos 8 已经使用 nftables 框架替代 iptables 框架作为默认的网络包过滤工具。
- NAT 子系统:网络地址转换(SNAT、DNAT)。
- Conntrack:连接跟踪模块,内核实现 statefull firewall、L4LB功能的主要模块。
- Logging:nf_log,主要提供 Netfilter 的日志记录服务。使用 nft 添加规则,Netfilter 抛出日志,然后用户态的 ulogd2 程序监听读取这些日志后。 ulogd2 会将这些数据包日志转换成json、sqlite3/mysql、pcap等多种格式文件,方便进行分析或用于进行其他的数据处理(审计、分析等)。
- Queueing:nf_queue,内核在 Netfilter 框架基础上提供的 ip_queue/nfnetlink_queue 机制,通常用于将数据包上送给用户空间的应用程序进行处理,从而使得基于用户态的防火墙开发成为可能。
- Xtables:主要包含{eb,arp,ip,ip6}tables模块所使用的共享代码部分。后来,Xtables或多或少被用来指整个防火墙(v4、v6、arp和eb)体系结构。
- 用户态配置工具/应用程序:每个内核防火墙子模块(除了 Xtables)都有一个对应的用户态配置工具/应用程序。在讲述内核防火墙子模块的时候已经进行了相应介绍,这里不再进行赘述。
三、Netfilter 转发框架
数据包在 Netfilter 框架中的转发路径如下图所示:
上图协议栈主要分为 4 层,蓝色框为链路层、绿色框为网络层、黄色框为协议层、红色框为应用层。
图中绿色小方框表示 iptables 的表和链,蓝色小方框表示 ebtables 的表和链。在 br-nf 的作用下(从2.6 kernel开始)可以支持在链路层调用 iptables 的表和链。
br-nf 的引入是为了解决在链路层 Bridge 中处理 IP 数据包的问题(比如:在链路层内进行IP DNAT,外部机器与主机上虚拟机之间的通信流量),br-nf 也是 openstack 中实现安全组功能的基础。
四、Netfilter 与 iptables
Netfilter 在 网络层(L3)提供了以下 5 个 hook 点,包经过协议栈时会触发内核模块注册在这里的处理函数。触发哪个 hook 取决于包的方向(ingress/egress)、包的目的地址、包在上一个 hook 点是被丢弃还是拒绝等等。
include/uapi/linux/netfilter.henum nf_inet_hooks { NF_INET_PRE_ROUTING,NF_INET_LOCAL |
---|