Ubuntu Server 24.04.1 LTS下正确配置systemd-resolved(保留Stub模式与缓存)并禁用IPv6的方法求助
嘿,我看你遇到的问题挺典型的——用Stub模式的systemd-resolved时,resolvectl正常但host这类工具超时,大概率是IPv6干扰或者UDP监听的问题,而且你还想尽量用drop-in配置不碰现有软链,刚好我碰到过类似情况,给你一步步捋:
首先先明确你的核心问题:host用的是系统默认的Stub DNS(127.0.0.53)的UDP端口,但请求超时,而resolvectl是直接和resolved服务通信所以正常,说明Stub的UDP监听可能因为IPv6的问题没正常工作。
第一步:先确认UDP监听的状态
你之前的lsof输出没写完,先补全检查下UDP的情况:
sudo lsof -i udp:53 | grep systemd-resolve
如果看不到127.0.0.53的UDP处于LISTEN状态,那就是问题根源了——resolved的Stub模式UDP监听没起来,导致host这类用UDP的工具连不上。
第二步:用Drop-In配置搞定(完全不碰现有软链)
这是最符合你需求的方式,不用改任何默认软链,直接加自定义配置:
- 先创建resolved的Drop-In目录,没有的话就建一个:
sudo mkdir -p /etc/systemd/resolved.conf.d
- 新建一个优先级高的配置文件,比如
99-disable-ipv6-stub.conf(数字越大优先级越高):
sudo nano /etc/systemd/resolved.conf.d/99-disable-ipv6-stub.conf
把下面内容粘进去,记得把DNS换成你自己要用的:
[Resolve] # 强制开启Stub模式,保留127.0.0.53的监听 DNSStubListener=yes DNSStubListenerExtra=127.0.0.53 # 完全禁用resolved的IPv6支持,避免干扰 IPv6=no # 明确开启缓存 Cache=yes # 填你自己的DNS服务器,比如谷歌的8.8.8.8和8.8.4.4 DNS=8.8.8.8 8.8.4.4 # 清空fallback DNS,防止系统自动加IPv6的DNS FallbackDNS=
- 保存退出后,重启resolved服务让配置生效:
sudo systemctl restart systemd-resolved
第三步:验证配置是否生效
先检查软链有没有被改动(肯定不会,因为我们用的Drop-In):
ls -l /etc/resolv.conf
正常应该显示指向/run/systemd/resolve/stub-resolv.conf的软链。
再检查UDP监听:
sudo lsof -i :53 | grep systemd-resolve
现在应该能看到127.0.0.53的UDP和TCP都处于LISTEN状态了。
然后测试host命令:
host google.com
如果正常返回IP,再跑一遍resolvectl query google.com,接着再跑一次host google.com,看第二次是不是快很多,确认缓存生效。
第四步:如果还是不行,排查其他可能
- 检查有没有其他程序抢53端口:
sudo lsof -i :53,确保只有systemd-resolve在监听53端口。 - 防火墙拦截?临时关了ufw试试:
sudo ufw disable,如果能正常访问,就给ufw加一条规则允许本地UDP 53:
sudo ufw allow in from 127.0.0.0/8 to 127.0.0.53 port 53 proto udp sudo ufw enable
- 检查netplan配置,别让DHCP自动设置DNS干扰resolved:打开你的netplan yaml文件(一般在
/etc/netplan/下),在网卡配置里加dhcp4-overrides: use-dns: no,比如:
network: ethernets: eth0: # 换成你的网卡名 dhcp4: yes dhcp4-overrides: use-dns: no # 不让DHCP自动设置DNS,交给resolved管理 version: 2
然后应用配置:sudo netplan apply
备注:内容来源于stack exchange,提问作者TeejMonster

