IPv6 子网路由器任播地址在不同厂商实现中表现出行为差异:RFC 规定守护进程默认不监听任播地址,但实际网络监测发现 :: 地址却暴露了服务端口,导致无状态边界路由器的防护规则失效。
任播地址自动生成机制
当设备启用 IPv6 转发(Linux 下为 net.ipv6.conf.all.forwarding=1)且子网前缀短于 /127 时,内核会自动将子网首地址(如 2001:db8::/64 对应 2001:db8::)作为子网路由器任播地址注入本地路由表。作者在 AS149794 的主机上通过 `ip -6 route show table local` 可看到多条 anycast 条目,包含全局前缀 2400:7060:2:100:: 与 2400:7060:2:102:: 以及多个链路本地 fe80:: 地址,均标记为 proto kernel、metric 0、pref medium。这确认了任播地址由内核自动生成并挂载到对应接口(eth0、br-34a147a222f6、veth 设备等)。
实际检测与 RFC 规定的冲突
作者订阅 Shadowserver 针对 AS149794 的暴露端口告警,收到邮件提示 :: 地址上存在开放端口。这些地址位于运行 MikroTik RouterOS(基于 Linux Netfilter 框架)的边界路由器上。RFC 相关文档指出进程与守护进程默认不应监听任播地址,但告警表明实际实现中存在监听行为。原文未给出具体端口号、协议类型或暴露服务的详细列表,仅说明告警触发了对该矛盾的调查。
无状态边界路由器的防护挑战
作者倾向于在骨干/底层网络保持无状态,仅在 iptables raw 表的 prerouting 与 output 链上做无状态包过滤。例如欲阻断 WAN 侧对 DNS 端口的访问,需在规则中显式匹配任播地址。由于任播地址自动出现在本地路由表且可能被守护进程监听,原有仅针对单播地址的过滤规则会遗漏 :: 地址,导致防护出现盲区。原文未给出具体规则示例或测试数据,仅说明无状态设计下需额外处理任播地址。
对运维与网络工程师而言,需在防火墙规则集中显式覆盖子网路由器任播地址,防止因默认监听行为导致非预期服务暴露;同时在排查暴露面告警时,应将 :: 地址纳入核查范围,避免因实现差异造成安全盲区。
原文: APNIC Blog(2023-08-28)|编译自 APNIC Blog,事实以原文为准。
来源:APNIC Blog