OpenWrt IPv6配置深度排错指南从诊断到修复的全链路实战最近在帮朋友排查OpenWrt路由器的IPv6问题时发现一个有趣的现象路由器本身能获取到IPv6地址测试网站也显示支持IPv6但实际设备就是无法访问IPv6资源。这种半残状态比完全不能用更让人抓狂——明明成功就在眼前却总是差那么一步。如果你也遇到了类似问题不妨跟着这份实战指南用工程师的思维方式层层剖析问题本质。1. 基础检查确认IPv6的三层存在在开始复杂排查前我们需要先确认三个基本要素是否齐全这相当于给IPv6网络做一次全身体检运营商支持验证在OpenWrt的SSH终端执行ubus call network.interface.wan status | grep -A 3 ipv6正常应显示类似ipv6-address: [ { address: 2408:8207:1234:5678::2, mask: 64, preferred: 3600, valid: 86400 } ], ipv6-prefix: [ { address: 2409:8a55:1234:5678::, mask: 60, preferred: 3600, valid: 86400 } ]如果ipv6-prefix为空说明运营商可能没有分配PD前缀这是后续设备获取地址的基础。路由表检查执行ip -6 route show关键看是否存在两条核心路由default via fe80::1 dev eth0 proto ra metric 1024 2409:8a55:1234:5678::/60 dev br-lan proto kernel metric 256第一条是IPv6默认路由第二条是LAN侧的前缀路由。NDP邻居发现协议运行ip -6 neigh show正常应该能看到LAN内设备的IPv6地址和MAC对应关系。如果只有fe80开头的链路本地地址说明地址分配环节可能有问题。提示这三个检查最好在路由器刚重启后进行避免缓存数据干扰判断。如果其中任何一项缺失后续的配置都是空中楼阁。2. 防火墙规则深度解析看不见的IPv6守门人OpenWrt的防火墙对IPv6有着特殊照顾很多问题其实都源于防火墙的过度保护。让我们用手术刀般的精度来解剖这些规则2.1 关键防火墙区域查看当前防火墙配置uci show firewall | grep -E zone|forward重点关注以下输出firewall.zone[0].namelan firewall.zone[1].namewan firewall.zone[2].namewan6 firewall.forwarding[0].srclan firewall.forwarding[0].destwan常见问题场景缺少wan6区域IPv6流量没有专用处理通道lan到wan6的转发未启用IPv6出站流量被阻断wan6区域未绑定到WAN接口IPv6入站规则失效2.2 动态规则检查实时监控防火墙对IPv6包的处理logread -f | grep -i ip6同时另开一个终端执行IPv6测试ping6 ipv6.google.com观察日志中是否有类似拦截记录[UFW BLOCK] INeth0 OUT MAC... SRC2408:... DST2a00:... PROTOICMPv62.3 修复方案执行以下命令序列进行修复# 确保wan6区域存在 uci -q delete firewall.zone[-1] uci add firewall zone uci set firewall.zone[-1].namewan6 uci set firewall.zone[-1].inputREJECT uci set firewall.zone[-1].outputACCEPT uci set firewall.zone[-1].forwardREJECT uci set firewall.zone[-1].masq1 uci set firewall.zone[-1].mtu_fix1 uci add_list firewall.zone[-1].networkwan6 # 添加lan到wan6转发 uci add firewall forwarding uci set firewall.forwarding[-1].srclan uci set firewall.forwarding[-1].destwan6 # 提交更改 uci commit firewall /etc/init.d/firewall restart3. DHCPv6与RA的协同工作机制IPv6地址分配比IPv4复杂得多它采用DHCPv6和RARouter Advertisement双轨制。理解它们的交互是解决问题的关键。3.1 协议交互诊断使用tcpdump抓取IPv6控制平面报文tcpdump -i br-lan -vvv -n icmp6 (ip6[40] 134 || ip6[40] 135 || ip6[40] 136) or udp port 547正常应该能看到三类关键报文RA报文ICMPv6 type 134路由器定期广播包含网络前缀等信息RS报文ICMPv6 type 133设备主动请求RADHCPv6报文UDP 547端口地址分配细节常见异常模式只有RA没有DHCPv6可能配置为SLAAC-only模式RA中M/O标志位异常影响设备获取地址的方式DHCPv6报文未响应服务未正确运行3.2 OpenWrt特定配置检查odhcpd服务状态ubus call odhcpd status关键参数解析{ ra: { enabled: true, default_lifetime: 1800, managed: true, other: true }, dhcpv6: { enabled: true, leasetime: 12h, start: 100, limit: 150 } }其中managed和other标志位决定设备如何获取地址M1,O1使用DHCPv6获取地址和其他配置M0,O1SLAAC获取地址DHCPv6获取其他配置M0,O0仅SLAAC3.3 客户端兼容性问题不同操作系统对IPv6的实现有差异操作系统默认行为特殊要求Windows 10优先DHCPv6需要M1LinuxSLAAC优先需要O1Android仅SLAAC忽略DHCPv6macOS混合模式依赖RA参数可以通过强制设置解决兼容性问题uci set dhcp.lan.ra_management1 uci set dhcp.lan.ra_default1 uci commit dhcp /etc/init.d/odhcpd restart4. 内核参数与系统级调优有些深层次问题需要触及Linux内核的IPv6栈配置。以下是几个关键调整点4.1 内核参数检查查看当前IPv6相关参数sysctl -a | grep ipv6 | grep -E conf|forwarding重点关注net.ipv6.conf.all.forwarding1 net.ipv6.conf.default.forwarding1 net.ipv6.conf.br-lan.accept_ra2 net.ipv6.conf.br-lan.accept_ra_rt_info_max_plen644.2 永久生效配置创建持久化配置cat /etc/sysctl.d/60-ipv6.conf EOF net.ipv6.conf.all.forwarding1 net.ipv6.conf.default.forwarding1 net.ipv6.conf.all.accept_ra2 net.ipv6.conf.default.accept_ra2 net.ipv6.conf.br-lan.accept_ra2 net.ipv6.conf.br-lan.accept_ra_rt_info_max_plen64 EOF sysctl -p /etc/sysctl.d/60-ipv6.conf4.3 MTU问题排查IPv6包头比IPv4大MTU问题更常见# 检测路径MTU ping6 -c 4 -M do -s 1472 ipv6.google.com # 如果失败逐步减小包大小 ping6 -c 4 -M do -s 1400 ipv6.google.com解决方案uci set network.wan6.mtu1480 uci commit network ifup wan65. 疑难杂症专项处理经过上述步骤后大部分问题应该已经解决。如果仍然有问题可能是这些特殊情况5.1 二级路由场景当OpenWrt作为二级路由时需要特殊配置uci set dhcp.lan.ra_slaac1 uci set dhcp.lan.ra_flagsnone uci set dhcp.lan.dhcpv6relay uci set dhcp.lan.ndprelay uci commit dhcp /etc/init.d/odhcpd restart5.2 PPPoE特殊处理PPPoE拨号需要调整MRUuci set network.wan.ppp_optionsipv6 ipv6cp-use-ipaddr uci set network.wan.mtu1492 uci set network.wan6.mtu1492 uci commit network ifup wan ifup wan65.3 双栈优先策略调整IPv6优先级uci set network.wan.protodhcp uci set network.wan6.protodhcpv6 uci set network.wan.reqaddresstry uci set network.wan.reqprefixauto uci commit network /etc/init.d/network restart6. 终极验证全链路测试方案当所有配置完成后建议按照以下顺序验证基础连通性测试ping6 -c 4 2001:4860:4860::8888 # Google DNS traceroute6 ipv6.google.comWeb访问测试curl -6 https://ipv6-test.com wget -6 http://v6.myip.laDNS解析验证dig AAAA ipv6.google.com 2001:4860:4860::8888 nslookup -queryAAAA ipv6.google.com速度基准测试iperf3 -c speedtest.sin1.server.sg.scnet.ix -6 -p 5208如果所有这些测试都通过那么恭喜你你的IPv6网络已经达到生产级可用状态。如果某个环节失败可以根据失败点回溯到对应章节进行针对性排查。