VPSKnow

DNS 服务器搭建与加密解析完全指南

高级
50分钟

搭建私有 DNS 服务器,实现去广告、防污染和加密查询,全面掌控域名解析过程,提升网络安全与隐私。本指南主讲 AdGuard Home 完整部署与进阶调优,并带您玩转 Mosdns 国内外分流与 Tailscale 组网统一 DNS。

📚 DNS 基础知识

DNS(Domain Name System),即域名系统,是互联网的"电话簿"。它负责将人类易于记忆的域名(如 google.com)翻译成机器能够理解的 IP 地址(如 172.217.160.142)。

每次您访问网站时,您的设备都会先向一个 DNS 服务器查询该网站的 IP 地址,然后再通过 IP 地址与网站服务器建立连接。您使用的 DNS 服务器的优劣,直接决定了网络体验的安全性、隐私性和速度。

🚀 为何自建 DNS 服务器

虽然您的 ISP 或路由器已经提供了默认的 DNS 服务,但自建 DNS 服务器能带来革命性的体验提升。

🚫

拦截广告与跟踪

从源头过滤广告域名,保护所有接入设备的网络环境,提升浏览体验。

🔒

增强隐私与安全

防止 ISP 或公共 DNS 记录您的浏览历史,通过加密查询(DoH/DoT)防止 DNS 污染和中间人攻击。

✍️

自定义解析规则

强制重定向特定域名,或为内网服务设置友好域名,完全掌控网络访问。

提升解析速度

利用本地缓存加速重复请求的解析速度,并可选用全球最快的上游 DNS 服务。

🤔 DNS 方案选择

在 VPS 上搭建 DNS 服务,有多种成熟方案可选:

⭐ 本文主讲

AdGuard Home

功能强大且界面友好,提供 Web 管理面板,集成广告过滤、加密 DNS、家长控制等丰富功能,是新手的最佳选择。支持 DoH/DoT/DoQ,配置简单。

Pi-hole

老牌广告过滤 DNS,生态成熟,规则库极丰富。但不支持原生 DoH 上游(需搭配 cloudflared),界面比 AdGuard Home 略旧。适合追求极致规则覆盖的用户。

Mosdns

2025-2026 年最流行的进阶 DNS 路由器。通过插件化配置实现国内外分流解析,国内域名走国内 DNS,国外走 DoH,彻底解决 DNS 污染与速度的矛盾。

🔐 加密 DNS 协议对比

传统 DNS 查询(端口 53)是明文传输的,任何网络中间人(ISP/公共 WiFi)都能看到您访问了哪些网站。为了防泄漏和防劫持,现代 DNS 引入了加密协议:

协议 全称 端口 特点与伪装性
DoT DNS over TLS 853 使用专门端口加密。速度较快,但端口固定,容易被防火墙识别并封锁。
DoH DNS over HTTPS 443 将 DNS 查询包装成普通 HTTPS 请求。伪装性极强,几乎无法被封锁。目前最推荐的标准。
DoQ DNS over QUIC 784/853 基于 UDP 的新一代协议,零延迟握手,弱网环境表现远优于前两者,普及率尚在增长中。
Plain 传统明文 DNS 53 无任何加密,ISP 可见全部查询记录,易被污染/劫持。仅内网可信环境使用。

🛡️ AdGuard Home 完整部署

推荐使用 Docker 部署 AdGuard Home,隔离环境且易于管理。提供两种方式:

方式一:Docker Compose(推荐,便于维护)

创建 /opt/adguard/docker-compose.yml

# 文件路径:/opt/adguard/docker-compose.yml

services:
  adguardhome:
    image: adguard/adguardhome:latest
    container_name: adguardhome
    restart: unless-stopped
    network_mode: host          # host 模式直接使用宿主机网络,避免 NAT 问题
    volumes:
      - ./workdir:/opt/adguardhome/work
      - ./confdir:/opt/adguardhome/conf
    # 如果不用 host 模式,用以下 ports 配置:
    # ports:
    #   - "53:53/tcp"
    #   - "53:53/udp"
    #   - "80:80/tcp"
    #   - "3000:3000/tcp"
    #   - "853:853/tcp"

启动:

cd /opt/adguard && docker compose up -d

方式二:Docker Run(快速启动)

docker run --name adguardhome \
    -v /opt/adguard/workdir:/opt/adguardhome/work \
    -v /opt/adguard/confdir:/opt/adguardhome/conf \
    -p 53:53/tcp -p 53:53/udp \
    -p 80:80/tcp -p 443:443/tcp \
    -p 853:853/tcp \
    -p 3000:3000/tcp \
    -d --restart unless-stopped \
    adguard/adguardhome

💡 初始化:启动后访问 http://你的VPS_IP:3000,按向导设置管理员账号。初始化完成后管理面板移至 80 端口,DNS 服务在 53 端口。

配置上游加密 DNS(防污染核心)

设置 → DNS 设置 → 上游 DNS 服务器 中填入以下地址(推荐选 2-3 个并开启"并行请求"):

服务商 DoH 地址(推荐) DoT 地址
Cloudflare https://cloudflare-dns.com/dns-query tls://1.1.1.1
Google https://dns.google/dns-query tls://8.8.8.8
Quad9(安全) https://dns.quad9.net/dns-query tls://9.9.9.9
DNSPod(国内) https://doh.pub/dns-query tls://dns.pub
AliDNS(国内) https://dns.alidns.com/dns-query tls://dns.alidns.com

⚙️ DNS 过滤器 → 推荐封锁清单

  • AdGuard DNS filter:AdGuard 官方维护,综合性最强
  • EasyList:全球最广泛使用的广告过滤规则
  • EasyPrivacy:隐私保护,屏蔽各类追踪器
  • AdAway Default Blocklist:移动端广告过滤专项
  • NoCoin Filter List:屏蔽网页挖矿脚本

位置:过滤器 → DNS 封锁清单 → 添加封锁清单

🔧 必读:53 端口占用解决方案

在 Ubuntu 20.04+ / Debian 12+ 系统上,systemd-resolved 默认占用 53 端口,导致 AdGuard Home 无法启动。这是最高频的部署卡点,以下提供三种解决方案:

# ── 检查 53 端口占用情况 ─────────────────────────────────────────────────────
ss -tlunp | grep ':53'
# 如果看到 systemd-resolved 或 dnsmasq 占用,按下面步骤处理

# ── 方案一:停用 systemd-resolved(Debian/Ubuntu 最常见原因)────────────────
# 1. 停止并禁用 systemd-resolved
systemctl stop systemd-resolved
systemctl disable systemd-resolved

# 2. 删除 /etc/resolv.conf 的符号链接,创建真实文件
rm /etc/resolv.conf
cat > /etc/resolv.conf << 'EOF'
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF

# 3. 验证 53 端口已释放
ss -tlunp | grep ':53'
# 无输出说明端口已释放,可以启动 AdGuard Home

# ── 方案二:修改 systemd-resolved 不监听 53(保留其他功能)──────────────────
# 编辑 /etc/systemd/resolved.conf,找到 DNSStubListener 行修改为:
# DNSStubListener=no
sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
systemctl restart systemd-resolved

# ── 方案三:让 AdGuard Home 监听非标准端口 + iptables 转发 ────────────────────
# AdGuard 监听 5300 端口,再用 iptables 把外部 53 流量转到 5300
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5300
iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5300
# 使用 iptables-persistent 持久化规则

推荐方案一:直接停用 systemd-resolved,操作最简单,适合 VPS 环境(VPS 不需要 systemd-resolved 的本地 mDNS 功能)。

📋 优质广告过滤规则推荐

AdGuard DNS filter

官方推荐

AdGuard 官方维护,综合性最强,覆盖广告/追踪/恶意域名

https://adguardteam.github.io/HostlistsRegistry/assets/filter_1.txt

1Hosts (Pro)

高覆盖

高度精细化的多平台封锁清单,拦截率极高,误杀率低

https://o0.pages.dev/Pro/adblock.txt

AdGuard中文过滤器

国内专属

专为中文互联网设计,覆盖国内各大平台广告和追踪

https://filters.adtidy.org/extension/chromium/filters/224.txt

Hagezi DNS Blocklist

2026新锐

2024-2026年快速崛起的高质量规则集,更新频繁,误杀率低

https://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt

⚙️ 进阶:高级调优与 DNS 重写

1. 乐观缓存(Optimistic Caching)

设置 → DNS 设置 → DNS 缓存配置 中强烈建议开启乐观缓存。原理:当缓存记录 TTL 过期时,立刻返回旧记录给用户(极速响应),同时后台异步更新缓存。用户感知不到任何延迟,上网流畅度大幅提升。

2. DNS 重写(自定义解析)

过滤器 → DNS 重写 中可以为内网设备设置友好域名,免去记忆 IP 地址的烦恼:

# 将 nas.lan 解析到内网 IP(局域网设备友好域名)
nas.lan → 192.168.1.100

# 将 router.lan 解析到路由器
router.lan → 192.168.1.1

# 强制将广告追踪平台解析到本地环回(彻底拦截)
bad-tracker.com → 127.0.0.1

# 为外网特定域名指定 IP(无需修改 hosts 文件)
my-server.yourdomain.com → 198.51.100.10

💡 DNS 重写使用场景

  • 局域网 NAS 用 nas.local 访问,不用记 192.168.1.100
  • Tailscale 组网内服务通过域名而非 100.x.x.x 访问
  • 强制特定广告域名解析到 0.0.0.0(比封锁更彻底)
  • 测试环境将生产域名重定向到开发机 IP

✏️ 进阶:自定义过滤规则语法

AdGuard Home 支持与 AdBlock 兼容的规则语法,可以在 过滤器 → 自定义过滤规则 中直接编写:

# ── AdGuard Home 自定义过滤规则语法速查 ─────────────────────────────────────

# 1. 屏蔽域名(最基础)
||example.com^
# 等效写法(也会屏蔽所有子域名)
||*.example.com^

# 2. 放行域名(白名单,优先级高于屏蔽规则)
@@||example.com^
@@||cdn.example.com^

# 3. 屏蔽特定子域名(不影响主域名)
||ads.example.com^

# 4. 仅屏蔽完全匹配的域名
|example.com|

# 5. 屏蔽包含关键词的域名
/ads/
/tracker/

# 6. 注释行(不生效)
# 这是注释

# ── 实用场景示例 ─────────────────────────────────────────────────────────────
# 屏蔽所有广告相关子域名
||ad.*.com^
||ads.*.com^
||adservice.google.com^

# 放行被误杀的必要域名
@@||api.github.com^
@@||raw.githubusercontent.com^
@@||update.googleapis.com^

# 屏蔽已知追踪域名
||analytics.google.com^
||connect.facebook.net^
||doubleclick.net^

📡 实战:对外提供自建 DoH 服务

如果希望在出差时,手机在蜂窝网络下也能使用 VPS 上的去广告 DNS,需要对外暴露加密 DNS 服务(直接暴露 53 端口会被当作 DDoS 放大攻击肉鸡)。最佳实践是用 Nginx 反代 AdGuard Home,提供 DoH 服务:

Nginx 配置(/etc/nginx/conf.d/dns-doh.conf):

server {
    listen 443 ssl;
    http2 on;
    server_name dns.yourdomain.com;

    ssl_certificate     /etc/letsencrypt/live/dns.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/dns.yourdomain.com/privkey.pem;

    # 将请求反向代理到 AdGuard Home 的 DoH 端口
    location /dns-query {
        proxy_pass http://127.0.0.1:3000/dns-query;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

配置完成后,您的私人加密 DNS 地址是 https://dns.yourdomain.com/dns-query,可以填入手机或浏览器的"私有 DNS"选项。

🔀 2026新玩法:Mosdns 国内外分流解析

AdGuard Home 是广告过滤的利器,但上游 DNS 只能统一配置。对于国内用户,最理想的状态是:国内域名(baidu.com/taobao.com)走国内 DNS(速度快),国外域名(google.com/github.com)走 DoH(防污染)。这需要 Mosdns 在中间做分流路由。

🏗️ 整体架构

客户端设备
↓ DNS 查询
AdGuard Home(端口 53)— 广告过滤、缓存、日志
↓ 上游转发
Mosdns(本地 5335)— 域名分流路由
↙ 国内域名       ↘ 国外域名
DNSPod/AliDNS(DoH)   Cloudflare/Google(DoH)

安装 Mosdns

# ── 安装 Mosdns v5(2025-2026 主流版本)────────────────────────────────────
# 项目地址:https://github.com/IrineSistiana/mosdns

# 下载最新版
VERSION=$(curl -s https://api.github.com/repos/IrineSistiana/mosdns/releases/latest   | grep '"tag_name"' | cut -d'"' -f4)
wget "https://github.com/IrineSistiana/mosdns/releases/download/${VERSION}/mosdns-linux-amd64.zip"
unzip mosdns-linux-amd64.zip
mv mosdns /usr/local/bin/
chmod +x /usr/local/bin/mosdns

# 创建配置目录
mkdir -p /etc/mosdns

# 安装为 systemd 服务
mosdns service install -d /etc/mosdns -c /etc/mosdns/config.yaml
systemctl enable --now mosdns

分流配置文件

创建 /etc/mosdns/config.yaml

# 文件路径:/etc/mosdns/config.yaml
# Mosdns 分流配置:国内域名走国内 DNS,国外域名走 DoH
# 效果:国内网站解析快 + 国外域名防污染

log:
  level: info

# 插件定义
plugins:
  # ── 上游 DNS 插件 ──────────────────────────────────────────────────────────
  # 国内权威 DNS(直接查询,不加密,速度最快)
  - tag: forward_cn
    type: forward
    args:
      upstreams:
        - addr: "https://doh.pub/dns-query"     # DNSPod DoH
        - addr: "https://dns.alidns.com/dns-query"  # AliDNS DoH

  # 国外可信 DNS(走 DoH 加密,防污染)
  - tag: forward_global
    type: forward
    args:
      upstreams:
        - addr: "https://cloudflare-dns.com/dns-query"
        - addr: "https://dns.google/dns-query"

  # ── 规则匹配插件 ──────────────────────────────────────────────────────────
  # 国内域名列表(来自 v2fly/domain-list-community)
  - tag: geosite_cn
    type: domain_set
    args:
      files:
        - "/etc/mosdns/geosite_cn.txt"        # 国内域名列表文件

  # 国内 IP 列表(用于验证返回的 IP 是否为国内 IP)
  - tag: geoip_cn
    type: ip_set
    args:
      files:
        - "/etc/mosdns/geoip_cn.txt"          # 国内 IP 段文件

  # ── 主处理流程 ─────────────────────────────────────────────────────────────
  - tag: main_sequence
    type: sequence
    args:
      - matches: qname $geosite_cn           # 如果是国内域名
        exec: forward $forward_cn            # 走国内 DNS
      - exec: forward $forward_global        # 否则走国外 DoH

# 监听配置
servers:
  - exec: main_sequence
    listeners:
      - protocol: udp
        addr: "127.0.0.1:5335"               # 监听本地 5335 端口
      - protocol: tcp
        addr: "127.0.0.1:5335"

下载规则数据并与 AdGuard Home 联动

# ── 下载规则数据文件 ─────────────────────────────────────────────────────────
cd /etc/mosdns

# 下载国内域名列表(v2fly 社区维护)
wget -O geosite_cn.txt   https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt

# 下载国内 IP 段
wget -O geoip_cn.txt   https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt

# ── 将 AdGuard Home 的上游指向 Mosdns ────────────────────────────────────────
# 在 AdGuard Home 管理面板 → 设置 → DNS 设置 → 上游 DNS 服务器 中填入:
# 127.0.0.1:5335
# 这样:用户请求 → AdGuard Home(广告过滤)→ Mosdns(分流)→ 国内/国外 DNS

# ── 设置每周自动更新规则 ──────────────────────────────────────────────────────
# 添加 crontab(每周日凌晨 3 点更新):
# 0 3 * * 0 cd /etc/mosdns && wget -q -O geosite_cn.txt https://raw.githubusercontent.com/Loyalsoldier/v2ray-rules-dat/release/direct-list.txt && wget -q -O geoip_cn.txt https://raw.githubusercontent.com/Loyalsoldier/geoip/release/text/cn.txt && systemctl restart mosdns

🦖 进阶:结合 Tailscale 组网统一 DNS

如果您已经按照第24篇搭建了 Tailscale 组网,可以将 VPS 上的 AdGuard Home 设为整个组网的统一 DNS 服务器。这样组网内所有设备(手机、电脑、其他 VPS)无论在哪里,都自动享受广告过滤和防污染解析,无需在每台设备上单独配置。

# ── 将 AdGuard Home 设为 Tailscale 组网内的统一 DNS ─────────────────────────

# 1. 查看 AdGuard Home 所在设备的 Tailscale IP
tailscale ip -4
# 输出类似:100.64.1.2(记录下来)

# 2. 在 Tailscale 管理后台配置全局 DNS
# 访问:https://login.tailscale.com/admin/dns
# → 点击 "Add nameserver"
# → 填入步骤1的 Tailscale IP(如 100.64.1.2)
# → 勾选 "Override local DNS"(覆盖所有设备的 DNS)

# 3. 验证组网内其他设备的 DNS 是否指向 AdGuard Home
# 在任意组网设备上执行:
nslookup google.com 100.64.1.2
# 或者直接访问 AdGuard Home 面板,查看查询日志是否有该设备的请求

# ── 效果 ─────────────────────────────────────────────────────────────────────
# 组网内所有设备(手机/电脑/服务器)自动使用 AdGuard Home 作为 DNS
# - 统一广告过滤(手机浏览器广告也没了)
# - 统一防污染(所有设备 DNS 查询走 DoH)
# - DNS 重写(nas.lan 在所有设备上都能解析到正确 IP)
# - 无需在每台设备上单独配置 DNS

💡 与 Tailscale Magic DNS 的关系: Tailscale 自带 Magic DNS(设备通过名字互访),将 AdGuard Home 设为 Tailscale DNS 后,Magic DNS 和 AdGuard Home 可以共存——只需在 AdGuard Home 的 DNS 重写中也添加对应的 Magic DNS 条目(如 my-vps.tailnet.ts.net → 100.64.1.2),两者不冲突。

💻 客户端配置

服务器搭建好后,需要将设备指向它。最佳实践是在路由器上设置,让所有连接 WiFi 的设备自动享受广告过滤。

路由器(推荐,一劳永逸)

登录路由器管理后台,在 DHCP 设置中将主 DNS 地址改为 AdGuard Home 所在机器的 IP。局域网内所有设备自动使用,无需逐台配置。

Android 手机

设置 → 网络 → 私人 DNS,填入 DoT 域名(如 dns.yourdomain.com)或使用支持 DoH 的第三方 App(如 Nebulo)。

iOS / iPadOS

使用 Apple Configurator 生成包含 DoH 配置的描述文件安装,或通过 Shadowrocket 等 App 的 DNS 选项接管系统 DNS。

Windows / macOS

系统网络设置中直接填 DNS IP(内网部署);或在 Chrome/Firefox 浏览器设置中开启 DoH 并填入自建 DoH 地址(公网部署)。

🌐 权威 DNS 简介

我们上面搭建的 AdGuard Home 属于递归 DNS(转发 DNS)——它负责替我们向别人查询。而权威 DNS正好相反,它"持有"一个域名的官方记录,告诉全世界"我这个域名的 IP 是多少"。

如果您想自己托管域名解析而不使用 Cloudflare 或注册商提供的 DNS,就需要搭建权威 DNS 服务器,通常使用 BIND9CoreDNS,需要管理 Zone 文件和各类记录(A/CNAME/MX 等),配置更为复杂,属于更专业的进阶范畴。

🔧 故障排查

❌ AdGuard Home 启动失败,提示端口 53 已占用
参见本文"53 端口占用解决方案"章节。最常见原因是 systemd-resolved 占用了 53 端口,执行 systemctl stop systemd-resolved && systemctl disable systemd-resolved 后重新启动 AdGuard Home 即可。
❌ 客户端完全无法上网
  1. 检查 VPS 防火墙是否开放了 DNS 端口(TCP/UDP 53):ufw allow 53/tcp && ufw allow 53/udp
  2. 测试 DNS 服务是否响应:nslookup google.com 你的DNS_IP
  3. 登录 AdGuard Home 管理面板,查看"查询日志"是否有请求流入
  4. 检查 Docker 容器是否在运行:docker ps | grep adguard
⚠️ 某个正常网站或 App 无法工作
很可能是该服务依赖的某个底层域名被过于激进的广告过滤规则误杀了(False Positive)。在 AdGuard Home 的"查询日志"中找到被标记为"已阻止"的相关域名,点击右侧"放行"加入白名单即可。也可以在"自定义过滤规则"中添加 @@||误杀域名^ 白名单规则。
⚠️ Mosdns 启动后 AdGuard Home 解析速度变慢
可能原因:① 规则文件未正确下载,检查 /etc/mosdns/geosite_cn.txt 是否存在且有内容;② 国内 DoH 上游(DNSPod/AliDNS)连接异常,用 curl https://doh.pub/dns-query 测试;③ 在 AdGuard Home 的"乐观缓存"未开启,首次查询时需要等 Mosdns 响应。建议同时开启 AdGuard Home 的乐观缓存,重复查询走缓存,感知不到 Mosdns 的延迟。

常见问题解答

AdGuard Home 和 Pi-hole 怎么选?

2026 年绝大多数场景推荐 AdGuard Home:① 原生支持 DoH/DoT 上游(Pi-hole 需要额外安装 cloudflared 才能走加密 DNS);② 界面更现代,操作更直观;③ 支持 HTTPS/DoT/DoQ 服务端(对外暴露加密 DNS 无需额外配置 Nginx);④ 更新更活跃,新功能迭代快。Pi-hole 的优势:社区更大,历史更久,部分规则列表只为 Pi-hole 维护;配合 Unbound 可以实现真正的递归 DNS 而非转发 DNS,隐私性更高(不依赖任何上游 DNS 服务商)。总结:新用户直接选 AdGuard Home;追求极致隐私或有特殊规则需求的用户可以考虑 Pi-hole + Unbound 方案。

自建 DNS 放在 VPS 上还是放在家里局域网内更好?

两者各有适用场景:家庭局域网(如树莓派/NAS)的优势——延迟极低(局域网内通信),即使 VPS 断线也不影响上网,适合家庭环境;缺点是出门后手机无法使用。VPS 上部署的优势——可以通过 DoH 对外服务,出差时手机也能用;配合 Tailscale 组网后家庭设备同样可以访问;稳定性高(VPS 99.9% 在线);缺点是 VPS 到客户端有一定延迟(通常 20-100ms,乐观缓存开启后实际感知极小)。推荐方案:VPS + Tailscale 组网的组合,出门在家都能用,既有公网服务能力又有组网内低延迟访问。

自建 DNS 对外暴露后安全吗?会不会被利用做 DDoS 放大攻击?

直接将 UDP 53 端口对外暴露确实有 DNS 放大攻击(DNS Amplification)的风险——攻击者伪造受害者 IP 发送查询,利用 DNS 响应比请求大很多倍的特性放大流量攻击受害者。防护方案:① 不要对外开放 UDP/TCP 53:防火墙只允许内网或 Tailscale 组网 IP 访问 53 端口(ufw allow from 100.64.0.0/10 to any port 53);② 仅对外提供 DoH(HTTPS 443 端口):通过 Nginx 反代,DoH 天然不容易被用于 DNS 放大攻击;③ AdGuard Home 本身支持 Rate Limiting(速率限制),在设置中开启可以限制单 IP 的请求频率。正确配置后自建 DNS 是安全的。

AdGuard Home 广告拦截率怎么样?能拦截手机 App 内广告吗?

DNS 级别的广告过滤原理是屏蔽广告服务器的域名,因此:能拦截的:网页横幅广告、追踪脚本、大多数 App 开屏广告(走独立广告域名的)、YouTube 前贴片广告(通过 hosts 规则);无法拦截的:YouTube 视频内广告(谷歌将广告与视频流合并到同一域名,DNS 无法区分)、微博/抖音等国内平台内嵌广告(广告与内容来自同一域名)、HTTPS 协议下的部分追踪(需要 MitM 才能看到请求内容)。综合拦截率:配合 Hagezi 或 AdGuard 官方规则集,日常广告拦截率约 60-80%,对网页广告效果尤其显著,手机 App 广告效果参差不齐。与浏览器扩展(uBlock Origin)配合使用效果最佳。

Mosdns 分流配置后,如何验证国内外域名走了正确的 DNS?

验证方法:① 查看 Mosdns 日志journalctl -u mosdns -f,查询时日志会显示每个域名走了哪个上游;② 对比解析结果dig baidu.com @127.0.0.1 -p 5335 应返回国内 IP(说明走了国内 DNS);dig google.com @127.0.0.1 -p 5335 应返回境外 IP(说明走了 DoH);③ AdGuard Home 查询日志:点击某条查询记录,可以看到 AdGuard 将其转发给了哪个上游(应显示 127.0.0.1:5335 即 Mosdns);④ 使用 browserleaks.com/dns 在配置了 DNS 的设备上测试,看返回的 DNS 服务器是否符合预期。

AdGuard Home 的查询日志会保存多久?会不会占用太多磁盘空间?

默认情况下 AdGuard Home 保留 90 天的查询日志,在家庭环境下日志文件可能增长到数百 MB。调整方法:在 设置 → 常规设置 → 查询日志保留时间 中修改,建议改为 7-30 天;如果非常在意隐私,可以完全关闭查询日志(但这样就无法在日志中排查被误杀的域名)。统计数据(总拦截数、请求数图表)由单独的 统计保留时间 控制,可以独立设置。日志存储在 /opt/adguardhome/work/querylog.json,可以定期手动清理或设置 logrotate。

使用自建 DNS 后,访问国内网站是否会变慢?

取决于您的配置:① 统一走境外 DoH(如 Cloudflare):国内域名解析可能返回境外 CDN 节点而非国内节点,访问速度变慢。例如淘宝可能被解析到新加坡服务器;② 配合 Mosdns 分流(推荐):国内域名走国内 DNS(DNSPod/AliDNS),返回正确的国内 CDN IP,访问速度与直接使用 ISP DNS 相当;③ 乐观缓存开启后:DNS 解析本身的时间对用户感知影响极小(大部分域名从缓存直接返回),瓶颈在网络连接本身而非 DNS。综合建议:开启 Mosdns 分流 + AdGuard Home 乐观缓存,访问国内外网站速度都不会有明显下降。

AdGuard Home 更新后配置丢失怎么办?如何备份配置?

AdGuard Home 的所有配置保存在 /opt/adguardhome/confdir/AdGuardHome.yaml 文件中,备份这个文件即可保留所有设置(包括规则列表、上游 DNS、DNS 重写、用户账号等)。备份命令cp /opt/adguardhome/confdir/AdGuardHome.yaml ~/adguard-backup-$(date +%Y%m%d).yaml恢复:将备份文件复制回原路径,重启容器即可。自动备份集成:可以将此命令加入第19篇(数据备份)的自动备份脚本中,配合 Rclone 同步到 R2/S3,实现异地备份。Docker 用户注意:docker cp 也可以将容器内配置文件导出,但直接挂载 Volume 后操作宿主机目录更方便。

DoH 和代理软件的 DNS 有什么区别?两者能否同时使用?

两者解决的问题不同:DoH(本文):加密 DNS 查询本身,防止 ISP 窃听/污染 DNS 查询结果,但 DNS 查询仍然从您的真实 IP 发出(Cloudflare 能看到您的 IP 查了什么域名);代理软件 DNS(第25篇):通过代理隧道发送 DNS 查询,DNS 服务器看到的是代理节点 IP,隐私性更高,同时能绕过 GFW 对 DNS 的污染。两者结合的最佳实践:使用 AdGuard Home 做广告过滤 + 本地缓存,将上游指向 Mosdns(国内走 DNSPod DoH,国外走代理软件内的 DNS),既有广告过滤又有防污染——参见第25篇的 DNS 防泄露配置章节。

搭建完 DNS 服务后,下一步应该做什么?

DNS 服务搭建完毕,按 30 篇路径继续完善网络基础设施:① 端口转发与内网穿透(第27篇):将家庭内网服务(NAS/摄像头/开发机)安全发布到公网,结合 DNS 重写为内网服务设置友好域名,参见端口转发与内网穿透;② 网络包分析与排查(第28篇):当 DNS 出现奇怪问题时(某域名解析异常/请求走了错误路径),用 tcpdump 抓取 DNS 包直接分析,参见网络包分析与排查;③ 与备份方案整合:将 AdGuard Home 的配置文件(AdGuardHome.yaml)纳入第19篇的自动备份脚本中,防止 VPS 重装后重新配置。