ipv6-connectivity

只有 IPv6 路径不通:curl -6 超时或报 Network is unreachable,IPv4 正常。

现象

客户端通过 IPv6 连接超时、拒绝或报 Network is unreachable,同一服务的 IPv4 地址正常;双栈客户端可能只是变慢,因为 Happy Eyeballs 在 IPv6 超时后回退到 IPv4。容器、云主机和 Kubernetes 双栈环境都可能出现。

快速定位

先确认本机有没有全局 IPv6 地址和默认路由:

ip -6 addr show
ip -6 route show
ip -6 route get 2606:4700:4700::1111
sysctl net.ipv6.conf.all.disable_ipv6 net.ipv6.conf.default.disable_ipv6
sysctl net.ipv6.conf.eth0.accept_ra net.ipv6.conf.all.forwarding   # eth0 换成实际网卡名
ip -6 neigh

再做端到端测试,并确认服务确实监听在 IPv6:

ping -6 -c 3 2606:4700:4700::1111
tracepath6 2606:4700:4700::1111
curl -6 -v --max-time 5 https://example.com/
dig +short AAAA example.com
ss -6 -lntp

检查防火墙时不要只查 IPv4 规则:

ip6tables -S
nft list ruleset
grep -i '^IPV6' /etc/default/ufw

易误判:ping6 ::1 或链路本地地址能通,不代表全球 IPv6 可用;链路本地地址需要 %eth0 scope,且 disable_ipv6=0 也不代表已经拿到地址或默认路由。IPv6 下 ICMPv6 是协议必需(邻居发现、PMTUD),封掉它会让 TCP 一起坏,而不是仅仅不能 ping。

常见根因

  1. 没有全局 IPv6 地址或默认路由,只有 fe80:: 链路本地地址;云子网未分配 IPv6 CIDR 或路由表缺 ::/0。
  2. 防火墙/安全组只放行 IPv4,或 ip6tables 默认 DROP,尤其误封 ICMPv6。
  3. 应用只监听 IPv4(0.0.0.0 或 AF_INET),ss -6 -lntp 看不到监听。
  4. DNS AAAA 指向错误地址,或 IPv6-only 客户端没有 NAT64/DNS64。
  5. MTU/PMTUD 黑洞:隧道或 VPN 下 ICMPv6 Packet Too Big 被拦截。
  6. Docker/K8s/CNI 未启用 IPv6,或双栈配置不完整。
  7. RA 未被接收:accept_ra=0,或 forwarding=1 时默认忽略 RA(需要 accept_ra=2)。
  8. 地址 DAD 失败、处于 tentative/dadfailed,或存在地址冲突。

修复

相关命令

读完自测

  1. 主机有 fe80:: 地址且能 ping 通,为什么仍可能无法访问公网 IPv6?
  2. 为什么不能为了“安全”完全封禁 ICMPv6?
  3. Kubernetes Pod 只有 A 记录没有 AAAA,通常先查什么?
答案
  1. fe80:: 是链路本地地址,只能在同一链路使用;还需要全局地址、默认路由和上游 IPv6 连通性。
  2. ICMPv6 承载邻居发现、RA 和 PMTUD,封禁会导致地址解析失败和大包黑洞,TCP 也会受影响。
  3. 先确认 Service/Pod 是否启用双栈(ipFamilyPolicy)、CNI 是否支持 IPv6,以及 CoreDNS 是否返回 AAAA。