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