在 Ubuntu(尤其是使用 systemd-resolved 的系统,比如 18.04 以后版本)中,/etc/resolv.conf 是动态生成的,不应直接修改。要 固定 DNS(静态配置) ,你可以选择以下几种方式之一:
✅ 推荐方式二:我选择彻底禁用 systemd-resolved,改用静态 resolv.conf
如果你想完全摆脱它(比如在 K8s 控制节点上防止被 stub DNS 干扰):
-
停止并禁用
systemd-resolved:sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved -
删除默认的符号链接:
sudo rm /etc/resolv.conf -
创建一个静态配置文件:
sudo tee /etc/resolv.conf >/dev/null <<EOF nameserver 8.8.8.8 nameserver 1.1.1.1 search default.svc.cluster.local svc.cluster.local localdomain options timeout:1 attempts:1 EOF -
为防止被自动改写,可加上
immutable属性:sudo chattr +i /etc/resolv.conf这样任何服务都不能再修改它(要修改时需先执行
sudo chattr -i /etc/resolv.conf)。
✅ 推荐方式一:通过 /etc/systemd/resolved.conf 固定 DNS
-
编辑配置文件:
sudo vim /etc/systemd/resolved.conf -
在
[Resolve]段中取消注释并设置:[Resolve] DNS=8.8.8.8 1.1.1.1 FallbackDNS=9.9.9.9 Domains=cluster.local⚠️
DNS=是你要固定的上游 DNS 地址;
FallbackDNS=是备用 DNS。 -
重启
systemd-resolved:sudo systemctl restart systemd-resolved -
确认生效:
resolvectl status cat /etc/resolv.conf看到
nameserver 127.0.0.53是正常的,只要resolvectl status里显示你设定的上游 DNS。
✅ 可选方式三:NetworkManager(桌面系统常见)
如果你的机器用的是 NetworkManager(nmcli 命令可用):
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1"
sudo nmcli connection modify "Wired connection 1" ipv4.ignore-auto-dns yes
sudo nmcli connection up "Wired connection 1"
🚀 建议(针对 K8s 控制节点)
在 Kubernetes 环境下(例如你这台 k8s-ctrl 节点):
- 禁用 systemd-resolved 更稳妥;
- 确保
/etc/resolv.conf中的nameserver指向实际可解析外部域名的 DNS; - 避免
127.0.0.53因 stub resolver 出现 DNS 解析失败或延迟。
是否要我帮你生成一个一键脚本,把 DNS 固定到比如 8.8.8.8 并禁用 systemd-resolved?