第 6 章 nftables 入门
nftables
框架提供数据包分类工具,它是 iptables
、ip6tables
、arptables
、ebtables
和 ipset
工具的指定成功者。与之前的数据包过滤工具相比,它在方便、特性和性能方面提供了大量改进,最重要的是:
- 内置查找表而不是线性处理
IPv4
和IPv6
协议的单一框架- 规则会以一个整体被应用,而不是分为抓取、更新和存储完整的规则集的步骤
- 支持在规则集(
nftrace
)和监控追踪事件(nft
)中调试和追踪 - 更加一致和压缩的语法,没有特定协议的扩展
- 用于第三方应用程序的 Netlink API
与
iptables
类似,nftables
使用表来存储链。链包含执行动作的独立规则。nft
工具替换了之前数据包过滤框架中的所有工具。libnftnl
库可用于通过 libmnl
库与 nftables
Netlink API 进行低级交互。
要显示规则集变化的影响,请使用 nft list ruleset 命令。由于这些工具将表、链、规则、集合和其他对象添加到
nftables
规则集,请注意 nftables
规则集操作(如 nft flush ruleset 命令)可能会影响使用之前独立的旧命令安装的规则集。
何时使用 firewalld 或 nftables
firewalld
:将firewalld
工具用于简单的防火墙
用例。此工具易于使用,并涵盖了这些场景的典型用例。nftables
:使用nftables
工具来设置复杂和性能关键的防火墙,如用于整个网络。
重要
要避免不同的防火墙服务相互影响,在 RHEL 主机中只有一个服务,并禁用其他服务。
6.1. 编写和执行 nftables 脚本
nftables
框架提供了一个原生脚本环境,它比使用 shell 脚本维护 防火墙规则
提供了主要优势:执行脚本是原子的。这意味着,系统会应用整个脚本,或者在出现错误时防止执行。这样可保证防火墙始终处于一致状态。
另外,
nftables
脚本环境使管理员能够:
- 添加评论
- 定义变量
- 包含其他规则集文件
本节介绍如何使用这些功能,以及创建和执行
nftables
脚本。
当您安装 nftables 软件包时,Red Hat Enterprise Linux 会在
/etc/nftables/
目录中自动创建 If nft
脚本。这些脚本包含为不同目的创建表和空链的命令。
6.1.1. 支持的 nftables 脚本格式
nftables
脚本环境支持以下格式的脚本:
- 您可以以与 nft list ruleset 命令相同的格式编写脚本,显示规则集:
#!/usr/sbin/nft -f # Flush the rule set flush ruleset table inet example_table { chain example_chain { # Chain for incoming packets that drops all packets that # are not explicitly allowed by any rule in this chain type filter hook input priority 0; policy drop; # Accept connections to port 22 (ssh) tcp dport ssh accept } }
- 您可以使用与
nft
命令相同的语法:#!/usr/sbin/nft -f # Flush the rule set flush ruleset # Create a table add table inet example_table # Create a chain for incoming packets that drops all packets # that are not explicitly allowed by any rule in this chain add chain inet example_table example_chain { type filter hook input priority 0 ; policy drop ; } # Add a rule that accepts connections to port 22 (ssh) add rule inet example_table example_chain tcp dport ssh accept
6.1.2. 运行 nftables 脚本
您可以通过将脚本传递给
nft
工具或直接执行脚本来运行 nftables
脚本。
先决条件
- 本节的流程假设您在
/etc/
文件中存储了一个 nftables 脚本。nftables
/example_firewall.nft
过程 6.1. 使用 nft
工具运行 nftables 脚本
- 要通过将其传给
nft
工具来运行nftables
脚本,请输入:# nft -f /etc/nftables/example_firewall.nft
过程 6.2. 直接运行 nftables
脚本:
- 只需要执行一次的步骤:
- 确保脚本以以下 shebang 序列开头:
#!/usr/sbin/nft -f
重要如果省略-f
参数,nft
工具不会读取脚本,并显示 Error: syntax error, unexpected newline, expecting string。 - 可选:将脚本的所有者设置为
root
:# chown root /etc/nftables/example_firewall.nft
- 使脚本可以被其所有者执行:
# chmod u+x /etc/nftables/example_firewall.nft
- 运行脚本:
# /etc/nftables/example_firewall.nft
如果没有输出结果,系统将成功执行该脚本。
重要
即使
nft
成功地执行了脚本,在脚本中错误放置的规则、缺失的参数或其他问题都可能会导致防火墙的行为不符合预期。
其他资源
- 有关设置文件所有者的详情,请查看
chown (1)
手册页。 - 有关设置文件权限的详情,请查看
chmod (1)
手册页。 - 有关使用系统引导载入
nftables
规则的更多信息,请参阅 第 6.1.6 节 “系统引导时自动载入 nftables 规则”
6.1.3. 使用 nftables 脚本中的注释
nftables
脚本环境将 #
字符右侧的所有内容解释为注释。
例 6.1. nftables 脚本中的注释
注释可在一行的开始,也可以在命令后:
... # Flush the rule set flush ruleset add table inet example_table # Create a table ...
6.1.4. 使用 nftables 脚本中的变量
要在
nftables
脚本中定义一个变量,请使用 define
关键字。您可以在变量中存储单个值和匿名集合。对于更复杂的场景,请使用命名集或 verdict 映射。
只有一个值的变量
以下示例定义了名为
INET_DEV
的变量,其值为 enp1s0 :
define INET_DEV = enp1s0
您可以通过在
$
符号后跟变量名称来在脚本中使用变量:
...
add rule inet example_table example_chain iifname $INET_DEV
tcp dport ssh accept
...
包含匿名集合的变量
以下示例定义了一个包含匿名集合的变量:
define DNS_SERVERS = { 192.0.2.1, 192.0.2.2 }
您可以通过在
$
符号后跟变量名称来在脚本中使用变量:
add rule inet example_table example_chain ip daddr $DNS_SERVERS
accept
注意
请注意,在规则中使用大括号时具有特殊的意义,因为它们表示变量代表一个集合。
其他资源
- 有关集合的详情请参考 第 6.4 节 “使用 nftables 命令中的设置”。
- 有关验证映射的详情,请参考 第 6.5 节 “在 nftables 命令中使用 verdict 映射”。
6.1.5. 在 nftables 脚本中包含文件
nftables
脚本环境可让管理员使用 include
语句包含其他脚本。
如果您只指定了文件名,而没有绝对路径或相对路径,那么
nftables
将包含默认搜索路径中的文件,在 Red Hat Enterprise Linux 上,该路径设为 /etc
。
例 6.2. 包含默认搜索目录中的文件
从默认搜索目录中包含一个文件:
include "example.nft"
例 6.3. 包括一个 目录中的所有 Ifnft
文件
要包含在
/etc/nftables/rulesets/
目录中以 If nft
结尾的所有文件:
include "/etc/nftables/rulesets/*.nft"
请注意,
include
语句不匹配以点开头的文件。
其他资源
- 详情请查看
nft (8)
手册页中的Include files
部分。
6.1.6. 系统引导时自动载入 nftables 规则
nftables
systemd 服务加载包含在 /etc/sysconfig/nftables.conf
文件中的防火墙脚本。这部分论述了如何在系统引导时载入防火墙规则。
先决条件
nftables
脚本存储在/etc/nftables/
目录中。
过程 6.3. 系统引导时自动载入 nftables 规则
- 编辑
/etc/sysconfig/nftables.conf
文件。- 如果您在安装 nftables 软件包时增强了在
/etc/nftables/
中创建的 Ifnft
脚本,请取消对这些脚本的 include 语句的注释。 - 如果您从头编写脚本,请添加 include 语句来包括这些脚本。例如,要在
nftables
服务启动时载入/etc/nftables/example.nft
脚本,请添加:include "/etc/nftables/example.nft"
- (可选)启动
nftables
服务来加载防火墙规则,而不重启系统:# systemctl start nftables
- 启用 nftables 服务。
# systemctl enable nftables
其他资源
- 如需更多信息,请参阅 第 6.1.1 节 “支持的 nftables 脚本格式”。