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# nft add rule inet example_table example_chain tcp dport { 22, 80, 443 } acceptCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 另外,还可在 example_table 中显示所有链及其规则:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 \; }# nft add set inet example_table example_set { type ipv4_addr \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 要创建可存储
IPv4地址范围的集合:nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }# nft add set inet example_table example_set { type ipv4_addr \; flags interval \; }Copy to Clipboard Copied! Toggle word wrap Toggle overflow
重要要避免 shell 认为分号作为命令结尾,您必须用反斜杠转义分号。- 另外,还可创建使用该集合的规则。例如,以下命令向 example_table 中的 example_chain 添加一条规则,该规则将丢弃 example_set 中来自
IPv4地址的所有数据包。nft add rule inet example_table example_chain ip saddr @example_set drop
# nft add rule inet example_table example_chain ip saddr @example_set dropCopy to Clipboard Copied! Toggle word wrap Toggle overflow 由于 example_set 仍为空,所以该规则目前不起作用。 向 example_set 中添加 IPv4 地址:
- 如果您创建存储单个
IPv4地址的集合,请输入:nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }# nft add element inet example_table example_set { 192.0.2.1, 192.0.2.2 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 如果您创建存储
IPv4范围的集合,请输入:nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }# nft add element inet example_table example_set { 192.0.2.0-192.0.2.255 }Copy to Clipboard Copied! Toggle word wrap Toggle overflow
当您指定 IP 地址范围时,您也可以使用无类别域间路由(CIDR)标记,如上例中的192.0.2.0/24。
6.4.3. 相关信息 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
有关集合的详情,请查看
nft (8) 手册页中的 Sets 部分。