直接用 inet 表统一处理 IPv6 是高效安全的做法,共享连接跟踪、规则表和链逻辑;通过清空规则集、建表建链、放行已建立连接、精准放行 ICMPv6 必需报文(如 NDP)、限频允许 ping、按需拦截或放行 IPv6 流量,并利用命名集合高效管理 IPv6 黑白名单。

直接用 inet 表统一处理 IPv6,不单独建 ip6 表,是高效又安全的做法。IPv6 不是“额外要加的配置”,而是和 IPv4 共享同一套连接跟踪、同一张规则表、同一个链逻辑——只要用对字段、放对位置,一条规则就能管住双栈流量。
先搭骨架:有状态过滤基线
默认 drop 策略下,核心四步就立住 IPv6 安全底子:
- 清空(仅限测试环境):
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
注意:IPv6 流量自动进入这条链,ct state 跟踪的是内核 conntrack 表,IPv4 和 IPv6 共用,无需重复写、无需分链。
专治 IPv6 必需报文:ICMPv6 精准放行
IPv6 依赖邻居发现(NDP)等 ICMPv6 类型工作,不能简单用 icmpv6 type echo-request 一概而论,更不能直接 ip6 protocol icmpv6 accept——那等于开门揖盗。
- 必须放通的 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 - 其他 ICMPv6 类型(如 packet-too-big、param-problem)按需放开,不常用就保持默认 drop
按地址族做分流控制
不是所有服务器都需要响应 IPv6 入站请求。若业务只走 IPv4,或尚未启用 IPv6 服务,可最后一道拦截:
-
nft add rule inet filter input meta nfproto ipv6 drop(放在 input 链末尾) - 这条规则生效前提是前面没匹配上——它不会影响已 established 的 IPv6 连接返回流量,也不会干扰 NDP 或本地回环
- 若需保留部分 IPv6 访问(如某网段管理地址),可在该规则前插入:
nft insert rule inet filter input ip6 saddr 2001:db8:1::/64 accept
地址池与集合:IPv6 黑白名单高效管理
IPv6 地址范围大,手动列规则不现实。命名集合支持 CIDR、区间、自动过期,是唯一可行方案:
- 建 IPv6 集合:
nft add set inet filter ipv6_block { type ipv6_addr ; flags interval ; timeout 2h ; } - 批量加入地址段:
nft add element inet filter ipv6_block { 2001:db8::/32, 2001:db8:1000::/48 } - 在 input 链中调用:
nft insert rule inet filter input ip6 saddr @ipv6_block drop - 集合定义在
inet族下,天然兼容 IPv4/IPv6;若只管 IPv6,用ip6族更轻量,但失去双栈统一优势















