碎碎念
你是否也遇到过这些痛点:
记不住端口号:每次访问服务都要输入
192.168.0.250:8889,不仅难记,还不够优雅。NAT 回环(Hairpin NAT)问题:在家里访问自己的域名
yanchang.cc,却被路由器“踢”回来,或者绕一大圈去公网再回来,速度慢且不稳定。DNS 污染与劫持:运营商的 DNS 经常把网页导向广告,或者解析速度慢如蜗牛。
科学环境下的 DNS 泄露:开了代理软件后,内网域名无法解析,或者被错误地发往公网 DNS。
今天,我们就用 AdGuard Home 来一站式解决这些问题,打造一个秒级响应、去广告、支持内网域名自动解析的 DNS 中心。
1. 准备工作
1.关闭原有53端口服务
Ubuntu 默认运行着 systemd-resolved 服务,它占用了 53 端口,这会与 DNS 服务器冲突。我们需要先禁用它:
# 停止并禁用 systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
# 备份原有的 resolv.conf
sudo mv /etc/resolv.conf /etc/resolv.conf.bak
# 创建一个新的 resolv.conf,让服务器自己能上网(暂时指向公共DNS)
echo "nameserver 223.5.5.5" | sudo tee /etc/resolv.conf
2. 准备工作
首先创建项目目录:
sudo mkdir -p /opt/adguardhome/work /opt/adguardhome/conf
cd /opt/adguardhome
3. 编写 docker-compose.yml
在 /opt/adguardhome 目录下创建并编辑文件:
Bash
sudo vi docker-compose.yml
将以下内容粘贴进去:
services:
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
restart: unless-stopped
ports:
# 只监听内网 IP 的 53 端口,防止 DMZ 导致公网被扫描
- "192.168.0.250:53:53/tcp"
- "192.168.0.250:53:53/udp"
# 管理界面也只允许自己访问,后续访问的时候建立ssh隧道
- "127.0.0.1:3000:3000/tcp"
volumes:
- /opt/adguardhome/work:/opt/adguardhome/work
- /opt/adguardhome/conf:/opt/adguardhome/conf
networks:
# 方便后续加入authentik网络
- authentik-internal
networks:
authentik-internal:
external: true关键点解析
ports映射:- "127.0.0.1:3000:80/tcp"。注意,这里我们将宿主机的 3000 (Localhost) 映射到容器内部的 80(AdGuard 默认管理端口)。这样,只有宿主机自己能通过localhost:3000访问,局域网其他电脑无法访问。networks:加入authentik-internal网络。这是让 Authentik 能“摸”到 AdGuard Home 的唯一网线。
4.启动
sudo docker compose up -d配置工作
1.修改用户界面为3000端口
2.配置DNS重写
我们要实现的效果是:无论你在哪里,输入 yanchang.cc 都能访问,但在家里时,它直接指向内网 IP,速度达到千兆/万兆。
进入 过滤器 -> DNS 重写,添加规则:
域名:
*.yanchang.cc(注意前面的星号,代表泛解析)应答 IP:
192.168.0.250(你的 Nginx 反代服务器 IP)
原理: 当你在家请求 music.yanchang.cc 时,AdGuard Home 不会去问阿里云,而是直接告诉你:“别出门了,就在你旁边,IP 是 192.168.0.250”。这样流量完全不经过路由器 WAN 口,速度极快且稳定。

3.clash代理DNS设置
很多同学配置好 AdGuard Home 后,发现一开 Clash,内网域名 yanchang.cc 就打不开了。这是因为 Clash 默认抢占了 DNS 查询,且不知道你内网的存在。
网上很多教程教你写复杂的脚本、改配置文件,其实根本不需要那么麻烦!
我们只需要在 Clash Verge 的设置里,强制它使用“系统 DNS”即可。
操作步骤:
打开 Clash Verge -> 设置。
找到 “DNS 设置” (或者叫 DNS 覆写)。



4. 配置“黄金”上游 DNS
为了让国内访问速度起飞,同时防止 DNS 劫持,我们采用 阿里 DoT + 腾讯 DoT 的组合。
进入 AdGuard Home 设置 -> DNS 设置:
1. 上游 DNS 服务器
填入以下内容,建议勾选 “并行请求”(谁快用谁):
Plaintext
# 阿里云 DNS over TLS (DoT) - 极速且防劫持
tls://dns.alidns.com
# 腾讯云 (DNSPod) DoT - 备选,解析精准
tls://dns.pub
# 阿里云普通 UDP (作为兜底,防止加密握手失败)
223.5.5.5
2. Bootstrap DNS
用于解析上述 DoT 域名的 IP:
Plaintext
223.5.5.5
119.29.29.29
配置完成后,点击“测试上游”,你会发现响应时间通常在 10ms - 30ms 之间,网页打开速度会有肉眼可见的提升。
Authentik 设置(搭建外部VPN访问)
既然外网和内网都访问不了管理后台,我们怎么进去?答案是让 Authentik 做“摆渡人”。
因为两者都在 authentik-internal 同一个 Docker 网络里,Authentik 可以直接通过容器名访问 AdGuard Home。
第一步:创建 Proxy Provider (代理提供程序)
进入 Authentik 管理后台 ->(应用) -> (以提供程序创建)。

2.点击 选择提供程序,选择 Proxy Provider。
填写信息:
Name:
Provider for ****Authorization Flow: 选择默认授权流程。
代理: 勾选(我们作为反向代理使用)。
外部主机:
https://dns.yanchang.cc:9001(你希望用来访问的域名)。内部主机:
http://adguardhome:3000
关键设置 - Upstream (上游):
这里不要填
127.0.0.1,也不要填192.168.0.250。直接填 Docker 容器内的地址:
http://adguardhome:3000原理:在 Docker 网络内部,通过容器名
adguardhome直接解析 IP,完全绕过宿主机防火墙。
第二步:创建 Application (应用)
后续一路点默认即可
第三步:配置 Outpost (前哨站)
确保你的 Outpost(通常是内嵌的 docker outpost)已经包含了这个新应用。如果你使用的是默认的 docker-compose 部署 Authentik