8.2. 从 iptables 迁移到 nftables
如果您的防火墙配置仍然使用 iptables
规则,则您可以将 iptables
规则迁移到 nftables
。
8.2.1. 使用 firewalld、nftables 或者 iptables 时
以下是您应该使用以下工具之一的概述:
-
firewalld
:对简单的防火墙用例使用firewalld
工具。此工具易于使用,并涵盖了这些场景的典型用例。 -
nftables
:使用nftables
工具来设置复杂和性能关键的防火墙,如用于整个网络。 -
iptables
:Red Hat Enterprise Linux 上的iptables
工具使用nf_tables
内核 API 而不是传统的
后端。nf_tables
API 提供了向后兼容性,以便使用iptables
命令的脚本仍可在 Red Hat Enterprise Linux 上工作。对于新的防火墙脚本,红帽建议使用nftables
。
要防止不同的与防火墙相关的服务(firewalld
、nftables
或 iptables
)相互影响,请在 RHEL 主机上仅运行其中一个服务,并禁用其他服务。
8.2.2. nftables 框架中的概念
与 iptables
框架相比,nftables
提供了更加现代化、高效且更灵活的替代选择。与 iptables
相比,有几个提供高级功能和改进的概念和功能。这些增强功能简化了规则管理,并改进性能,使 nftables
成为复杂和高性能网络环境的现代替代方案。
nftables
框架包含以下组件:
- 表和命名空间
-
在
nftables
中,表代表组织单元或命名空间,它们将相关的防火墙链、集合、流tables 和其他对象分组在一起。在nftables
中,表提供了一种更灵活的方法来结构防火墙规则和相关组件。在iptables
中,表更严格地定义在特定目的。 - 表系列
-
nftables
中的每个表都与特定系列关联(ip
、ip6
、inet
、arp
、bridge
或netdev
)。此关联决定了表可以处理哪些数据包。例如,ip
系列中的一个表只处理 IPv4 数据包。另一方面,inet
是表系列的特殊案例。它提供了跨协议的统一方法,因为它可以处理 IPv4 和 IPv6 数据包。特殊表系列的另一个情况是netdev
,因为它用于直接应用到网络设备的规则,从而在设备级别上启用过滤。 - 基本链
nftables
中的基本链是数据包处理管道中高度可配置的入口点,允许用户指定以下内容:- 链的类型,如 "filter"
- 数据包处理路径中的 hook 点,如 "input", "output", "forward"
- 链的优先级
通过这种灵活性,可以精确控制规则在通过网络堆栈时应用到数据包的时间和方式。链的一种特殊情况是
路由
链,用于根据数据包标头影响内核提出的路由决策。- 用于规则处理的虚拟机
-
nftables
框架使用内部虚拟机来处理规则。此虚拟机执行与装配语言操作类似的指令(将数据加载到寄存器中,执行比较等)。这种机制可以实现高度灵活、高效的规则处理。
nftables
中的增强功能可以作为该虚拟机的新指令引入。这通常需要一个新的内核模块,并对 libnftnl
库和 nft
命令行工具进行更新。
或者,您可以通过将现有指令以创新方式结合来引进新功能,而无需进行内核修改。nftables
规则的语法反映了底层虚拟机的灵活性。例如,规则 元标记设置 tcp dport map { 22: 1, 80: 2 }
将数据包的防火墙标记设置为 1 (如果 TCP 目的地端口为 22),如果端口为 80,则设为 2。这展示了如何简洁地表达复杂逻辑。
- 实践课程学习和增强
-
nftables
框架集成并扩展ipset
工具的功能,用于iptables
在 IP 地址、端口、其他数据类型上批量匹配,最重要的是,其中的组合。此集成可让您在nftables
中直接管理大量和动态数据集。接下来,nftables
原生支持基于任何数据类型的多个值或范围匹配的数据包,这增强了其处理复杂过滤要求的能力。使用nftables
,您可以操作数据包中的任何字段。
在 nftables
中,集合可以命名为 或 anonymous。命名的集合可由多个规则引用并动态修改。匿名集合在规则内内联定义,并且是不可变的。集合可以包含组合不同类型的元素,如 IP 地址和端口号对。此功能在匹配复杂标准方面提供了更大的灵活性。要管理集合,内核可以根据特定要求(性能、内存效率等)选择最合适的后端。设置也可以使用键值对作为映射。value 部分可用作数据点(写入数据包标头的值),或者作为要跳到的链的值。这可启用复杂和动态规则行为,称为"verdict 映射"。
- 灵活的规则格式
-
nftables
规则的结构非常简单。条件和操作从左到右应用。这种直观的格式简化了创建和故障排除的规则。
规则中的条件在逻辑上连接(与 AND 运算符)一起,这意味着所有条件都必须评估为 "true" 才能匹配的规则。如果有任何条件失败,评估将移到下一个规则。
nftables
中的操作可以是最终的操作,如 drop
或 accept
,这样可停止对数据包进行进一步处理。非终端操作,如 计数器日志元标记设置 0x3
,执行特定的任务(计算数据包、日志记录、设置标记等),但允许评估后续规则。
其他资源
-
nft(8)
man page - iptables 之后是什么?当然,它的继任者是:nftables
- Firewalld:未来是 nftables
8.2.3. 弃用的 iptables 框架中的概念
与主动维护的 nftables
框架类似,弃用的 iptables
框架允许您执行各种数据包过滤任务、日志记录和审计、与 NAT 相关的配置任务等。
iptables
框架由多个表组成,每个表都为特定目的设计:
filter
- 默认表确保常规数据包过滤
nat
- 对于网络地址转换(NAT),包括更改数据包的源和目标地址
mangle
- 对于特定的数据包更改,您可以针对高级路由决策对数据包标头进行修改
raw
- 对于在连接跟踪前需要发生的配置
这些表作为单独的内核模块实施,其中每个表都提供一组固定的内置链,如 INPUT
、OUTPUT
和 FORWARD
。链是指对数据包进行评估的规则序列。这些将 hook 链在内核中数据包处理流中的特定点。链在不同的表中具有相同的名称,但它们的执行顺序由相应的 hook 优先级决定。优先级由内核在内部管理,以确保规则以正确的序列应用。
最初,iptables
旨在处理 IPv4 流量。但是,由于 IPv6 协议的出现,需要引入 ip6tables
工具来提供可比较功能(作为 iptables
),并允许用户创建和管理 IPv6 数据包的防火墙规则。使用相同的逻辑,创建了 arptables
工具来处理地址解析协议(ARP),并且为处理以太网桥接帧而开发了 ebtables
工具。这些工具可确保您可以在各种网络协议中应用 iptables
的数据包过滤功能,并提供全面的网络覆盖。
为增强 iptables
的功能,可以开始开发的扩展。功能扩展通常作为与用户空间动态共享对象(DSO)配对的内核模块实现。扩展引入了"匹配"和"目标",您可以在防火墙规则中使用它们来执行更复杂的操作。扩展可以启用复杂的匹配和目标。例如,您可以匹配或操作特定的第 4 层协议标头值,执行速率限制、强制实施配额等。某些扩展旨在解决默认的 iptables
语法中的限制,如"多端口"匹配扩展。此扩展允许单个规则与多个非安全端口匹配,以简化规则定义,从而减少所需的单个规则数量。
ipset
是 iptables
的特殊功能扩展。这是一个内核级别的数据结构,它与 iptables
一起使用来创建与数据包匹配的 IP 地址、端口号和其他与网络相关的元素集合。这些设置可显著简化、优化并加快编写和管理防火墙规则的过程。
其他资源
-
iptables (8)
手册页
8.2.4. 将 iptables 和 ip6tables 规则集转换为 nftables
使用 iptables-restore-translate
和 ip6tables-restore-translate
实用程序将 iptables
和 ip6tables
规则集转换为 nftables
。
前提条件
-
已安装
nftables
和iptables
软件包。 -
系统配置了
iptables
和ip6tables
规则。
流程
将
iptables
和ip6tables
规则写入一个文件:# iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dump
将转储文件转换为
nftables
指令:# iptables-restore-translate -f /root/iptables.dump > /etc/nftables/ruleset-migrated-from-iptables.nft # ip6tables-restore-translate -f /root/ip6tables.dump > /etc/nftables/ruleset-migrated-from-ip6tables.nft
-
检查,如果需要,手动更新生成的
nftables
规则。 要启用
nftables
服务来加载生成的文件,请在/etc/sysconfig/nftables.conf
文件中添加以下内容:include "/etc/nftables/ruleset-migrated-from-iptables.nft" include "/etc/nftables/ruleset-migrated-from-ip6tables.nft"
停止并禁用
iptables
服务:# systemctl disable --now iptables
如果您使用自定义脚本加载
iptables
规则,请确保脚本不再自动启动并重新引导以刷新所有表。启用并启动
nftables
服务:# systemctl enable --now nftables
验证
显示
nftables
规则集:# nft list ruleset
8.2.5. 将单个 iptables 和 ip6tables 规则转换为 nftables
Red Hat Enterprise Linux 提供了 iptables-translate
和 ip6tables-translate
工具来将 iptables
或 ip6tables
规则转换为与 nftables
相等的规则。
前提条件
-
已安装
nftables
软件包。
流程
使用
iptables-translate
或ip6tables-translate
程序而不是iptables
或ip6tables
显示对应的nftables
规则,例如:# iptables-translate -A INPUT -s 192.0.2.0/24 -j ACCEPT nft add rule ip filter INPUT ip saddr 192.0.2.0/24 counter accept
请注意,一些扩展可能缺少响应的转换支持。在这些情况下,实用程序会输出以
#
符号为前缀的未转换规则,例如:# iptables-translate -A INPUT -j CHECKSUM --checksum-fill nft # -A INPUT -j CHECKSUM --checksum-fill
其他资源
-
iptables-translate --help
8.2.6. 常见的 iptables 和 nftables 命令的比较
以下是常见 iptables
和 nftables
命令的比较:
列出所有规则:
iptables nftables iptables-save
nft list ruleset
列出某个表和链:
iptables nftables iptables -L
nft list table ip filter
iptables -L INPUT
nft list chain ip filter INPUT
iptables -t nat -L PREROUTING
nft list chain ip nat PREROUTING
nft
命令不会预先创建表和链。只有当用户手动创建它们时它们才会存在。列出 firewalld 生成的规则:
# nft list table inet firewalld # nft list table ip firewalld # nft list table ip6 firewalld