穆晶波 2025-12-16 07:10 采纳率: 98.7%
浏览 11
已采纳

OpenWRT如何通过DNS劫持实现域名重定向?

在使用OpenWRT实现DNS劫持进行域名重定向时,一个常见问题是:为何修改了`/etc/dnsmasq.conf`或通过DHCP/DNS界面配置了自定义DNS记录(如`address=/example.com/192.168.1.100`),客户端请求特定域名时仍无法正确重定向?可能原因包括dnsmasq未启用、配置语法错误、缓存未清除,或客户端使用了外部DNS(如DoH/DoT)绕过路由器解析。如何确保所有DNS查询均经由OpenWRT并成功实现劫持?
  • 写回答

1条回答 默认 最新

  • 张牛顿 2025-12-16 07:10
    关注

    一、DNS劫持基础:OpenWRT中dnsmasq的角色与配置机制

    在OpenWRT系统中,dnsmasq是默认的轻量级DNS和DHCP服务守护进程。其核心功能之一是支持通过/etc/dnsmasq.conf或LuCI Web界面配置自定义DNS记录,实现域名重定向(即DNS劫持)。例如:

    address=/example.com/192.168.1.100
    

    该配置意为将所有对example.com及其子域的DNS查询解析至192.168.1.100。然而,即使配置正确,客户端仍可能无法被重定向,原因涉及服务状态、语法规范、缓存机制及现代加密DNS技术的绕行。

    二、常见问题排查清单

    • dnsmasq服务未运行:使用/etc/init.d/dnsmasq status检查服务状态。
    • 配置文件语法错误:如缺少斜杠分隔符、IP格式错误等。
    • 配置未加载到运行时:修改后需重启服务:/etc/init.d/dnsmasq restart
    • DNS缓存存在旧记录:客户端或路由器本地缓存可能导致结果不一致。
    • 客户端使用外部DNS(DoH/DoT):如Firefox启用DNS over HTTPS,直接连接Cloudflare或Google DNS。
    • 防火墙未拦截外部DNS请求:UDP/TCP 53端口未被强制重定向。
    • 多个DNS服务器并存:上游DNS设置冲突导致行为不可预测。
    • LuCI界面配置与文件冲突:Web界面生成的配置可能覆盖手动编辑内容。
    • IPv6干扰:若未禁用IPv6 DNS,客户端可能通过AAAA记录绕过劫持。
    • 域名通配符匹配问题:如address=/sub.example.com/不覆盖example.com主域。

    三、深入分析:配置有效性验证流程

    1. 确认dnsmasq已启用并开机自启:/etc/init.d/dnsmasq enable
    2. 检查配置文件是否包含目标规则:
      grep "address=/example.com/" /etc/dnsmasq.conf
    3. 验证语法正确性:每条address=应遵循/domain/IP格式。
    4. 重启服务并查看日志:logread | grep dnsmasq,确认无报错加载。
    5. 从客户端执行测试查询:nslookup example.com 192.168.1.1(假设路由器IP为192.168.1.1)。
    6. 若返回预期IP,则说明dnsmasq层面工作正常;否则需进一步诊断。

    四、高级挑战:应对DoH/DoT等加密DNS绕行

    随着隐私保护增强,越来越多客户端(如Chrome、Firefox、Android)默认启用DNS over HTTPS (DoH) 或 DNS over TLS (DoT),直接连接cloudflare-dns.comdns.google,完全绕过本地dnsmasq解析。此时即使OpenWRT配置完美,也无法实现劫持。

    解决方案包括:

    策略描述实施方式
    防火墙DNS透明代理拦截所有出站53端口流量,强制重定向至本地dnsmasqiptables规则匹配! --dst 192.168.1.1--dport 53,跳转至REDIRECT
    阻断知名DoH服务器屏蔽1.1.1.1, 8.8.8.8等IP的443端口使用ipset维护黑名单,结合iptables DROP
    启用DNS劫持专用模块使用dnsmasq-full配合iptables-mod-tproxy实现更精细的TCP/UDP DNS流劫持

    五、完整部署方案:确保所有DNS查询经由OpenWRT

    graph TD A[客户端发起DNS查询] --> B{是否使用DoH/DoT?} B -- 是 --> C[防火墙拦截443/853端口] C --> D[丢弃或重置连接] B -- 否 --> E[标准DNS请求] E --> F[防火墙捕获UDP/TCP 53端口] F --> G[透明重定向至dnsmasq] G --> H[dnsmasq执行自定义address规则] H --> I[返回劫持IP或转发上游] I --> J[客户端接收响应]

    关键防火墙规则示例(添加至/etc/firewall.user):

    # 强制DNS查询走本地dnsmasq
    iptables -t nat -A PREROUTING -i br-lan -p udp --dport 53 -j REDIRECT --to-ports 53
    iptables -t nat -A PREROUTING -i br-lan -p tcp --dport 53 -j REDIRECT --to-ports 53
    
    # 阻止访问公共DoH服务器(以Cloudflare为例)
    ipset create doh-servers hash:ip
    ipset add doh-servers 1.1.1.1
    ipset add doh-servers 1.0.0.1
    iptables -I FORWARD -m set --match-set doh-servers dst -p tcp --dport 443 -j REJECT --reject-with tcp-reset
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 12月17日
  • 创建了问题 12月16日