6.2. 创建和管理 nftables 表、链和规则
本节介绍如何显示
nftables
规则集以及如何管理它。
6.2.1. 显示 nftables 规则集
nftables
的规则集包含表、链和规则。本节介绍如何显示此规则集。
要显示所有规则集,请输入:
# nft list ruleset table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport http accept tcp dport ssh accept } }
注意
默认情况下,
nftables
不预先创建表。因此,在没有表的情况下显示主机上设置的规则,nft list ruleset 命令不会显示任何输出。
6.2.2. 创建 nftables 表
nftables
中的表是包含链、规则、集合和其他对象集合的名字空间。本节介绍如何创建表。
每个表都必须定义一个地址系列。表的地址系列定义了表进程的类型。在创建表时,您可以设置以下地址系列之一:
ip
:仅匹配 IPv4 数据包。如果没有指定地址系列,这是默认设置。ip6
: 仅匹配 IPv6 数据包。inet
: 匹配 IPv4 和 IPv6 数据包。arp
: 匹配 IPv4 地址解析协议(ARP)数据包。网桥
:匹配遍历网桥设备的数据包。netdev
:匹配来自 ingress 的数据包。
过程 6.4. 创建 nftables 表
- 使用 nft add table 命令来创建新表。例如,要创建一个名为 example_table 的表,用于处理
IPv4
和IPv6
数据包:# nft add table inet example_table
- 另外,还可列出规则集中的所有表:
# nft list tables table inet example_table
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在表中运行的其他操作的详情,请查看
nft (8)
手册页中的Tables
部分。
6.2.3. 创建 nftables 链
chains 是规则的容器。存在以下两种规则类型:
- 基本链:您可以使用基础链作为来自网络堆栈的数据包的入口点。
- 常规链:您可以使用常规链作为
跳过
目标,并更好地组织规则。
这个步骤描述了如何在现有表中添加基本链。
先决条件
- 已存在您要添加新链的表。
过程 6.5. 创建 nftables 链
- 使用 nft add chain 命令来创建新链。例如,要在 example_table 中创建一个名为 example_chain 的链:
# nft add chain inet example_table example_chain '{ type filter hook input priority 0 ; policy accept ; }'
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。此外,一些 shell 也解译大括号,因此请使用 ticks (1)将大括号和它们内的任何内容引用。这个链过滤传入的数据包。priority
参数指定nftables
进程处理具有相同 hook 值的链的顺序。较低优先级的值优先于优先级更高的值。policy
参数为此链中的规则设置默认操作。请注意,如果您远程登录到服务器,并将默认策略设置为drop
,如果没有其他规则允许远程访问,则会立即断开连接。 - 另外,还可以显示所有链:
# nft list chains table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链上运行的其他操作的详情,请查看
nft (8)
手册页中的链
部分。
6.2.4. 将规则附加到 nftables 链的末尾
本节介绍如何在现有 nftables 链的末尾附加规则。
先决条件
- 您要添加该规则的链已存在。
过程 6.6. 将规则附加到 nftables 链的末尾
- 要添加新规则,请使用 nft add rule 命令。例如,要在 example_table 中的 example_chain 中添加一条规则,以允许端口 22 上的 TCP 流量:
# nft add rule inet example_table example_chain tcp dport 22 accept
您还可以指定服务名称而不是端口号。在示例中,您可以使用ssh
而不是端口号22
。请注意,服务名称根据/etc/services
文件中的条目解析为端口号。 - 另外,还可在 example_table 中显示所有链及其规则:
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; ... tcp dport ssh accept } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。
6.2.5. 在 nftables 链的开头插入一条规则
本节介绍如何在现有
nftables
链的开头插入规则。
先决条件
- 您要添加该规则的链已存在。
过程 6.7. 在 nftables 链的开头插入一条规则
- 要插入新规则,请使用 nft insert rule 命令。例如,要在 example_table 中的 example_chain 插入一条规则,以允许端口
22
上的 TCP 流量:# nft insert rule inet example_table example_chain tcp dport 22 accept
您还可以指定服务名称而不是端口号。在示例中,您可以使用ssh
而不是端口号22
。请注意,服务名称根据/etc/services
文件中的条目解析为端口号。 - 另外,还可在 example_table 中显示所有链及其规则:
# nft list table inet example_table table inet example_table { chain example_chain { type filter hook input priority filter; policy accept; tcp dport ssh accept ... } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。
6.2.6. 在 nftables 链的特定位置插入一条规则
本节解释了如何在
nftables
链中的现有规则前后插入规则。这样,您可以将新规则放在正确的位置上。
先决条件
- 您要添加该规则的链已存在。
过程 6.8. 在 nftables 链的特定位置插入一条规则
- 使用 nft -a list ruleset 命令显示 example_table 中的所有链及其规则,包括其句柄:
# nft -a list table inet example_table table inet example_table { # handle 1 chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 443 accept # handle 3 tcp dport 389 accept # handle 4 } }
使用-a
显示句柄。您需要此信息才能在后续步骤中定位新规则。 - 将新规则插入到 example_table 中的 example_chain 链中:
- 要在句柄 3 前插入一条允许端口 636 上 TCP 流量的规则,请输入:
# nft insert rule inet example_table example_chain position 3 tcp dport 636 accept
- 要添加一条规则,在句柄 3 后允许端口 80 上的 TCP 流量,请输入:
# nft add rule inet example_table example_chain position 3 tcp dport 80 accept
- 另外,还可在 example_table 中显示所有链及其规则:
# nft -a list table inet example_table table inet example_table { # handle 1 chain example_chain { # handle 1 type filter hook input priority filter; policy accept; tcp dport 22 accept # handle 2 tcp dport 636 accept # handle 5 tcp dport 443 accept # handle 3 tcp dport 80 accept # handle 6 tcp dport 389 accept # handle 4 } }
其他资源
- 有关地址系列的详情,请查看
nft (8)
手册页中的Address families
部分。 - 有关您可以在链中运行的其他操作的详情,请查看
nft (8)
手册页中的Rules
部分。