必须选 inet 而不是 ip + ip6 分开配,因其可统一处理双栈流量、避免规则遗漏与维护重复;inet 表使同一规则自动适配 IPv4/IPv6,共享连接跟踪、日志和限速,内核按协议族匹配,无需人工分流。

直接用 inet 地址簇统一配置,一条规则同时生效于 IPv4 和 IPv6,无需写两套逻辑、不重复维护、不遗漏策略。
为什么必须选 inet 而不是 ip + ip6 分开配
分开配 ip 表和 ip6 表看似“精确”,实则埋下运维隐患:SSH 放行写了 IPv6 却漏了 IPv4,ICMP 限速只在 IPv4 生效而 IPv6 被扫穿,连接跟踪状态不共享导致 NEW 包误判。inet 表让内核自动按协议族匹配,同一 rule 中的 tcp dport 22、ct state new、icmp type echo-request 等条件对双栈天然兼容,底层共用 conntrack,日志、计数器、限速也统一归一。
基础双栈表链结构怎么搭
- 清空(仅测试环境):
nft flush ruleset - 建表:
nft add table inet filter - 建 input 链并设默认拒绝:
nft add chain inet filter input { type filter hook input priority 0 ; policy drop ; } - 放行已建立连接:
nft add rule inet filter input ct state established,related accept - 丢弃无效状态:
nft add rule inet filter input ct state invalid drop
这五步构成有状态过滤骨架,IPv4 和 IPv6 共享连接跟踪上下文,无需额外声明或桥接。
如何精准适配 IPv6 特有需求
不是全盘放行 ICMPv6,而是按协议必需性分级处理:
- 邻居发现(NDP)必须放行:
nft add rule inet filter input ip6 nexthdr icmpv6 icmpv6 type { nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert } accept - 诊断类报文限频防探测:
nft add rule inet filter input ip6 nexthdr icmpv6 icmpv6 type { echo-request, echo-reply } limit rate 50/second burst 100 counter accept - 若不对外提供 IPv6 服务,末尾加:
nft add rule inet filter input meta nfproto ipv6 drop(注意位置:放在所有 accept 规则之后)
服务端口与源地址策略怎么写才安全
避免宽泛匹配,强调状态与上下文:
- SSH 只允许新连接:
nft add rule inet filter input tcp dport 22 ct state new accept - HTTP/HTTPS 开放指定端口:
nft add rule inet filter input tcp dport { 80, 443 } accept - 按 IPv6 ULA 或链路本地地址做差异化策略:
nft add rule inet filter input ip6 saddr fd00::/8 tcp dport 22 accept或ip6 saddr fe80::/10 counter - 回环始终放开:
nft add rule inet filter input iifname "lo" accept
所有规则共存于同一 input 链,nftables 自动分流,无需跳转、无需条件判断。

















