Debian 12环境下Celery/Redis DNS解析异常(特定VPS提供商)及systemd-resolved与AdGuard端口冲突问题求助
您好,针对您遇到的这几个问题,我结合Debian 12的网络配置逻辑和Celery/Redis的DNS解析行为,给您整理一下排查思路和解决方案:
一、为什么这个特定VPS会依赖systemd-resolved?
首先建议您先检查/etc/resolv.conf的实际类型——虽然您看到的内容是静态的nameserver配置,但它很可能是软链接指向systemd-resolved生成的文件(比如/run/systemd/resolve/stub-resolv.conf)。您可以用这个命令确认:
ls -l /etc/resolv.conf
如果确实是软链接,那当systemd-resolved停止后,这个链接指向的文件会失效/消失,系统的DNS解析会 fallback 到更慢的兜底机制(比如反复重试、使用系统内置的低效解析逻辑),这就直接导致Celery任务里连接远程Redis的DNS解析超时,进而拉长任务执行时间。
而您其他60台VPS的/etc/resolv.conf应该是真正的静态文件,不受systemd-resolved启停的影响,所以不会出现这个问题。
二、找不到传统网络配置文件,该去哪里查?
Debian 12现在默认的网络管理工具不止/etc/network/interfaces和systemd-networkd,您可以从这几个方向排查:
- 检查是否使用NetworkManager:执行
nmcli connection show,看是否有被NetworkManager管理的网络连接,对应的配置文件通常在/etc/NetworkManager/system-connections/目录下 - 查看临时生成的网络配置:
/run/systemd/network/目录下可能有提供商自动生成的临时网络配置文件 - 检查VPS提供商的自定义工具:部分云厂商会自带网络配置agent,可以查看进程列表里是否有相关进程
- 直接查看当前网络状态:用
ip addr和ip route确认接口IP、路由信息,反向推导配置来源
三、如何让系统不依赖systemd-resolved,保留静态resolv.conf?
您可以按以下步骤操作,彻底脱离systemd-resolved的依赖:
将resolv.conf转为静态文件
先备份原文件,然后创建独立的静态配置:sudo cp /etc/resolv.conf /etc/resolv.conf.bak sudo rm /etc/resolv.conf sudo nano /etc/resolv.conf写入您需要的DNS配置:
nameserver 1.1.1.1 nameserver 1.0.0.1保存退出后,修改文件权限防止被自动覆盖:
sudo chattr +i /etc/resolv.conf禁用systemd-resolved服务
sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved sudo systemctl mask systemd-resolved调整NSS解析顺序
编辑/etc/nsswitch.conf,找到hosts行,把默认的resolve模块去掉,改为:hosts: files dns这样系统会优先读取
/etc/hosts,然后直接使用resolv.conf里的DNS服务器,不再依赖systemd-resolved的解析模块。防止其他工具修改resolv.conf
如果您的系统用NetworkManager,需要编辑/etc/NetworkManager/NetworkManager.conf,在[main]段添加:dns=none然后重启NetworkManager:
sudo systemctl restart NetworkManager
四、systemd-resolved与AdGuard的53端口冲突问题
目前的监听状态其实不会产生冲突:
- AdGuard绑定的是
172.16.96.0这个WireGuard子网的IP - systemd-resolved绑定的是
127.0.0.53和127.0.0.54这两个本地回环IP
TCP/UDP的监听是基于「IP+端口」的组合,不同IP上的同端口监听是完全独立的,所以WireGuard客户端的DNS请求会正常发到AdGuard绑定的172.16.96.0:53,而本地系统的DNS请求默认会发到127.0.0.53:53(systemd-resolved的stub服务),两者互不干扰。
如果您之后禁用了systemd-resolved,还可以把/etc/resolv.conf的nameserver改成172.16.96.0,让本地系统也使用AdGuard做DNS解析,一举两得。
额外排查建议
您可以测试一下DNS解析速度,确认是否是DNS问题导致Celery任务超时:
- 运行systemd-resolved时:
dig @127.0.0.53 <您的远程Redis域名> - 停止systemd-resolved后:
dig @1.1.1.1 <您的远程Redis域名>
对比两次的响应时间,就能明确是不是DNS解析慢在拖后腿。
备注:内容来源于stack exchange,提问作者Houman




