跳到主要内容

在 Windows 上阻止发往公网地址的 UDP 53 DNS 查询

  1. 在 Windows 上安装 AdGuard Home
    设置上游服务器 为 Doh 或者其他 非 UDP 53 服务器
    将 Bootstrap DNS 设置为使用 TCP 查询 即给服务器地址前面加上 tcp://
    示例:tcp://114.114.114.114

  2. 修改网卡的 DNS 为 127.0.0.1 备选 DNS 可以不填
    或者填写 127.0.0.2 整个 127.0.0.0/8 范围都是本地环回地址
    127.255.255.255 当然需要在 AdGuard Home 中监听该地址

  3. 关闭 Windows 智能多宿主名称解析
    Win + R 输入 gpedit.msc打开组策略: 计算机配置 》 管理模板 》 网络 》 DNS 客户端
    找到 “禁用智能多宿主名称解析” 设置为 已启用

  4. Windows 防火墙设置出站拦截规则 powershell 命令如下:

    # 创建一条阻止规则:目标端口 UDP 53,但排除所有内网和保留地址段(IPv4)
    New-NetFirewallRule -DisplayName "Block Public DNS (UDP 53)" `
    -Direction Outbound `
    -Action Block `
    -Protocol UDP `
    -RemotePort 53 `
    -RemoteAddress @(
    "0.0.0.0-9.255.255.255",
    "11.0.0.0-100.63.255.255",
    "100.128.0.0-126.255.255.255",
    "128.0.0.0-169.253.255.255",
    "169.255.0.0-172.15.255.255",
    "172.32.0.0-192.167.255.255",
    "192.169.0.0-223.255.255.255"
    ) -Enabled True

    设置完成后即可拦截所有本地发出的 UDP 53 端口 DNS查询
    使用 TCP 53 端口的 DNS 查询和其他 非 UDP 53 查询不受影响

    值得注意的是 此防火墙规则没有 拦截使用 IPv6 的 DNS 查询
    可以添加 2000::/3 地址来进行拦截 其为 IPv6 全球单播地址前缀
    相当于所有 IPv6 公网地址

  5. 这样一来 AdGuard Home 在事实上接管了 Windows 的系统解析
    任何发往公网的常规 UDP 53 查询将会被拦截 私有和保留的地址的除外