同一个网站IPv4访问正常,切换IPv6就一直转圈或者报错,这类情况现在越来越多。IPv6地址长度更长,解析、路由链路多出一层,任意环节配置出错,访问就会中断。下面从本地设备到服务器,DNS到CDN,依次梳理常见故障点和对应的处理办法。
先确认设备有没有成功获取IPv6地址。Windows打开命令行执行ipconfig,查看无线网卡或者以太网信息,如果只有IPv4地址,没有2001、240e、2408这类开头的IPv6地址,问题出在本地网络。路由器IPv6功能没开启,或是运营商没有分配IPv6前缀。登录路由器管理后台,找到IPv6设置,确认WAN口连接类型为自动获取或是PPPoE,IPv6开关打开。部分路由器需要手动开启DHCPv6-PD前缀委派,不然内网设备拿不到公网IPv6地址。拿到全局IPv6地址之后,再继续排查。

用命令行检测AAAA记录解析状态。Windows执行nslookup -type=AAAA 你的域名,Linux和Mac执行dig AAAA 你的域名。返回IPv6地址,代表DNS解析环节正常;返回空结果或者NXDOMAIN,说明域名AAAA记录没有配置或是未生效。这里很容易踩一个坑,有人在域名后台给IPv6地址添加A记录。A记录仅适配IPv4地址,IPv6必须使用AAAA记录,两类记录相互独立,不能混用。确认记录类型是AAAA,填写的值是服务器真实IPv6地址,保存等待TTL过期之后复测。
AAAA记录可以解析出IPv6地址,但网站依旧无法访问,问题大概率在服务器端。先查看服务器是否拥有全局IPv6地址,Linux执行ip -6 addr show,带有scope global标识的地址才算有效。fe80::开头属于链路本地地址,只能在同一二层网络通信,不能用于公网访问。接着检查默认路由,执行ip -6 route show | grep default,没有输出代表服务器不知道IPv6流量出口,需要手动添加默认路由,网关地址查看服务商控制台或是开通通知邮件。路由配置完成,用ping6测试外部IPv6地址,例如ping6 2001:4860:4860::8888,可以连通说明服务器出站正常。
出站测试正常,外部用户依旧访问不到网站,就要检查入站流量。服务器防火墙、云平台安全组需要放行IPv6流量,80、443端口不能只配置IPv4规则。Nginx、Apache监听配置也要核对,部分默认配置只写listen 80;,这条只监听IPv4,IPv6需要单独配置listen [::]:80;,或是listen [::]:80 ipv6only=off;同时监听双协议栈。安全组、防火墙放行之后,用外部IPv6网络访问站点测试,能打开代表服务器侧配置完成。
如果部署了CDN,排查会多一层环节。很多站长在CDN后台添加AAAA解析记录,就以为IPv6已经开通,实际CDN节点本身没有开启IPv6监听,解析指向的节点不支持IPv6,访问自然失败。正确操作,先进入CDN控制台确认IPv6访问功能手动开启,A记录、AAAA记录全部指向CDN提供的CNAME地址,不要一条记录指向CDN,一条直接指向源站,混用会造成部分用户解析到不兼容节点。回源策略也要留意,如果源站没有IPv6地址,在CDN后台设置IPv6用户访问、IPv4回源,CDN节点用IPv4拉取源站内容,用户侧走IPv6不受影响。
还有一个容易忽略的故障原因:IPv6地址前缀变动。IPv4地址大多固定,IPv6前缀很多是动态分配,运营商网络割接、机房路由调整、设备重启,都会造成IPv6前缀变更。服务器IPv6地址更新,但域名AAAA记录依旧绑定旧地址,IPv6用户访问无效地址。判断方式很简单,对比服务器当前IPv6地址和域名AAAA记录填写的地址,不一致就是这个问题。修复需要更新AAAA记录,TTL调低到300至600秒,同时检查防火墙、安全组放行的IPv6网段是否还绑定旧前缀,两处修改完成再测试。长期使用条件允许,可以向运营商申请固定IPv6前缀,或是使用支持动态更新的DNS服务,减少手动修改记录的频次。
排查顺序不要打乱。先确认本地设备拿到IPv6地址,再命令行验证AAAA记录解析,接着检查服务器IPv6路由、端口监听,最后再调整CDN、域名解析配置。很多故障根源不在最后一步,但人习惯从远端开始修改,折腾一圈才发现路由器没开启IPv6,白白浪费时间。按照由近到远顺序排查,定位故障更快。