2.5. 使用 nftables 命令中的集合
nftables
框架原生支持集合。您可以使用一个集合,例如,规则匹配多个 IP 地址、端口号、接口或其他匹配标准。
2.5.1. 在 nftables 中使用匿名集合 复制链接链接已复制到粘贴板!
匿名集合包含用逗号分开的值,如 { 22、80、443 }
,它们直接在规则中使用。您还可以将匿名集合用于 IP 地址以及任何其他匹配标准。
匿名集合的缺陷是,如果要更改集合,则需要替换规则。对于动态解决方案,使用命名集合,如 在 nftables 中使用命名集合 中所述。
先决条件
-
inet
系列中的example_chain
链和example_table
表存在。
流程
例如,要向
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 } accept
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 可选:在
example_table
中显示所有链及其规则:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5.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
表存在。
流程
创建一个空集。以下示例为 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 drop
Copy 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
。
2.5.3. 使用动态集添加来自数据包路径的条目 复制链接链接已复制到粘贴板!
nftables
框架中的动态设置允许自动添加来自数据包数据的元素。例如,IP 地址、目标端口、MAC 地址等。通过此功能,您可以实时收集这些元素,并使用它们创建拒绝列表、禁止列表等,以便您能够立即响应安全威胁。
先决条件
-
inet
系列中的example_chain
链和example_table
表存在。
流程
创建一个空集。以下示例为 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 将分号解释为命令结尾,您必须使用反斜杠转义分号。
创建一条规则,将传入数据包的源 IPv4 地址添加到
example_set
组中:nft add rule inet example_table example_chain set add ip saddr @example_set
# nft add rule inet example_table example_chain set add ip saddr @example_set
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令在
example_chain
规则链中创建了一个新规则,并使用example_table
将数据包的源 IPv4 地址动态添加到example_set
中。
验证
确保添加了规则:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 命令显示
nftables
中当前载入的整个规则集。它显示 IP 正在主动触发规则,并且使用相关地址更新example_set
。
后续步骤
有动态 IP 集后,您可以将它用于各种安全性、过滤和流量控制目的。例如:
- 块、限制或记录网络流量
- 与允许列表结合使用,以避免禁止可信用户
- 使用自动超时来防止过度阻塞