Skip to content

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.net0.0.0.0(拦截),baidu.com→真实 IP(正常)
    • ⚠️ 坑:Windows nslookup <域名> 〈腾讯云-IP〉 会误显示「未拦截」(nslookup 对指定 server 并发/回退乱来),别用它验证,用 Linux dig 才准
  • 下一步:切设备 DNS〈腾讯云-IP〉(原指向 Server2 〈Server2-IP〉
  • ⏳ 切完确认设备正常 → 才停 Server2 AdGuard(释放 236M,停前必须再确认)

Lighthouse API 密钥已存 F:\project\凭据库.md。注意 tc_firewall.py 里硬编码了 SecretKey(本地文件,勿外传/勿提交公开仓库)。


部署架构

运行方式Docker 容器 adguardhomeadguard/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
上游 DNShttps://doh.pub/dns-query(腾讯 DNSPod,腾讯云访问极快)
bootstrap223.5.5.5 / 119.29.29.29(国内)
过滤器8 个(7 启用),规则文件从 Server2 直接拷来(见坑 4)
queryloginterval: 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.net0.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

待办(需要你操作 / 后续)

  1. 腾讯云控制台放行防火墙(必须,我没 Lighthouse API 密钥做不了): 控制台 → 轻量应用服务器 → 这台(上海) → 防火墙 → 添加:
    • UDP 53(必须)、TCP 53(必须)
    • TCP 3001(Web 管理,建议「仅来源你的 IP」)
    • TCP+UDP 853(DoT,可选)

    也可以把腾讯云 API 密钥重新给我,我用 CreateFirewallRules 自动放行。

  2. 放行后切设备 DNS〈腾讯云-IP〉:路由器 DHCP DNS / 手机 / iPhone 描述文件(原指向 Server2 〈Server2-IP〉)。
  3. ✅ 验证无误 → 已停 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

个人科研与运维文档 · 内容持续修订