You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Debian 12环境下Celery/Redis DNS解析异常(特定VPS提供商)及systemd-resolved与AdGuard端口冲突问题求助

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 addrip route确认接口IP、路由信息,反向推导配置来源

三、如何让系统不依赖systemd-resolved,保留静态resolv.conf?

您可以按以下步骤操作,彻底脱离systemd-resolved的依赖:

  1. 将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
    
  2. 禁用systemd-resolved服务

    sudo systemctl stop systemd-resolved
    sudo systemctl disable systemd-resolved
    sudo systemctl mask systemd-resolved
    
  3. 调整NSS解析顺序
    编辑/etc/nsswitch.conf,找到hosts行,把默认的resolve模块去掉,改为:

    hosts:          files dns
    

    这样系统会优先读取/etc/hosts,然后直接使用resolv.conf里的DNS服务器,不再依赖systemd-resolved的解析模块。

  4. 防止其他工具修改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.53127.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

火山引擎 最新活动