anonymous set 仅用于批量匹配多个值并统一应用动作,本身不具封锁能力;真正封闭端口需配合 drop 动作,如 nft add rule inet filter input tcp dport {22,80,443} drop,且须置于允许规则之后、默认策略之前以确保生效。

Anonymous Set(匿名集合)不能用来“封闭端口”,它的作用是**批量匹配多个值并统一应用动作(如 accept 或 drop)**,本质是简化规则写法,而非实现端口封锁的逻辑。真正封闭端口,靠的是 显式拒绝规则,比如 tcp dport { 22, 80, 443 } drop —— 这条才是“在单行里封掉多个端口”的正确做法。
为什么不能用 Anonymous Set 单独“封闭”端口
Anonymous Set 本身不带行为,它只是把多个目标组织在一起;必须配合一个动作(accept/drop/jump 等)才有意义。所谓“封闭”,就是让匹配到的流量被丢弃,所以关键不是集合,而是 drop 动作 + 精准位置。
如何用单行命令封掉指定端口(含 IPv4/IPv6)
推荐使用 inet 地址簇表,一并覆盖 IPv4 和 IPv6:
-
nft add rule inet filter input tcp dport { 22, 80, 443 } drop—— 封 SSH、HTTP、HTTPS 入站连接 -
nft add rule inet filter input udp dport { 53, 123 } drop—— 封 DNS、NTP 的 UDP 入站 - 若只想封特定源 IP 的这些端口:
nft add rule inet filter input ip saddr { 192.168.1.100, 2001:db8::1 } tcp dport { 22, 23 } drop
注意顺序和默认策略,否则封不住
这条 drop 规则必须放在允许规则之后、默认 policy 之前,否则可能被提前放行或跳过。例如:
- 如果你的链默认是
policy accept,那没加 drop 规则就等于全放行 - 如果你用了
ct state established,related accept,它会放回包,但新连接仍受你这条 drop 控制 - 务必确认没有更靠前的
accept规则(比如宽松的ip saddr 10.0.0.0/8 accept)把它覆盖了
替代方案:用 counter + log 辅助验证是否真封住了
加个计数器能快速确认规则是否命中:
nft add rule inet filter input tcp dport { 22, 80 } counter drop- 然后执行
nft list chain inet filter input,看 counter 值是否增长 - 搭配 log(需启用
CONFIG_NFT_LOG)可进一步排查:添加log prefix "BLOCKED-PORT: "到规则中











