systemd-resolved が BGP Unnumbered 環境で名前解決に失敗する問題
Loopbackインターフェイス以外にグローバルIPアドレスが一切付与されていない状態では、 (たとえネームサーバに正常に疎通できる場合であっても)systemd-resolvedは名前解決に失敗する。
Symptom
- LoopbackインターフェイスにグローバルIPアドレスを付与している
- 外部と接続しているネットワークインターフェイスはIPアドレスなし(Unnumbered) or IPv6 LLA(Link-Local Address)のみ
- デフォルトゲートウェイは外部接続インターフェイスの先のLLA or Unnumbered Next-Hop
Analysys
以下のIssueで説明されている問題と同様であるが、実際にはFixできていないように見える。
systemd-resolved "now complete with
from none" while network is up #15532 https://github.com/systemd/systemd/issues/15532
検証した環境のネットワーク設定は以下のとおり (Ubuntu 22.04 with netplan)
ubuntu@sv01:~$ cat /etc/netplan/01-netcfg.yaml # This file describes the network interfaces available on your system # For more information, see netplan(5). network: version: 2 renderer: networkd ethernets: lo: addresses: - 127.0.0.1/8 - ::1/128 - XX.XX.XX.1/32 - 2001:XX:XX::1/128 nameservers: addresses: - 2001:0db8::1 # Example - 192.0.2.1 # Example enp23s0f0: addresses: - fe80::100:1/64 enp23s0f1: addresses: - fe80::100:1/64 ubuntu@sv01:~$ ip -6 route ::1 dev lo proto kernel metric 256 pref medium 2001:XX:XX::1 dev lo proto kernel metric 256 pref medium fe80::/64 dev enp23s0f0 proto kernel metric 256 pref medium fe80::/64 dev enp23s0f1 proto kernel metric 256 pref medium fe80::/64 dev eno1 proto kernel metric 256 linkdown pref medium default proto bird src 2001:XX:XX::1 metric 32 pref medium # BGP Default route nexthop via fe80::1 dev enp23s0f0 weight 1 nexthop via fe80::2 dev enp23s0f1 weight 1 default proto ra metric 1024 expires 1780sec mtu 1500 pref medium # RA Default route (lower prority) nexthop via fe80::2 dev enp23s0f1 weight 1 nexthop via fe80::1 dev enp23s0f0 weight 1 ubuntu@sv01:~$ ip route default proto bird src XX.XX.XX.1 metric 32 # BGP Default route nexthop via inet6 fe80::1 dev enp23s0f0 weight 1 nexthop via inet6 fe80::2 dev enp23s0f1 weight 1 ubuntu@sv01:~$ resolvectl Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: foreign # 問題の再現には影響なし Current DNS Server: 2001:0db8::1 DNS Servers: 2001:0db8::1 192.0.2.1 Link 2 (enp23s0f0) Current Scopes: none Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Link 3 (eno1) Current Scopes: none Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported Link 4 (enp23s0f1) Current Scopes: none Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported :
この状態において、DNSサーバへの疎通性は問題ないことを確認している。
ubuntu@sv01:~$ dig google.com @2001:0db8::1 ; <<>> DiG 9.18.12-0ubuntu0.22.04.2-Ubuntu <<>> google.com @2001:0db8::1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59767 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 119 IN A 142.250.207.46 ;; Query time: 0 msec ;; SERVER: 2001:0db8::1#53(2001:0db8::1) (UDP) ;; WHEN: Thu Sep 07 16:51:59 JST 2023 ;; MSG SIZE rcvd: 55
systemd-resolved は、この状態では <network-down>
と判定していまい、名前解決に失敗する。
ubuntu@sv01:~$ resolvectl query google.com google.com: resolve call failed: Network is down # 明示的にLoopbackインターフェイスを指定してもだめ ubuntu@sv01:~$ resolvectl -i lo query google.com google.com: resolve call failed: No appropriate name servers or networks for name found ubuntu@sv01:~$ resolvectl status lo Link 1 (lo) Current Scopes: none Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported DNS Servers: 2001:0db8::1 192.0.2.1
systemd-resolved は、Loopbackインターフェイスに default-route フラグを付与することはできない。
ubuntu@sv01:~$ resolvectl default-route Global Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported resolv.conf mode: foreign Current DNS Server: 2001:0db8::1 DNS Servers: 2001:0db8::1 192.0.2.1 Link 2 (enp23s0f0): no Link 3 (eno1): no Link 4 (enp23s0f1): no Link 5 (eno3): no Link 6 (eno2): no Link 7 (eno4): no ubuntu@sv01:~$ resolvectl default-route lo Link 1 (lo): no ubuntu@sv01:~$ resolvectl default-route lo yes Failed to set default route configuration: Link lo is loopback device.
Issue では以下のパッチで修正されただろうと述べている。パッチは当たっているものの、実際には修正されていないように見える
https://github.com/systemd/systemd/commit/90bdc8be66765df09bbc355783cee7204a5ebb31
ubuntu@sv01:~$ systemd --version systemd 249 (249.11-0ubuntu3.9) +PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY -P11KIT -QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified # Source packageで実際にパッチが当たっていることを確認する ubuntu@sv01:~$ apt list --installed | grep ^systemd/ systemd/jammy-updates,now 249.11-0ubuntu3.9 amd64 [installed] ubuntu@sv01:~$ apt source systemd=249.11-0ubuntu3.9 : ubuntu@sv01:~$ cd systemd-249.11 ubuntu@sv01:~/systemd-249.11$ grep -r "dns_query_candidate_is_routable" ubuntu@sv01:~/systemd-249.11$ # 確かにパッチは適用されている
Resolution
これでいいのだ
root@sv01:/# unlink /etc/resolv.conf root@sv01:/# cat > /etc/resolv.conf nameserver 2001:0db8::1 # Example nameserver 192.0.2.1 # Example ^D
ローカルにフルリゾルバ入れるなら個人的には dnsmasq や dbndns のほうが好きだ。