Contenuto
和 systemd-resolved 和 NetworkManager 鬥智鬥勇(順便仔細看看這二貨)。今天發現我的一個 #Ubuntu VM 的系統 DNS 127.0.0.53 基本無法解析域名。 > resolvectl query example.com example.com: resolve call failed: Lookup failed due to system error: Connection timed out 由於我的 ens160 LAN 端 IPv6 網路配置有點問題(爛 IT),在 auto 模式下我會獲得一個無法正常使用的 IPv6 DNS server,用 resolvectl status 可以查到: Global LLMNR setting: no MulticastDNS setting: no DNSOverTLS setting: no DNSSEC setting: no DNSSEC supported: no Current DNS Server: <good-ipv4-dns> DNS Servers: <good-ipv4-dns> ... Link 2 (ens160) Current Scopes: DNS DefaultRoute setting: yes LLMNR setting: yes MulticastDNS setting: no DNSOverTLS setting: no DNSSEC setting: no DNSSEC supported: no Current DNS Server: <bad-ipv6-dns> DNS Servers: <bad-ipv6-dns> DNS Domain: ~. 抓包可以看到 DNS 請求都是傳遞給 <bad-ipv6-dns> 而不是我在 resolved.conf 中指定的 Global DNS <good-ipv4-dns>,可能是因爲有最後那條 routing-only 配置 "~."。相比別的鏈路 Current Scopes 都是 none,因此我嘗試用 resolvectl revert ens160 清除掉這個配置,就好了。 這組 IPv6 DNS 配置是 NetworkManager 寫入的,因爲我一執行 systemctl restart NetworkManager.service 就又恢復了。問題是 NetworkManager 的 "ipv6.dns" 配置行爲是: If the IPv6 configuration method is 'auto' these DNS servers are appended to those (if any) returned by automatic configuration. 我又調整了 "ipv6.dns-priority",沒有效果。此時我認爲只能從 systemd-networkd 和 systemd-resolved 入手,然後試遍了下面這些配置: [Match] Name=ens160 [Network] DNS=<good-ipv4-dns> [DHCPv6] UseDNS=false [IPv6AcceptRA] UseDomains=false 感覺 /etc/systemd/network/01-ens160.network 根本就被完全無視了。最後繞回去發現 NetworkManager 原來有一項 "ipv6.ignore-auto-dns" 配置,改成 yes 就好了。另外手動指定 "ipv4.dns" 也是可以的,因爲其實原來那個有問題的 IPv6 DNS 對 resolved 來說就是 link 上的唯一 DNS,我也不知道爲什麼我沒有改過這項,因爲這個接口 IPv4 都是手動配置的,可能以爲在 resolved.conf 寫了就行吧。 教訓是,我看 resolv.conf 被 systemd-resolved 接管,而我又不瞭解 systemd-resolved,並且 resolvectl 可以緩解問題,於是研究的重心就都在這邊了。🤣 其實早一點我在重啓 NetworkManager 復現問題的時候直接看看 nmcli connection show 'Wired connection 1' | rg dns 就好了。配個網而已。 #systemd