主题
AdGuard 从 Server2 迁移到腾讯云(2026-06-13)
目的:①给最弱的 Server2(1核1G,内存可用仅 389M)减负——AdGuard 占 196M + Docker ~40M ≈ 236M;②腾讯云在上海(国内),跑 DNS 对国内设备解析更快。 DNS 服务(53/853)不需要 ICP 备案,所以不受
.in域名无法备案的限制,可直接上腾讯云。
当前进度
- ✅ AdGuard 容器已在腾讯云跑通:解析正常、广告拦截正常、过滤器已加载
- ✅ 防火墙已放行(2026-06-13,用 Lighthouse API
CreateFirewallRules自动放行):UDP 53、TCP 853、TCP 3001(TCP 53 之前已存在)。脚本tc_firewall.py - ✅ 公网验证通过:从 Server2 真·外部客户端
dig @〈腾讯云-IP〉,doubleclick.net/ad.doubleclick.net→0.0.0.0(拦截),baidu.com→真实 IP(正常)- ⚠️ 坑:Windows
nslookup <域名> 〈腾讯云-IP〉会误显示「未拦截」(nslookup 对指定 server 并发/回退乱来),别用它验证,用 Linuxdig才准
- ⚠️ 坑:Windows
- ⏳ 下一步:切设备 DNS 到
〈腾讯云-IP〉(原指向 Server2〈Server2-IP〉) - ⏳ 切完确认设备正常 → 才停 Server2 AdGuard(释放 236M,停前必须再确认)
Lighthouse API 密钥已存
F:\project\凭据库.md。注意tc_firewall.py里硬编码了 SecretKey(本地文件,勿外传/勿提交公开仓库)。
部署架构
| 项 | 值 |
|---|---|
| 运行方式 | Docker 容器 adguardhome(adguard/adguardhome:latest,--restart unless-stopped) |
| 数据目录 | /opt/adguard/conf(配置)+ /opt/adguard/work(过滤器缓存/querylog) |
| 配置文件 | /opt/adguard/conf/AdGuardHome.yaml |
| DNS 监听 | 10.0.0.15:53(内网网卡 IP,公网经腾讯云 NAT 映射)TCP+UDP |
| 其他端口 | 853(DoT)/ 3001(Web 管理,0.0.0.0) |
| 上游 DNS | https://doh.pub/dns-query(腾讯 DNSPod,腾讯云访问极快) |
| bootstrap | 223.5.5.5 / 119.29.29.29(国内) |
| 过滤器 | 8 个(7 启用),规则文件从 Server2 直接拷来(见坑 4) |
| querylog | interval: 12h(已限制,不会撑大磁盘) |
| Web 账号 | congyin(密码沿用 Server2 原配置) |
⚠️ 迁移踩的 4 个坑(重要,复现必看)
坑 1:腾讯云 docker 镜像加速器 504,拉不到镜像
mirror.ccs.tencentyun.com 拉 Docker Hub 镜像返回 504 Gateway Time-out。 解法:Server2 已有镜像,用 docker save | load 经 SSH 管道直传(不落本地盘):
bash
ssh myserver2 "docker save adguard/adguardhome:latest | gzip -1" | ssh tencent "gunzip -c | sudo docker load"坑 2:53 端口被 systemd-resolved 占用
腾讯云 Ubuntu 的 systemd-resolved 占着 127.0.0.53:53,docker -p 0.0.0.0:53:53 会报 address already in use,且 docker 改 iptables 时还会把当前 SSH 连接 conntrack 打断(连不上是正常现象)。 解法(不动系统 DNS,最干净):让 AdGuard 只绑内网网卡 IP 10.0.0.15:53,避开 127.0.0.53:
bash
sudo docker run -d --name adguardhome --restart unless-stopped \
-v /opt/adguard/work:/opt/adguardhome/work \
-v /opt/adguard/conf:/opt/adguardhome/conf \
-p 10.0.0.15:53:53/tcp -p 10.0.0.15:53:53/udp \
-p 853:853/tcp -p 3000:3000/tcp -p 3001:3001/tcp \
adguard/adguardhome(公网 〈腾讯云-IP〉:53 经腾讯云 1:1 NAT 到 10.0.0.15:53,正常收得到)
坑 3:上游 Quad9 DoH 在国内超时
原 Server2 配置上游是 dns10.quad9.net(国外),腾讯云国内访问超时(Client.Timeout exceeded)→ 解析全挂。 解法:改成国内加密 DNS:
bash
sudo sed -i 's#- https://dns10.quad9.net/dns-query#- https://doh.pub/dns-query#; \
s#- 9.9.9.10#- 223.5.5.5#; s#- 149.112.112.10#- 119.29.29.29#; \
/- 2620:fe::10/d; /- 2620:fe::fe:10/d' /opt/adguard/conf/AdGuardHome.yaml
sudo docker restart adguardhome坑 4:过滤器源是国外的,国内下不动
8 个过滤器源多在国外(adguardteam.github.io、easylist 等),腾讯云下载失败 → 规则为空 → 不拦广告。 解法:Server2 已下好规则(/opt/adguard/work/data/filters,13M),直接拷:
bash
ssh tencent "sudo docker stop adguardhome"
ssh myserver2 "cd /opt/adguard/work/data && tar czf - filters" | ssh tencent "sudo tar xzf - -C /opt/adguard/work/data"
ssh tencent "sudo docker start adguardhome"注意:以后 AdGuard 自动更新过滤器时,国外源仍可能更新失败。长久可考虑把过滤器源换成国内镜像(如 anti-AD 的国内地址)。
加密 DNS (DoT) 配置(2026-06-13 完成)
为让 iPhone(蜂窝数据也走)/ 安卓私人 DNS 能用,配了 DoT。故意只用 DoT(853) 不用 DoH(443),避开腾讯云国内机房对未备案域名 80/443 的扫描拦截。
- 域名:
dns.cong.in→ Cloudflare 已改指〈腾讯云-IP〉(灰云/不代理,DoT 必须直连) - 证书:acme.sh + Cloudflare DNS-01 签发 Let's Encrypt 证书(不碰 80 端口)。装在
~/.acme.sh/dns.cong.in_ecc/,--install-cert自动复制到/opt/adguard/conf/certs/{fullchain.pem,private.key}并docker restart adguardhome;续期自动重载(reloadcmd 已设)。 - AdGuard 配置:
AdGuardHome.yaml的 tls 段enabled: true/server_name: dns.cong.in/certificate_path: /opt/adguardhome/conf/certs/fullchain.pem/private_key_path: .../private.key(容器内路径)。改前备份.bak-<ts>。 - 验证:从 Server2
dig @〈腾讯云-IP〉 -p853 +tls +tls-hostname=dns.cong.in doubleclick.net→0.0.0.0(拦截,证书校验通过)。
客户端设置
- iPhone/iPad/Mac:装描述文件
F:\project\腾讯云\AdGuard-DoT-dns.cong.in.mobileconfig(DoT,全局含蜂窝)。装法见下。 - 安卓 9+:设置 → 网络 → 私人 DNS → 「私人 DNS 提供商主机名」填
dns.cong.in。全局生效(含移动数据)。 - 明文兜底:不想加密时直接填 DNS IP
〈腾讯云-IP〉(仅 WiFi)。
acme.sh 安装备注
github 直装失败(国内机),改用 gitee 镜像:git clone --depth1 https://gitee.com/neilpang/acme.sh.git && ./acme.sh --install。签发命令需 export CF_Token=<cfut...> CF_Zone_ID=6b08b474ecb65dd458d1373aa2f9c413。
待办(需要你操作 / 后续)
- 腾讯云控制台放行防火墙(必须,我没 Lighthouse API 密钥做不了): 控制台 → 轻量应用服务器 → 这台(上海) → 防火墙 → 添加:
UDP 53(必须)、TCP 53(必须)TCP 3001(Web 管理,建议「仅来源你的 IP」)TCP+UDP 853(DoT,可选)
也可以把腾讯云 API 密钥重新给我,我用
CreateFirewallRules自动放行。 - 放行后切设备 DNS 到
〈腾讯云-IP〉:路由器 DHCP DNS / 手机 / iPhone 描述文件(原指向 Server2〈Server2-IP〉)。 - ✅ 验证无误 → 已停 Server2 AdGuard(2026-06-13):
docker stop adguardhome(未 rm,Exited 状态、/opt/adguard数据卷保留,docker start adguardhome秒级恢复)。释放内存 available 319M→444M。观察 1~2 天无异常可再docker rm彻底清掉(可选)。
🔑 将来换域名清单(参考)
dns.cong.in 永久可用、DNS 不需备案,非必要不换。若有了可国内备案的新域名且想开 80/443 网页服务才值得换。换法:① 新域名加 A 记录→〈腾讯云-IP〉(灰云)② acme.sh DNS-01 重签证书 ③ 改 AdGuardHome.yaml server_name+重启 ④ 重生成 .mobileconfig,所有 iPhone 重装;安卓改私人 DNS 主机名。可新旧域名并存平滑切换。
安全提醒
公网开放 53 递归 DNS 有被滥用做「DNS 放大攻击」的风险。已有 ratelimit: 20 缓解(与 Server2 一致)。更稳可在 AdGuard 后台设 allowed_clients 限制来源,或只用 DoT(853) 加密 DNS。
常用运维命令
bash
ssh tencent "sudo docker logs --tail 30 adguardhome" # 看日志
ssh tencent "sudo docker restart adguardhome" # 重启
ssh tencent "dig @10.0.0.15 doubleclick.net +short" # 本机验证拦截(应 0.0.0.0)
# Web 管理:放行 3001 后 http://〈腾讯云-IP〉:3001 账号 congyin