Ubuntu 24 解决 AdGuard Home 53 端口被占用问题
Ubuntu 24 默认启用了 systemd-resolved,它会占用 53 端口作为 DNS Stub Listener,导致 AdGuard Home 无法绑定 DNS 端口。
最常见的报错:
listen tcp 0.0.0.0:53: bind: address already in use或者:
bind: address already in use本质上是 systemd-resolved 抢占了 127.0.0.53:53。
确认是谁占用了 53 端口
bash
sudo ss -tulnp | grep :53如果看到 systemd-resolved,说明就是它在捣鬼。
推荐方案:禁用 DNS Stub Listener(Ubuntu 24 最稳定)
第一步:编辑 resolved.conf
bash
sudo nano /etc/systemd/resolved.conf找到 #DNSStubListener=yes,修改为:
ini
[Resolve]
DNS=1.1.1.1
DNSStubListener=noDNSStubListener=no:关闭 53 端口监听,释放给 AdGuard HomeDNS=1.1.1.1:设置一个备用上游 DNS,确保系统自身解析不受影响
第二步:重建 resolv.conf
这是 Ubuntu 24 非常关键的一步。
先删除原来的软链接:
bash
sudo rm /etc/resolv.conf然后指向 systemd-resolved 生成的真实配置:
bash
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf第三步:重启 systemd-resolved
bash
sudo systemctl restart systemd-resolved第四步:确认 53 端口已释放
bash
sudo ss -tulnp | grep :53正常情况下不应该再看到 127.0.0.53:53。
第五步:启动 AdGuard Home
Docker 部署:
bash
docker compose up -d原生安装:
bash
sudo ./AdGuardHome -s startDocker 部署注意事项
如果你用 Docker 部署 AdGuard Home,端口映射必须是真正的 53:
yaml
ports:
- "53:53/tcp"
- "53:53/udp"不要改成 5353:53——大多数设备(路由器、手机等)无法指定 DNS 端口,改了之后 DNS 查询会完全失效。
备选方案:直接禁用 systemd-resolved
bash
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved这种方式更暴力,但 Ubuntu 24 有时会导致系统自身的 DNS 解析失效,因此更推荐上面的 DNSStubListener=no 方案。
总结
| 方案 | 推荐度 | 风险 |
|---|---|---|
DNSStubListener=no + 重建 resolv.conf | ⭐⭐⭐⭐⭐ | 低,系统 DNS 不受影响 |
| 直接禁用 systemd-resolved | ⭐⭐ | 高,可能导致系统 DNS 失效 |
核心思路就是:让 systemd-resolved 别监听 53 端口,把位置让给 AdGuard Home。