首选inet地址簇是因为它能统一处理ipv4和ipv6流量,避免重复配置、规则不一致及维护成本翻倍;同一规则自动适配双栈,内核按实际协议族匹配,连接跟踪共享,语法一致且安全可靠。

直接用 inet 地址簇统一管理 IPv4 和 IPv6,是 nftables 双栈配置最简洁、最可靠的方式。它避免了为 ip 和 ip6 分别写两套规则的重复劳动,也消除了规则不一致带来的安全隐患。
为什么首选 inet 而不是单独配 ip6
单独使用 ip6 表虽然能精确控制 IPv6 流量,但实际运维中极易出错:比如只在 ip6 表里放行了 SSH,却忘了在 ip 表同步操作,结果 IPv4 访问被默认策略拦住;或者日志、限速、连接跟踪等逻辑要写两遍,维护成本翻倍。
而 inet 表天然兼容双栈——同一规则对 IPv4 和 IPv6 同时生效,只要协议字段支持(如 tcp dport、icmp type、ip saddr / ip6 saddr),语法完全一致。内核自动按数据包实际协议族匹配,无需人工判断。
基础双栈表链结构搭建
从零开始构建一个安全基线:
- 先清空(仅限测试环境):
nft flush ruleset - 创建表:
nft add table inet filter - 创建 input 链并设默认策略为 drop:
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 - 允许本机发起的 outbound 请求返回:
nft add rule inet filter input ct state invalid drop
这四步就搭好了有状态过滤的骨架。所有新入站连接都必须显式放行,而 ESTABLISHED/RELATED 连接自动通行,IPv4 和 IPv6 共享同一连接跟踪表(conntrack),无需额外配置。
精准控制 IPv6 特有流量
有些 ICMPv6 类型是 IPv6 协议运行所必需的,不能简单用 icmp 通配。需单独处理:
- 放行邻居发现(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 外部服务,可直接拒绝所有其他 IPv6 入站:
nft add rule inet filter input meta nfproto ipv6 drop(放在最后)
注意:这些规则和前面的 IPv4 规则共存于同一 input 链,nftables 自动按协议族分流,无需分表或跳转。
按源地址范围区分策略(含 IPv6 ULA/LLA)
家庭或企业内网常含多种 IPv6 地址段:本地链路地址(fe80::/64)、唯一本地地址(fd00::/8)、公网前缀。可用变量或集合分类管理:
- 定义常用内网段:
nft define HOME6 = { fe80::/64, fd00::/8, 2001:db8:1::/64 } - 对内网源放行 SSH/DNS/NTP:
nft add rule inet filter input ip6 saddr $HOME6 tcp dport 22 acceptnft add rule inet filter input ip6 saddr $HOME6 udp dport { 53, 123 } accept - 对外网 IPv6 源访问 Web 端口做限速:
nft add rule inet filter input ip6 saddr != $HOME6 tcp dport 80 limit rate 300/hour counter drop
这里 != $HOME6 是 IPv6 专用否定匹配,比用 ip6 saddr ::/0 更准确,能排除所有内网段,包括未明确列出的临时地址。











