这是我的无线网络interfaces
#auto wlp1s0
allow-hotplug wlp1s0
iface wlp1s0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
# up /usr/sbin/wondershaper -a wlan0 -d 9500 -u 15000
# down /usr/sbin/wondershaper -a wlan0 -c
allow-hotplug RWB
iface RWB inet dhcp
其中RWB
AP 定义在/etc/wpa_supplicant/wpa_supplicant.conf
每当我连接到该 AP 时dhclient
(我认为)都会更新该文件/etc/resolv.conf
。这意味着当我离开RWB
并连接到其他设备(包括有线以太网)时,DNS 会失败,因为 IP 地址resolv.conf
不再可路由。
天真的修复是阻止dhcp
客户端更新resolv.conf
,但肯定有一个针对这种情况的常规配置可以解决这个问题 - 什么?
答案1
尚无法发表评论,因此将此作为答案。此 YouTube 演示了使用 resolv.conf 在 Ubuntu/Debian 上设置永久 DNS 名称服务器
https://www.youtube.com/watch?v=NEyXDdBrw2c
就像 @Hack Saw 评论的 systemd 可能会管理resolve.conf,这可能会导致永久更改resolve.conf中的dns名称服务器的问题
答案2
从man
页面dhclient
-
BUGS
If more than one interface is being used, there's no obvious way to avoid
clashes between server-supplied configuration parameters - for example, the stock
dhclient-script rewrites /etc/resolv.conf ...
dhclient
当 DHCP 事件发生时,使用 shell 脚本来配置系统。为了防止dhclient
覆盖resolv.conf
,您需要修改此脚本的默认行为。但首先,您需要安装并运行类似的东西,systemd-resolved
可以管理多个网络接口的 DNS 信息。
以下是如何修改以使用而不是覆盖dhclient
来更新 DNS 信息的示例-systemd-resolved
/etc/resolv.conf
/etc/dhcp/dhclient-enter-hooks.d/dns-update
#!/bin/sh
make_resolv_conf(){
# DHCPv4
if [ -x /usr/bin/systemd-resolve ]; then
if [ -n "$new_domain_name" ]; then
systemd-resolve --interface="$interface" --set-domain="${new_domain_name%% *}"
fi
if [ -n "$new_domain_name_servers" ]; then
for nameserver in $new_domain_name_servers; do
systemd-resolve --interface="$interface" --set-dns="$nameserver"
done
fi
fi
}
dhclient
在应用从 DHCP 接收到的系统配置并覆盖 stock之前调用此脚本make_resolv_conf()
。
根据您的操作系统,可能没有/etc/dhcp/dhclient-enter-hooks.d
目录。在这种情况下,您可以将该脚本放置在名为/etc/dhclient-enter-hooks
.