海外云服务器搭建 AdGuard Home 内网去广告 DNS 服务器完整教程(2026最新版)

📅 · ChengziCloud - 一站式云端服务

Meta Description: 从零开始用海外云服务器搭建 AdGuard Home 内网去广告 DNS 服务器,让全家手机、电视、电视盒子一起生效。涵盖 Docker Compose 部署命令、DoH/DoT 加密上游配置、去广告规则与中文过滤列表、路由器 DHCP 接管、端口收敛与限速防滥用、DNS 重写与分客户端策略,附服务器配置推荐表、服务商价格表、自建 vs 托管 DNS 对比表与 8 条常见问题 FAQ。

> 关键词:AdGuard Home 搭建教程、自建 DNS 去广告、内网 DNS 服务器、Pi-hole 替代方案、海外云服务器搭建 DNS、AdGuard Home Docker 部署、DoH 加密 DNS、路由器 DNS 怎么设置、电视盒子去广告、AdGuard Home 配置

前言

想让广告在全家所有设备上同时消失——包括那些你根本装不了浏览器的智能电视、电视盒子、智能音箱和长辈的手机——最省事的办法不是一台台去装广告拦截 App,而是在一台海外云服务器上跑一个 AdGuard Home:它是属于你自己的 DNS 服务器,把广告与追踪域名解析到黑洞地址,其余域名照常转发。一台 1核1G 的海外 VPS,月费几美元,配置一次全家生效,手机、电视、盒子、IoT 设备通吃。

它的原理叫 DNS sinkholing(DNS 沉洞):设备要打开一个网页,第一步必须先把域名解析成 IP,而这一步是由你指定的 DNS 服务器完成的。只要那台服务器对广告域名返回 0.0.0.0NXDOMAIN,广告请求在发出之前就断了——客户端连"要不要展示广告"的机会都没有。所以它最大的价值不是"比浏览器插件更强",而是覆盖了插件装不了的设备

本文给出可直接复制执行的完整命令,Ubuntu 22.04 与 CentOS 7 双系统覆盖,从买服务器、装 Docker、写 compose、收敛端口,到配置加密上游、导入拦截规则、接管路由器 DHCP、分客户端策略、安全加固一路走通,并附服务器配置推荐表、服务商价格表、自建与托管方案的成本对比表,以及 8 条常见问题。

> 🚀 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版,享专属折扣和中文技术支持。

一、为什么用海外云服务器自建 DNS,而不是继续用运营商默认 DNS

理由一:DNS 层拦截是唯一能覆盖"非浏览器设备"的方案。 浏览器插件能拦网页广告,但拦不了电视开机广告、盒子应用里的贴片、智能音箱的推送、以及各种 App 内置的追踪 SDK。而这些设备的网络出口都要经过 DNS,一旦它们把 DNS 交给你的服务器,拦截就自动生效——不需要在每台设备上装任何东西,也不需要它们支持装插件。

理由二:数据主权与隐私。 运营商 DNS 能看到你访问过的每一个域名(哪怕你用的是 HTTPS,域名本身在 DNS 查询里是明文)。自建 AdGuard Home 之后,查询记录只留在你自己的机器上,还可以顺手把上游换成 DoH/DoT 加密解析,让运营商既看不到你的域名,也改不了你的解析结果。

理由三:广告拦截只是起点,真正的用途是"家庭网络策略"。 同一个后台可以做到:按设备下发不同的拦截策略(孩子的手机开青少年模式、自己的电脑全放开)、强制搜索引擎安全搜索、拦截钓鱼与恶意软件域名、给内网设备做自定义域名重写(把 nas.home 指到内网 IP,彻底告别记 IP)。这些能力在运营商的 DNS 上一个都拿不到。

理由四:为什么放在海外而不是放家里。 放在家里软路由或树莓派上延迟最低、也最省电,但有一个硬伤——只在家里生效。一旦出差、在店里、在分公司,你的纯净 DNS 就用不上了。放在海外云服务器上则同时解决三件事:拿到固定的公网入口,任何网络环境都能连;免备案、不必向运营商解释你为什么要开 53 端口;按流量计费、随时换 IP 重装,比家庭宽带更适合长期挂一个入口服务。

它不划算的场景也要说清楚。 如果你只是想让家里几台电脑少看广告,那在旧路由器上刷个固件、或者用免费的 AdGuard DNS / NextDNS 公共解析就够了,自建反而多花服务器钱和维护精力。自建的性价比拐点大概在"需要跨地点使用 + 想要自定义设备级策略 + 在意查询日志归属"这三条里占了两条——到了这个程度,几美元一个月的 VPS 就是很便宜的代价。

还有一个必须提前知道的限制:DNS 层拦截无法屏蔽与内容共用同一域名的广告。也就是说 YouTube、Twitch 的视频前贴片广告、Facebook 与微博的信息流"推广"内容,靠 DNS 是拦不掉的——因为它们的域名和正文内容完全一样,拦掉域名就等于拦掉整个网站。想拦这类广告只能用内容过滤型插件(如 AdGuard 浏览器扩展)。这一点官方文档写得很直白,本文不会假装它能做到。

二、服务器怎么选:DNS 服务器吃的不是 CPU,而是延迟和内存

很多人以为跑 DNS 要很强的机器,恰恰相反:AdGuard Home 是单个 Go 静态二进制(官方仓库 AdguardTeam/AdGuardHome,本文写作时的最新稳定版是 v0.107.79),没有数据库、没有 JVM、没有一堆依赖,进程常驻内存通常在几十到一百多 MB 这个量级,具体高低主要取决于你导入了多少条拦截规则——规则条目越多,常驻内存越高,因为要全部加载进内存做匹配。所以它的资源画像非常特别:

第一,CPU 几乎不是问题。 一台 1 核的机器可以轻松扛住一个家庭的全部 DNS 查询。真正吃 CPU 的只有两件事:启用了很庞大的规则集时的首次加载,以及被外部当成"开放解析器"滥用时的洪泛查询(这属于安全问题,第五节会专门处理)。

第二,内存是主要约束。 建议至少给到 1GB,家庭主用推荐 2GB:除了 AdGuard Home 本身,你可能还想在同一台机器上挂一两个小服务,而且系统本身的缓存与后续统计数据库(stats.db)也要占空间。宁可 1核2G,也不要 2核1G——DNS 服务一旦 OOM 被杀,全家断网,这是最不能接受的故障形态。

第三,磁盘几乎不挑,但必须给一个小小的可靠性保障。 10GB 系统盘绰绰有余。要注意的是 AdGuard Home 的统计数据库文件需要文件系统支持 mmap(2),绝大多数云盘的 ext4/xfs 都没问题;如果你把工作目录放在某些特殊网络盘或容器叠加文件系统上,可能出现统计功能异常,官方给出的解法是用 --work-dir 指定到别的目录。一个更实用的保障是加 1~2GB swap:内存吃紧时先扛过去,总比直接 OOM 好。

第四,也是最容易被忽视的一点——延迟才是真正的体验瓶颈。 DNS 解析是同步阻塞的:浏览器打开一个新域名,必须等你的服务器回包才能继续。所以你到这台服务器的 RTT 会直接叠加在每一次首屏加载上。这一点和"搭个网站放着"完全不同——网站可以慢一点,DNS 慢一点是每一页都能感觉到的。结论是:选离你和家人住处近的区域,国内用户优先香港、日本、新加坡,其次美国西海岸;千万不要为了便宜选欧洲或南美节点来做家庭 DNS。好消息是解析结果会被客户端和 AdGuard Home 两层缓存,第二次访问同一域名通常就不需要再回源了。

服务器配置推荐(按使用规模)

| 使用场景 | 推荐配置 | 为什么够用 | |---------|---------|-----------| | 个人尝鲜、单机测试 | 1核 1G | 家庭单点查询量很低,1G 足以跑起规则集 | | 家庭主用(推荐) | 1核 2G | 留出内存给规则集与统计库,避免 OOM 导致全家断网 | | 多地点 / 多公司共用 | 2核 2G | 并发客户端多,需要更多内存扛规则集与连接 | | 带 DoH/DoT 服务端 + 超大规则集 | 2核 4G | 加密解析与百万级规则同时在线,留足余量 | | 高可用(双机) | 2 × 1核 1G | 两台机器做双 DNS,任一台挂了另一台顶着 |

> ⚠️ 不要把 DNS 和你的主站、数据库挤在同一台小机器上。DNS 故障的表现是"全家上不了网",比网站打不开更影响生活。

服务商价格参考

| 服务商 | 月付 | 年付(折扣后) | 数据中心 | 优点 | |--------|------|--------------|---------|------| | 阿里云国际版 ECS | $4.2 | $3.2/月 | 新加坡/香港/硅谷 | 中文面板、支持支付宝 | | AWS Lightsail | $3.5 | $3.5/月 | 全球20+区域 | 新用户免费套餐、生态完善 | | 腾讯云国际版 CVM | $4.5 | $3.5/月 | 香港/新加坡/东京 | 低延迟到国内、微信支付 | | Vultr | $6.0 | $6.0/月 | 全球32个 | 按小时计费、随时销毁 | | DigitalOcean | $6.0 | $6.0/月 | 全球14个 | 文档最完善、社区教程多 |

> 💡 做家庭 DNS 优先看香港、东京、新加坡这三个区域:到国内的 RTT 通常在几十毫秒量级,配合缓存后基本无感。通过 5.chengzicloud.cloud 购买以上平台还可享额外折扣。

自建 vs 托管 DNS:把成本摆到桌面上

如果你的唯一目标是"少看广告",那么免费的托管 DNS 确实更省事;自建的价值在于规则自由度、日志归属和跨地点可用性。下面把所有选项的真实价格放在一起对比(价格采集于 2026 年 9 月,仅为公开官网参考区间,请以官网实时价格为准):

| 方案 | 成本 | 拦截规则自定义 | 查询日志归属 | 加密解析(DoH/DoT) | 适合谁 | |------|------|--------------|-------------|-------------------|--------| | 自建 AdGuard Home(本文) | 服务器月费 $3.5~$6 | 完全自定义,可导入任意列表 | 只在自己机器上 | 需自行配置上游与证书 | 要跨地点、要设备级策略、在意日志归属 | | AdGuard DNS 免费版 | 免费 | 受限 | 厂商 | 原生支持 | 只要基础去广告、5 台设备以内 | | AdGuard DNS Personal | 年付约 $19.99(月付合计约 $29.88/年) | 较灵活 | 厂商 | 原生支持 | 想省事、设备数 20 台以内 | | NextDNS 免费版 | 免费,每月 30 万次查询 | 较灵活 | 厂商 | 原生支持 | 轻量尝鲜、查查询量不大 | | NextDNS Pro | $1.99/月 或 $19.90/年 | 较灵活 | 厂商 | 原生支持 | 想省事且查询量大的个人用户 | | Cloudflare 1.1.1.1 / 运营商 DNS | 免费 | 无 | 厂商/运营商 | 1.1.1.1 支持 DoH | 不做拦截,只要能解析 |

> 声明:本文价格数据采集于 2026 年 9 月,仅为公开官网参考区间。云服务器价格随区域、计费方式和活动浮动,托管 DNS 的免费额度与档位也会调整,请以各厂商官网实时价格为准。除特别标注外,金额单位均为美元(USD)。

一句话结论:如果你要的是"全家设备 + 跨地点 + 设备级策略",自建的 $4 左右月费比托管方案的订阅费更划算,而且查询日志不会离开你的机器;如果你只想在一台手机上少看广告,直接改用免费的 AdGuard DNS 或 NextDNS 公共解析,一分钟就能用上。

三、八步搭建(Ubuntu 22.04 / CentOS 7 双系统)

下面的每一步都给两套命令,你按自己的系统选一套执行即可。全部命令都可以直接复制粘贴。

第一步:系统初始化与防火墙基线

先登录机器,更新系统、装好基础工具、设置时区。Ubuntu:

`bash apt update && apt -y upgrade apt -y install curl wget ca-certificates gnupg lsb-release ufw timedatectl set-timezone Asia/Shanghai `

CentOS 7:

`bash yum -y update yum -y install curl wget ca-certificates epel-release yum-utils timedatectl set-timezone Asia/Shanghai `

接着加一个 2GB 的 swap。前面说过 DNS 服务最怕 OOM,这一步不是为了性能,是为了在内存吃紧时先扛过去,而不是让全家断网

`bash fallocate -l 2G /swapfile chmod 600 /swapfile mkswap /swapfile swapon /swapfile echo '/swapfile none swap sw 0 0' >> /etc/fstab free -h `

然后是防火墙。这里有一个必须做对的关键决定:53 端口绝对不要对全网开放。 一旦公网任何人都能用你的服务器做递归查询,你会在几天内被扫描器找到,然后被当成 DDoS 放大攻击的跳板,轻则流量账单爆炸,重则 IP 被云厂商封停。正确做法是只放行你自己的出口 IP(家庭宽带公网 IP、或你的 VPN 网段)。

Ubuntu 用 ufw(把 你的家庭公网IP 换成真实地址):

`bash ufw allow 22/tcp ufw allow 80/tcp ufw allow 443/tcp ufw allow from 你的家庭公网IP to any port 53 proto udp ufw allow from 你的家庭公网IP to any port 53 proto tcp ufw --force enable ufw status verbose `

CentOS 7 用 firewalld:

`bash firewall-cmd --permanent --add-service=ssh firewall-cmd --permanent --add-service=http firewall-cmd --permanent --add-service=https firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的家庭公网IP/32" port protocol="udp" port="53" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="你的家庭公网IP/32" port protocol="tcp" port="53" accept' firewall-cmd --reload firewall-cmd --list-all `

查询自己的家庭公网 IP:在浏览器打开任意"我的IP"页面,或在本地电脑执行 curl ifconfig.me

> ⚠️ 云厂商的安全组是第二道门。 上面的系统防火墙只管机器内部,阿里云/AWS/腾讯云的控制台安全组必须同步配置:入方向只放行 22、80、443,以及"仅你的 IP"访问 53。很多人的服务器明明配了防火墙却还是被滥用,就是因为安全组里 53 是 0.0.0.0/0

> ⚠️ 家宽 IP 会变怎么办? 如果运营商给你的是动态 IP,有两个选择:一是把放行范围改成你的整个运营商网段(不够严谨但可用),二是干脆不对公网开 53,改用第五节的 DoH/DoT 方式(走 443 端口),再配合 AdGuard Home 自带的"允许的客户端"白名单模式兜底。白名单模式是最后一道保险,第六节会讲怎么开。

> ⚠️ Ubuntu 的一个常见冲突: 如果你启动后发现 53 端口起不来或者解析异常,先检查 systemd-resolved 是否占用了 53。Ubuntu 22.04 的本地 DNS 存根服务会监听 127.0.0.53:53,与容器抢端口。处理办法是关闭它的存根监听(CentOS 7 没有这个服务,可跳过): > > `bash > systemctl disable --now systemd-resolved > ls -l /etc/resolv.conf > ` > > 禁用后如果 /etc/resolv.conf 变成悬空链接,把上游 DNS 直接写进去即可,例如写入 nameserver 1.1.1.1

第二步:安装 Docker 与 Compose v2

Ubuntu 与 CentOS 7 都可以用 Docker 官方的一键脚本安装:

`bash curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh systemctl enable --now docker docker version `

如果你的机器是甲骨文永久免费 ARM 实例或树莓派等 arm64 架构,官方脚本会自动识别架构,不需要额外改动。

接下来是 Compose v2。这一步在 CentOS 7 上要特别注意:老教程里那个 pip install docker-compose 装出来的是已经停止维护的 v1,命令是 docker-compose(带横线);而现在官方推荐的是 v2 插件,命令是 docker compose(带空格)。用下面的方式手动补插件,并且不要写死版本号——用 latest/download 路径让脚本自己取最新版,这样半年后你照着做也不会遇到 404:

`bash mkdir -p /usr/local/lib/docker/cli-plugins curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose chmod +x /usr/local/lib/docker/cli-plugins/docker-compose docker compose version `

arm64 机器(甲骨文 ARM、树莓派 4/5)把上面的文件名换成 docker-compose-linux-aarch64。装完必须能看到 Docker Compose version v2.x 这样的输出,看到 v1 就说明路径不对。

第三步:规划目录并写 docker-compose.yml

AdGuard Home 需要两个持久化目录:work(统计数据、会话)和 conf(配置文件 AdGuardHome.yaml)。放在 /opt/adguardhome 下:

`bash mkdir -p /opt/adguardhome/work /opt/adguardhome/conf cd /opt/adguardhome `

然后新建 docker-compose.yml注意:YAML 文件里不能写注释——本站的 Markdown 渲染器会把行首的井号当作标题,所以你会在本文所有配置文件代码块里看到"零注释"的写法,说明都写在正文或表格里。文件内容如下:

`yaml services: adguardhome: image: adguard/adguardhome:latest container_name: adguardhome restart: unless-stopped ports: - "53:53/tcp" - "53:53/udp" - "127.0.0.1:3000:3000/tcp" volumes: - /opt/adguardhome/work:/opt/adguardhome/work - /opt/adguardhome/conf:/opt/adguardhome/conf `

这份配置里有三个关键决定,逐条说明:

| 配置项 | 作用 | 为什么这样写 | |--------|------|-------------| | 53:53/tcp53:53/udp | 对外提供 DNS 解析 | TCP 用于大响应与 DoT 回退,UDP 用于绝大多数普通查询,两个都要 | | 127.0.0.1:3000:3000/tcp | 管理后台端口 | 只绑本机回环,不从公网可达,避免后台被扫描爆破 | | restart: unless-stopped | 崩溃自拉起 | DNS 服务不能"挂了就挂着",开机也要自动恢复 | | 两个 volumes | 配置与数据落盘 | 不挂卷的话,容器重建后所有规则与统计全部丢失 | | adguard/adguardhome:latest | 官方镜像 | 不写死版本号,升级时 docker compose pull 即可 |

> 💡 有些人会在这里用 network_mode: host。官方文档的说法是:用 host 网络模式能让 AdGuard Home 看到客户端的真实 IP(否则统计里全显示成 172.17.0.1)。但 host 模式也意味着管理端口会直接暴露在公网,必须先确认防火墙已经收敛。本文选择端口映射方式,配合 SSH 隧道访问后台,是更省心的默认值;如果你需要看到真实客户端 IP 做分设备策略,第四节会给出改成 host 模式的完整步骤。

第四步:启动容器并完成初始向导

`bash cd /opt/adguardhome docker compose up -d docker compose ps docker compose logs --tail=30 `

看到容器状态是 Up 之后,AdGuard Home 会先在 3000 端口启动配置向导。因为我们已经把 3000 绑在了本机回环上,直接访问公网 IP 是打不开的——这是故意的。正确姿势是在你自己的电脑上开一条 SSH 隧道:

`bash ssh -L 3000:127.0.0.1:3000 root@你的服务器IP `

保持这个 SSH 会话不要关,然后在本地浏览器打开 http://127.0.0.1:3000,就能看到 AdGuard Home 的安装向导。向导一共三步:

1. 选择网络接口——它会列出机器上的网卡,直接选默认(监听所有接口)即可,因为真正的访问控制已经交给了防火墙。 2. 设置管理后台端口——向导默认填 3000,保持默认。若想让后台走 80 端口,这里可以改成 80,但前提是防火墙与安全组都放行了 80。 3. 创建管理员账号与密码——这一步的密码请用强密码,因为它是整个家庭网络解析策略的唯一入口。

向导完成后,AdGuard Home 会把配置写入 /opt/adguardhome/conf/AdGuardHome.yaml,后台入口也会立刻生效。此时你的服务器已经是一台可用的、尚未配置任何过滤规则的 DNS 服务器了。

第五步:配置上游 DNS(加密解析 + 国内域名分流)

AdGuard Home 本质是一个 DNS 代理:客户端把查询交给它,它先查本地规则决定"拦截还是放行",放行的再转发给上游 DNS 服务器。所以上游的选型直接决定了解析速度与隐私强度。三种形态的差别如下:

| 上游写法 | 协议 | 加密 | 说明 | |---------|------|------|------| | 1.1.1.1 | 普通 DNS(53/UDP) | 明文 | 最快最简单,但运营商能看到你查了什么 | | tls://1.1.1.1 | DNS-over-TLS(853) | 加密 | 抗篡改,握手开销略高于 UDP | | https://dns.cloudflare.com/dns-query | DNS-over-HTTPS(443) | 加密 | 最不容易被干扰的形态,推荐首选 | | quic://dns.adguard-dns.com | DNS-over-QUIC | 加密 | 基于 UDP 的下一代加密解析,部分网络下更快 |

推荐的组合是:主力走 DoH/DoT 加密上游,同时配一组普通 DNS 作为 bootstrap(用于解析 DoH 服务器自己的域名)和 fallback(上游全挂时的兜底)。在后台的「设置 → DNS 设置」里,把上游 DNS 服务器填成下面这一组:

`text https://dns.cloudflare.com/dns-query https://doh.pub/dns-query https://dns.alidns.com/dns-query tls://1.1.1.1 `

Bootstrap DNS 填:

`text 9.9.9.10 1.1.1.1 `

Fallback DNS 填:

`text https://dns.alidns.com/dns-query `

对应的配置文件字段长这样(AdGuardHome.yamldns 段):

`yaml dns: upstream_dns: - https://dns.cloudflare.com/dns-query - https://doh.pub/dns-query - tls://1.1.1.1 bootstrap_dns: - 9.9.9.10 - 1.1.1.1 fallback_dns: - https://dns.alidns.com/dns-query upstream_mode: load_balance use_http3_upstreams: true ratelimit: 20 `

三个字段值得解释:

- upstream_mode 有两个可选值。load_balance 是按历史失败率与平均耗时做加权随机,把查询分散到各上游;parallel同时向所有上游发同一查询、谁先回用谁。parallel 延迟更低但会放大请求量,家庭场景用默认的 load_balance 就够。 - use_http3_upstreams: true 让支持 HTTP/3 的 DoH 上游走 QUIC 传输,在网络抖动较大的线路上体感更稳。 - ratelimit: 20 是每秒查询数限制(默认值),超出部分会被静默丢弃。这是防滥用的第一道闸;如果确认服务器只有你自己在用,可以按需调高,但不建议直接设成 0(关闭限速)

> 🔴 编辑 AdGuardHome.yaml 有一个必须记住的前提:容器运行时改这个文件会被覆盖。 官方文档明确说明——只有在 AdGuard Home 不在运行时修改配置文件才有效,否则程序退出时会把内存里的旧配置写回磁盘,你的修改无声消失。所以:要么全部在 Web 后台里改(推荐,改完即生效),要么先 docker compose stop、改完再 docker compose start

国内域名分流是中文用户最需要的一步:如果所有查询都走境外 DoH,访问国内网站会绕远路,解析变慢。AdGuard Home 支持 dnsmasq 风格的按域名指定上游语法:

| 写法 | 含义 | |------|------| | [/internal.local/]192.168.0.1 | 所有 *.internal.local 的查询交给 192.168.0.1 | | [/.host.com/]1.2.3.4 | 只把 .host.com 交给 1.2.3.4,host.com 本体仍走默认上游 | | [/domain1/domain2/]1.1.1.1 2.2.2.2 | 多个域名共用一个上游,上游可写多个 |

如果国内域名清单很长(成千上万条),不要把规则全塞进设置里,用 upstream_dns_file 字段指向一个文件即可——官方文档就推荐用社区维护的国内域名清单(例如 dnsmasq-china-list 这类项目)转换成 AdGuard Home 格式后从文件加载。

> ⚠️ 一个常见的配置错误:内网的私有 IP 反向解析(PTR 查询)不能填在「上游 DNS 服务器」里。你把 [/192.in-addr.arpa/]192.168.8.8 写在主上游字段是不会生效的,必须填到「私有反向 DNS 服务器」(对应配置项 local_ptr_upstreams)。官方文档专门强调了这一点。

第六步:导入过滤规则(拦截列表)

上游配好之后,去「过滤器 → DNS 拦截列表」添加规则源。规则源就是一份域名黑名单文件,AdGuard Home 会定时拉取更新。下面是几个经过长期维护、体量可信的选择:

| 规则集 | 来源 | 规模与特点 | |--------|------|-----------| | AdGuard DNS filter | 官方仓库 AdguardTeam/AdGuardSDNSFilter | 综合型,广告+追踪+恶意域名,AdGuard Home 默认自带 | | OISD | https://big.oisd.nl/domainswild | 社区公认误杀率低、覆盖广,长期维护 | | HaGeZi DNS Blocklists | GitHub hagezi/dns-blocklists | 分档清晰,可按"轻/中/重"选择不同严格度 | | StevenBlack hosts | GitHub StevenBlack/hosts | 经典老牌列表,生态成熟 |

添加方式:在后台「过滤器 → DNS 拦截列表 → 添加拦截列表」,把上面的地址填进「列表 URL」并保存,然后点「检查更新」。建议先只开 AdGuard DNS filter + OISD 两个,跑一到两周观察是否误杀,再决定是否叠加更严格的档位。

几个实战要点:

- 规则越多越占内存。 每一条规则都要常驻内存参与匹配,百万级条目会把 1GB 内存的机器吃到很紧张。判断标准很简单:后台首页会显示"规则数"和进程内存,如果内存持续逼近上限,就该减规则或加内存。 - 误杀怎么排查? 打开「查询日志」,把过滤条件切到"已拦截",就能看到最近被拦掉的域名、来源设备和命中规则;找到误杀的域名后,在「自定义过滤规则」里加一条 @@||example.com^(例外规则)放行即可,不要为此关掉整个规则集。 - 不要迷信"规则越多越干净"。 严格列表中包含大量与个人使用无关的条目(比如某些地区广告、特定 App 的统计域名),盲目全开换来的往往是把正常的支付回调、App 推送一起拦掉。

> 🚀 通过 5.chengzicloud.cloud 购买阿里云/AWS/腾讯云国际版均有额外折扣,点击首页查看最新优惠。

第七步:让设备真正用上它(路由器、单机、手机)

服务端配好只是做了一半,真正决定效果的是客户端有没有把 DNS 交给你。三种方式,按省事程度排序:

方式一(推荐):在路由器上改 DHCP 下发的 DNS。 打开路由器后台(通常是 192.168.0.1192.168.1.1),找到「DHCP 设置」或「DNS 设置」,把 DNS 服务器改成你的 AdGuard Home 地址。保存后,家里所有通过 DHCP 获取 IP 的设备(手机、电视、盒子、音箱)重启联网后自动生效,一台都不用配置。如果路由器不支持自定义 DNS,可以让 AdGuard Home 自己充当 DHCP 服务器接管——但这一步有风险,改错会让全家连不上网,建议等整套系统稳定运行一段时间后再动。

方式二:单机手动设置。 Windows 在「网络和共享中心 → 更改适配器设置 → 属性 → IPv4 → 使用下面的 DNS 服务器地址」里填;macOS 在「系统设置 → 网络 → 高级 → DNS」;Android 在 Wi-Fi 高级选项中把 IP 设置改为静态后填 DNS;iOS 在 Wi-Fi 详情页的「配置 DNS」里改。这些步骤官方文档都有逐屏说明。

方式三:手机/电脑直接走加密 DNS。 如果客户端支持自定义 DoH(Chrome、Edge、部分安卓系统都支持),可以直接把 DoH 地址填成你的服务器域名,这样连 53 端口的开放都不需要,也不用担心所处网络屏蔽 53。

> 🔴 两个会让"拦截漏掉一半"的经典坑,几乎每个新手都会踩: > > 坑一:多填了一个"备用 DNS"。 很多教程会教你填"首选 你的服务器、备用 8.8.8.8"。这是错的——客户端在首选超时或轮询时会用备用 DNS,那一部分查询就绕过了你的拦截,表现为"时灵时不灵"。正确做法是只填你那一台,备用留空。如果你担心单点故障,正解是再开一台服务器做第二台 AdGuard Home,而不是填一个公共 DNS。 > > 坑二:忘了 IPv6 的 DNS。 如果你的宽带和路由器开了 IPv6,路由器会通过 DHCPv6/RA 下发 IPv6 的 DNS 地址。设备在 IPv6 可用时会优先走 IPv6 的 DNS,于是你改的 IPv4 DNS 形同虚设——记得把 IPv6 的 DNS 也改掉,或者干脆在路由器上关闭 IPv6 的 DNS 下发

第八步:验证整套链路

dig 工具(Ubuntu:apt -y install dnsutils;CentOS:yum -y install bind-utils),然后按顺序验证:

`bash // 1. 在本机验证:被拦截的域名应该返回 0.0.0.0 或 NXDOMAIN dig @127.0.0.1 doubleclick.net +short

// 2. 在本机验证:正常域名应该正常返回 IP dig @127.0.0.1 www.baidu.com +short

// 3. 在家庭网络里验证:随便一台设备查询,确认走的是你的服务器 dig @你的服务器IP example.com +short

// 4. 看容器日志有没有报错 docker compose -f /opt/adguardhome/docker-compose.yml logs --tail=30 `

判断标准很直接:第 1 条返回 0.0.0.0(或者解析失败),第 2、3 条返回真实 IP,就说明拦截与转发都通了。此时回到后台首页,"查询总数""被拦截比例"两个数字会开始滚动,被拦截比例通常在 10%~30% 之间属于正常区间——如果你的比例是 0,那一定是客户端还没把 DNS 指过来,而不是规则没生效。

四、进阶:把它变成一台真正的"加密 DNS 服务端"

如果你希望在外网用手机、笔记本时也能用上自己的 DNS(而不是只在家庭局域网里生效),AdGuard Home 可以直接充当 DoH/DoT/DNSCrypt 服务端——这是它相比 Pi-hole 最明显的优势之一:官方文档的能力对照表里,Pi-hole 要跑 DoH/DoT 服务端需要额外装软件,而 AdGuard Home 是开箱内置。

各协议对应的端口如下(这是在 Docker 里需要放行/映射的端口清单):

| 端口 | 协议 | 用途 | |------|------|------| | 53/tcp + 53/udp | DNS | 普通 DNS,局域网内必开 | | 80/tcp | HTTP | 管理后台(首次向导用 3000) | | 443/tcp + 443/udp | DoH / HTTP3 | DNS-over-HTTPS,外网加密解析的首选 | | 853/tcp | DoT | DNS-over-TLS | | 853/udp | DoQ | DNS-over-QUIC | | 5443/tcp + 5443/udp | DNSCrypt | 老客户端兼容用 |

要让 DoH/DoT 可用,你需要三样东西:一个域名该域名签发的证书、以及后台「加密设置」里启用对应服务。证书用 Let's Encrypt 免费签发即可。启用后,把 DoH 地址填进手机(设置 → 网络 → 私人 DNS 支持 dns.example.com 这种 DoT 写法)或浏览器,你在任何网络下都能用上自己的过滤策略——而且因为是 443/853 加密端口,连 53 端口都不需要对外开放,这在屏蔽 53 的网络环境里反而更实用。

分客户端策略。 AdGuard Home 支持按客户端(设备)分别下发配置:在「客户端设置」里为每台设备建一条记录,指定它的 IP,然后单独选择要启用哪些拦截列表、是否强制安全搜索、是否走不同上游。官方文档给了一个更好的做法:用 ClientID 而不是 IP 来识别客户端——在客户端配置里生成一个 ClientID,让该设备在查询时携带它,这样即使 IP 变了(手机切换网络)策略也不会失效。

DNS 重写。 在内网长期用 NAS 的人会很喜欢这个功能:把 nas.homerouter.home 这类自定义域名重写到内网 IP,从此不用记 192.168.x.x。注意区分两件事——「DNS 重写」是给你自己定义的名字指路,而「私有反向 DNS 服务器」(local_ptr_upstreams)解决的是内网 IP 反查主机名,两者不要混填。

用 host 网络模式看到真实客户端 IP(可选)。 本文默认的端口映射方式下,AdGuard Home 看到的客户端 IP 都是 Docker 网关地址(类似 172.17.0.1),统计里所有设备会混成一条。如果你要做分设备策略,就需要让容器直接使用宿主机的网络栈——把 compose 里的 ports 段删掉,改成 network_mode: host,然后 docker compose up -d 重建容器。改之前务必确认防火墙已经收敛(host 模式下管理端口也会直接对公网可见),改完之后再用后台的「设置 → 常规设置」把 Web 界面绑定收敛到 127.0.0.1:3000

统计数据的保留。 AdGuard Home 会把查询统计写进 work/stats.db(SQLite)。家庭场景下这个文件增长很慢,但如果你开了全量查询日志,它会持续变大。建议在「设置 → 常规设置」里把统计保留期设成 7~30 天,既够排查误杀,又不会让磁盘无限膨胀。

五、安全加固清单(八条,逐条勾掉)

自建 DNS 最危险的失败不是"广告没拦干净",而是被人当成免费的开放解析器。一旦被滥用,你承担的是别人的攻击流量。下面八条按重要性排序:

1. 53 端口只对自己开放。 这是最重要的一条,第一步已经做了——云安全组 + 系统防火墙双重收敛,只放行你的出口 IP 或 VPN 网段。永远不要写 0.0.0.0/0

2. 开启"允许的客户端"白名单模式。 这是最后一道保险。在「设置 → DNS 设置 → 访问设置」里把模式从"允许所有客户端"切换为"仅允许指定的客户端",然后把你的家庭 IP 段和 ClientID 填进「允许的客户端」。官方文档明确建议:如果把 DNS 服务对公网开放,就应该使用白名单模式——因为一旦你的 IP 白名单失效(家宽换 IP),白名单仍然是拒绝的,而不是裸奔。

3. 不要关掉限速。 默认 ratelimit: 20(每秒查询数)就是为防 DDoS 设计的,超出部分会被静默丢弃。如果你有已知的客户端列表,正确做法是在「限速白名单」里把它们排除,而不是把全局限速设成 0。

4. 管理后台不要暴露在公网。 本文选择让 3000 端口只绑 127.0.0.1、通过 SSH 隧道访问,这是最省心的方案。如果你确实想要直接在浏览器里管,那必须同时做到三件事:走 HTTPS、用强密码、并保留 AdGuard Home 自带的登录失败锁定(配置项里可以设失败次数上限与封禁时长,为 0 则关闭该机制,不要设成 0)。

5. 单独跑、别用 root 起服务。 官方支持非 root 运行:给二进制授予绑定低端口的能力即可,这样即使服务被攻破,攻击者拿到的也不是 root shell。

`bash // Linux 下让非 root 用户也能绑定 53 端口 setcap 'CAP_NET_BIND_SERVICE=+eip CAP_NET_RAW=+eip' ./AdGuardHome `

6. 收紧安装目录权限。 官方文档专门提醒:安装目录的属主与权限必须设对,否则可能被"二进制替换"(binary planting)方式提权——攻击者在可写目录里放一个同名文件,等下次服务以高权限启动时执行它。用 Docker 部署天然缓解了这个问题,但仍建议把配置目录锁进 700、配置文件锁进 600:

`bash chown -R root:root /opt/adguardhome chmod 700 /opt/adguardhome/conf chmod 600 /opt/adguardhome/conf/AdGuardHome.yaml ls -la /opt/adguardhome/conf `

7. 校验你下载的二进制。 如果你不走 Docker 而是直接下载二进制,官方提供了 GPG 公钥用于校验签名(密钥 ID 为 28645AC9776EC4C00BCE2AFC0FE641E7235E2EC6,从 keys.openpgp.org 拉取)。走 Docker 则简单得多——镜像由官方发布,用 docker compose pull 更新即可,顺手可以用 docker image inspect 看一眼镜像摘要是否与官方发布一致。

8. 备份配置,升前必备份。 需要备份的只有两样:/opt/adguardhome/conf/(配置)和 /opt/adguardhome/work/(统计与状态)。最简单的一条命令:

`bash tar czf /root/adguardhome-backup-$(date +%F).tar.gz -C /opt adguardhome ls -lh /root/adguardhome-backup-*.tar.gz `

> ⚠️ 备份的意义不只是防丢:升级 AdGuard Home 前先备份配置,万一新版本改了配置结构导致启动失败,回滚只需要把 conf 目录换回去。

六、常见问题 FAQ

Q1:AdGuard Home 和 Pi-hole 该选哪个?

两者都用 DNS 沉洞原理,拦截广告和追踪器的能力在同一档。差别在开箱能力:官方对照表显示,AdGuard Home 原生支持加密上游(DoH/DoT/DNSCrypt)、原生支持把自身作为 DoH/DoT 服务端、原生支持恶意与钓鱼域名拦截、家长控制、强制安全搜索、按客户端配置、访问控制白名单、以及非 root 运行;Pi-hole 在加密上游与服务端这两项上通常需要额外装软件或手工改配置(例如自己配置 lighttpd 才能给后台加 HTTPS),且不是原生跨平台(只能通过 Docker 跑在非 Linux 系统上)。结论:想少折腾、要加密解析和可视化管理,选 AdGuard Home;已经有了 Pi-hole 生态和习惯,两者都能满足基础去广告需求,不必为了切换而切换。

Q2:一定要用海外服务器吗?国内机器能搭吗?

技术上都可以。选海外主要因为三件事:不需要备案、不需要向运营商解释你为什么要开 53 端口、按流量计费更灵活。但要注意两个反向因素:一是国内到海外服务器有额外 RTT,而 DNS 是同步阻塞的,如果你只服务一个家庭局域网,把 AdGuard Home 装在本地软路由或树莓派上延迟更低;二是国内节点拉取 Docker 镜像和规则列表可能很慢。所以真实建议是:只在家庭内用 → 本地设备;要跨地点用、要免备案的公网入口 → 海外 VPS

Q3:会不会很吃配置?为什么推荐 1核2G 而不是最低配?

不吃 CPU,吃的是"别 OOM"。AdGuard Home 是单个 Go 二进制,没有数据库和运行时依赖,1 核足以扛住一个家庭的查询量。要 2GB 内存的原因有两条:规则集全部常驻内存参与匹配(百万级条目会吃掉可观内存),以及服务被 OOM 杀掉等于全家断网。这属于"宁可多花一美元也不要在关键时刻断网"的服务,配置上不要抠。

Q4:装完了,为什么广告还是照旧出现?

按出现频率从高到低排查五件事:① 客户端压根没用你的 DNS——去后台首页看"查询总数",如果基本不涨,就是设备还没指过来;② 填了备用 DNS——部分查询走了备用解析,把备用留空;③ 系统或浏览器的 DNS 缓存——清掉缓存或重启设备,DNS 记录有 TTL,不会立刻生效;④ IPv6 的 DNS 没改——设备走 IPv6 DNS 绕过了你;⑤ 广告与内容同域——YouTube、Twitch 的前贴片、社交平台的信息流推广,DNS 层原理上就拦不掉,只能靠浏览器扩展。还有一个容易忽略的情况:部分 App 内置了自己的 DoH/DoT 解析,直接绕开系统 DNS,这类流量你的服务器根本看不到。

Q5:CentOS 7 上跑会不会遇到 glibc 问题?

一般不会。AdGuard Home 官方发布的是静态链接的 Go 二进制,不像 code-server、Meilisearch、Ollama 那类依赖系统 glibc 新版本的项目(它们在新版二进制上会报 GLIBC_2.xx not found)。本文的 Docker 路线更是彻底规避了这个问题——宿主机只负责跑容器引擎,glibc 不参与服务进程。CentOS 7 上唯一要额外注意的是 Compose v2 插件需要按第二步手动补装/usr/local/lib/docker/cli-plugins/docker-compose)。

Q6:会不会把我需要的正常网站、支付、推送一起拦掉?

有可能,严格列表越叠越多,误杀概率越高。两个做法把风险降到最低:第一,先只开 AdGuard DNS filter + OISD,跑一到两周再决定是否加更严格的档位;第二,误杀时打开「查询日志」,切到"已拦截"筛选,找到被拦的域名后在「自定义过滤规则」里加一条例外规则放行:

`text @@||example.com^ `

这条规则的意思是"对所有 example.com 及其子域做例外处理"。不要为了一个误杀去关掉整个规则集——那是把洗澡水和孩子一起倒掉。另外,如果你发现某个 App 的推送、支付回调失效,优先检查是不是它的统计域名被拦了。

Q7:53 端口被云厂商封了,或者我所在网络屏蔽了 53,怎么办?

两个方向:一是改用加密解析入口——在「加密设置」里启用 DoH(443)或 DoT(853),客户端走这两个端口,就完全不需要 53 对外可达,这在屏蔽 53 的网络环境里反而是最优解;二是只在内部使用——把 53 的访问范围限制在 VPN 网段内,让设备先连上 VPN 再使用你的 DNS。顺带说一句:如果你的家庭宽带运营商也做了 53 劫持(把 53 查询强制劫持到自己的服务器),那用普通 DNS 是无论如何都拿不到你想要的解析结果的,必须走加密协议。

Q8:服务器一旦宕机,全家是不是就断网了?怎么提高可用性?

是的,只填一台自建 DNS 的情况下,这台机器挂掉表现为"家里所有设备上不了网",比网站打不开严重得多。三条务实的缓解措施:① 有条件的就再开一台小机器做第二台 AdGuard Home,客户端同时填这两台的 IP(注意:这里填的是你自己的第二台服务器,不是公共 DNS,性质完全不同);② 给这台机器配云厂商的自动快照 + 服务存活监控告警,宕机时第一时间知道;③ 日常按第五节的清单做加固,把"被滥用导致 IP 被封"这个最常见的宕机原因掐掉。

七、总结

用海外云服务器搭建 AdGuard Home,整条链路其实就是八步:系统初始化并把 53 端口收敛到只对自己开放、装 Docker 与 Compose v2、规划目录写 compose、完成初始向导、配加密上游与国内域名分流、导入克制的拦截规则、让路由器把 DNS 下发下去、最后跑通验证命令。一台 1核2G 的海外 VPS、月费几美元,全家手机电视盒子一起生效,且查询日志只留在你自己的机器上。

真正决定成败的是三个细节,而不是命令本身:第一,53 端口绝不能对全网开放——这是安全底线,不是优化项;第二,客户端只填一台 DNS、别忘了 IPv6 的 DNS——这两件事决定了拦截是"全通"还是"时灵时不灵";第三,规则从少到多慢慢加——先开两个列表观察两周,比一次开八个列表然后天天修误杀要省心得多。

最后回到一个诚实的分界:DNS 层拦截能把绝大多数网页广告、App 内嵌追踪、电视盒子贴片挡在门外,但它拦不掉与内容同域的广告(YouTube、Twitch 前贴片,社交平台信息流推广),也挡不住自带加密解析的 App。如果你的目标是"全家更干净的网络环境",AdGuard Home 是性价比极高的一环;如果你期待它连视频前贴片一起消灭,那需要的是内容过滤型客户端,而不是 DNS。把它的能力边界说清楚,是这篇文章最想留下的一句话。

延伸阅读: - Docker + Portainer 容器管理平台搭建完整教程 - 服务器监控完整教程:Prometheus + Grafana + Telegram 告警 - 海外云服务器搭建 WireGuard 轻量 VPN 完整教程 - 网站安全加固完整教程:fail2ban + ModSecurity + 安全响应头 - Nginx 反向代理 + Let's Encrypt 免费 SSL 证书配置完整教程

> 本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。