6.4. 使用 nftables 命令中的设置
nftables
框架原生支持集合。您可以使用一个集合,例如,规则匹配多个 IP 地址、端口号、接口或其他匹配标准。
6.4.1. 在 nftables 中使用匿名集合
匿名集合包含用逗号分开的值,如
{ 22, 80, 443 }
,您直接在规则中使用。您还可以将匿名集合用于 IP 地址或其他匹配标准。
匿名集合的缺陷是,如果要更改集合,则需要替换规则。对于动态解决方案,请使用命名集,如 第 6.4.2 节 “在 nftables 中使用命名集” 所述。
先决条件
inet
系列中的 example_chain 链和 example_table 表存在。
过程 6.13. 在 nftables 中使用匿名集合
- 例如,要向 example_table 中的 example_chain 添加一条规则,其允许传入流量到端口
22
、80
和443
:# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } accept
- 另外,还可在 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, http, https } accept } }
6.4.2. 在 nftables 中使用命名集
nftables
框架支持可变命名集合。命名集是一个列表或一组元素,您可以在表中的多个规则中使用。匿名集合的另外一个好处在于,您可以更新命名的集合而不必替换使用集合的规则。
当您创建一个命名集时,必须指定集合包含的元素类型。您可以设置以下类型:
- 包含 IPv4 地址或范围的集合的
ipv4_addr
,如192.0.2.1
或192.0.2.0/24
。 - 包含
IPv6
地址或范围的集合的ipv6_addr
,如2001:db8:1::1
或2001:db8:1::1/64
。 - 包含介质访问控制(
MAC
)地址列表的集合的ether_addr
,如52:54:00:6b:66:42
。 - 包含互联网协议类型列表的集合的
inet_proto
,如tcp
。 - 包含互联网服务列表的集合的
inet_service
,如ssh
。 - 包含数据包标记列表的集合的
mark
。数据包标记可以是任意正 32 位整数值(0
到2147483647
)。
先决条件
- example_chain 链和 example_table 表存在。
过程 6.14. 在 nftables 中使用命名集
创建一个空集。以下示例为
IPv4
地址创建一个集合:- 要创建可存储多个独立
IPv4
地址的集合:# nft add set inet example_table example_set { type ipv4_addr \; }
- 要创建可存储
IPv4
地址范围的集合:# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。- 另外,还可创建使用该集合的规则。例如,以下命令向 example_table 中的 example_chain 添加一条规则,该规则将丢弃 example_set 中来自
IPv4
地址的所有数据包。# nft add rule inet example_table example_chain ip saddr @example_set drop
由于 example_set 仍为空,所以该规则目前不起作用。 向 example_set 中添加 IPv4 地址:
- 如果您创建存储单个
IPv4
地址的集合,请输入:# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }
- 如果您创建存储
IPv4
范围的集合,请输入:# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }
当您指定 IP 地址范围时,您也可以使用无类别域间路由(CIDR)标记,如上例中的192.0.2.0/24
。
6.4.3. 相关信息
有关集合的详情,请查看
nft (8)
手册页中的 Sets
部分。