丁香医生 2025-09-28 03:20 采纳率: 98.9%
浏览 7
已采纳

OpenWrt主路由IPv6 DNS解析失败如何排查?

在使用OpenWrt作为主路由时,部分用户反馈IPv6网络下DNS解析失败,表现为设备能获取IPv6地址并ping通外网IPv6地址,但无法通过域名访问服务。常见原因为DNS转发配置未正确处理IPv6查询请求,或上游DNS服务器不支持IPv6递归解析。此外,防火墙规则误拦截ICMPv6或UDP/TCP的DNS流量、DHCPv6与RA配置不一致、以及dnsmasq未启用IPv6 DNS转发功能,均可能导致该问题。需结合日志分析、抓包排查及逐步验证上游DNS连通性来定位根本原因。
  • 写回答

1条回答 默认 最新

  • 远方之巅 2025-09-28 03:23
    关注

    1. 问题现象与基础排查路径

    在使用 OpenWrt 作为主路由的网络环境中,部分用户反馈设备虽能成功获取 IPv6 地址,并可通过 ping6 命令访问外部 IPv6 节点(如 ping6 ipv6.google.com),但无法通过域名访问服务。典型表现为:

    • 浏览器提示“DNS_PROBE_FINISHED_NO_INTERNET”或类似错误
    • nslookup example.com 返回超时或无响应
    • IPv4 域名解析正常,仅 IPv6 DNS 异常

    初步判断应聚焦于 DNS 解析链路中的 IPv6 支持能力,尤其是本地 dnsmasq 是否正确转发 IPv6 查询请求。

    2. 核心原因分类分析

    类别具体原因影响范围
    DNS 配置dnsmasq 未启用 IPv6 DNS 转发所有依赖本地 DNS 的设备
    上游服务上游 DNS 不支持 IPv6 递归查询IPv6 查询失败,IPv4 正常
    防火墙策略ICMPv6 或 UDP/TCP 53 端口被拦截DNS 请求丢包
    网络配置DHCPv6 与 RA 路由通告不一致地址分配异常导致通信中断
    软件缺陷dnsmasq 版本存在 IPv6 处理 Bug特定固件版本受影响

    3. 深度排查流程图

    graph TD
        A[设备无法解析域名] --> B{能否 ping6 外部 IPv6 地址?}
        B -- 是 --> C[检查 dnsmasq 配置是否启用 IPv6 DNS]
        B -- 否 --> D[排查 IPv6 连通性: RA/DHCPv6/路由表]
        C --> E[测试上游 DNS 是否支持 IPv6 连接]
        E --> F[使用 tcpdump 抓取 DNS 流量]
        F --> G[确认 DNS 请求是否发出及响应]
        G --> H[检查防火墙是否放行 UDP/TCP 53 及 ICMPv6]
        H --> I[验证最终解析结果]
    

    4. 关键配置项核查清单

    1. 确保 /etc/config/dhcp 中包含:
      option dns_forwardings 'ipv6'
    2. 检查 dnsmasq 是否监听 IPv6 接口:
      option localservice '0'
    3. 确认 option dhcpv6 'server' 已设置为 server 模式
    4. RA 配置中 option ra_flags 'managed'other' 正确设置
    5. 上游 DNS 设置(如 Cloudflare ::1)在 UCI 中明确指定
    6. 防火墙规则允许 INPUT 链中的 UDP/TCP 53 和 ICMPv6
    7. 重启后验证 ps | grep dnsmasq 参数含 -6
    8. 日志中执行 logread | grep dnsmasq 查看错误信息
    9. 使用 dig @::1 www.example.com AAAA 测试本地响应
    10. 从终端直连上游 DNS:dig @2606:4700:4700::1111 www.example.com

    5. 实际调试命令与输出示例

    # 查看当前 DNS 配置
    uci show dhcp.@dnsmasq[0]
    
    # 输出示例:
    dhcp.dnsmasq=dhcp
    dhcp.dnsmasq.domainneeded='1'
    dhcp.dnsmasq.localise_queries='1'
    dhcp.dnsmasq.rebind_protection='1'
    dhcp.dnsmasq.rebind_localhost='1'
    dhcp.dnsmasq.local='/lan/'
    dhcp.dnsmasq.expandhosts='1'
    dhcp.dnsmasq.authoritative='1'
    dhcp.dnsmasq.readethers='1'
    dhcp.dnsmasq.leasefile='/tmp/dhcp.leases'
    dhcp.dnsmasq.resolvfile='/tmp/resolv.conf.auto'
    dhcp.dnsmasq.nonwildcard='0'
    dhcp.dnsmasq.localservice='0'
    

    注意:localservice='0' 允许非本地网段发起 DNS 查询,否则会拒绝来自 IPv6 子网的请求。

    6. 上游 DNS IPv6 连通性验证方法

    即使本地配置正确,若上游 DNS(如运营商 DNS)不支持 IPv6 传输,则仍无法完成递归解析。可通过以下方式验证:

    # 使用 dig 指定 IPv6 DNS 服务器
    dig +short @2606:4700:4700::1001 www.cloudflare.com AAAA
    
    # 使用 tcpdump 抓包观察实际流量
    tcpdump -i br-lan -n port 53 and host 2606:4700:4700::1001
    
    # 检查连接状态(需安装 netstat 或 ss)
    ss -tulnp | grep :53
    

    若抓包显示请求发出但无响应,说明上游不通或中间防火墙拦截。

    7. 防火墙规则修复建议

    OpenWrt 默认防火墙可能未完全开放 IPv6 DNS 所需端口。需在 /etc/config/firewall 添加如下规则:

    config rule
        option name 'Allow-DNS-IPv6'
        option proto 'tcpudp'
        option dest_port '53'
        option family 'ipv6'
        option target 'ACCEPT'
        option src 'wan'
    
    config rule
        option name 'Allow-ICMPv6'
        option proto 'icmp'
        option icmp_type 'echo-request,echo-reply'
        option family 'ipv6'
        option target 'ACCEPT'
        option src 'wan'
    

    应用后执行 /etc/init.d/firewall restart 并重新测试。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 9月28日