8.2. 从 iptables 迁移到 nftables
如果您的防火墙配置仍然使用 iptables
规则,则您可以将 iptables
规则迁移到 nftables
。
8.2.1. 使用 firewalld、nftables 或者 iptables 时 复制链接链接已复制到粘贴板!
在 RHEL 8 中,您可以根据您的情况使用以下数据包过滤工具:
-
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
中,表代表组织单元或命名空间,其将相关的防火墙链、集合、流表和其他对象分组在一起。在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
,执行特定的任务(计算数据包、日志记录、设置标记等),但允许评估后续规则。
8.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 地址、端口号和其他与网络有关的您可以匹配数据包的元素的集合。这些集合可显著简化、优化并加快编写和管理防火墙规则的过程。
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
# iptables-save >/root/iptables.dump # ip6tables-save >/root/ip6tables.dump
Copy 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.nft
Copy 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 iptables
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果您使用自定义脚本加载
iptables
规则,请确保脚本不再自动启动并重新引导以刷新所有表。启用并启动
nftables
服务:systemctl enable --now nftables
# systemctl enable --now nftables
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
显示
nftables
规则集:nft list ruleset
# nft list ruleset
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
# 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
Copy 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-fill
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
8.2.6. 常见的 iptables 和 nftables 命令的比较 复制链接链接已复制到粘贴板!
以下是常见 iptables
和 nftables
命令的比较:
列出所有规则:
Expand iptables nftables iptables-save
nft list ruleset
列出某个表和链:
Expand 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
# nft list table inet firewalld # nft list table ip firewalld # nft list table ip6 firewalld
Copy to Clipboard Copied! Toggle word wrap Toggle overflow