最近把 AdGuard Home 从香港服务器迁到了国内阿里云(乌兰察布),起因是安卓手机私人 DNS 突然连不上:香港服务器的 853 端口(DoT)跨境握手被干扰,服务端明明回 SYN-ACK 却出不了境,手机端一直显示"无法连接"。折腾了一晚上,把这次迁移的坑记录下来,给同样自建 DNS 的朋友避雷。
一、数据迁移清单
AdGuard Home 的完整状态其实就三样:
AdGuardHome.yaml(配置文件:上游、规则、Web 设置)data/目录(querylog、stats 等)- 证书(DoT/DoH 用的 cert.pem / key.pem)
打包成一个 tar.gz 拷到新机解压即可,权限保持 root。注意证书目录权限:AGH 用 root 跑,证书文件可读即可。
二、最容易漏的:过滤规则源服务
我的 AGH 过滤规则列表 URL 配置的是 http://127.0.0.1:38080/merged-block.txt,原服务器上是一个本地 HTTP 服务(busybox httpd)在提供这个文件。迁移到新机后这个服务没了,AGH 启动时报:
filtering: updating filter ... dial tcp 127.0.0.1:38080: connect: connection refused规则更新失败不影响 DNS 查询,但新规则永远加载不进去。解决:在新机用 nginx 补一个 127.0.0.1:38080 的站点,root 指向规则目录即可,记得目录权限要对(nginx worker 是 nobody,目录要 755)。
三、443 分流(DoH + 博客共存)
一台机器同时跑博客和 AGH 时,用 nginx 的 SNI 分流:dns 子域的 443 流量转给 AGH 的 DoH(1443),www/根域转给博客的 TLS。这样 443 一个端口各取所需,证书各自独立。
四、时钟!时钟!时钟!
新机系统时间没同步,比真实时间快了 8 小时,导致 AGH 日志时间戳全部错乱,排查日志时差点误判"没有新日志"。装 chrony 一校准,立刻正常:
apk add chrony
rc-service chronyd start
rc-update add chronyd default五、日志"不显示"的真相
迁移后后台看不到新日志,折腾半天发现是浏览器还连在旧服务器上(DNS 缓存没过期)。旧机停掉、刷新页面后一切正常。遇到日志不对,先确认自己连的是哪台机器。
总之:数据打包、规则源、443 分流、时钟、验证,五步走完,DNS 服务无缝搬家。