IncusのDebian 12コンテナでpingが遅かったのをsystemd-resolvedのLLMNRを無効にしたら解決

IncusのDebian 12コンテナでpingが遅かった

以下のようにpingが出力する行のtime=の値は遅くないのですが、 各行を出力する間隔が非常に遅い状態でした。

root@debian12:~# time ping -c 3 iij.ad.jp
PING iij.ad.jp (202.232.2.191) 56(84) bytes of data.
64 bytes from 202.232.2.191: icmp_seq=1 ttl=57 time=5.95 ms
64 bytes from 202.232.2.191: icmp_seq=2 ttl=57 time=9.26 ms
64 bytes from 202.232.2.191: icmp_seq=3 ttl=57 time=7.99 ms

--- iij.ad.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 20036ms
rtt min/avg/max/mdev = 5.950/7.733/9.264/1.364 ms

real    0m21.073s
user    0m0.004s
sys     0m0.000s

ChatGPT 4に相談しつつ調査

実際はいろいろ試行錯誤したのですが、ここでは整理して書きます。

iij.ad.jpのIPアドレスを指定すると遅くないことがわかりました。

root@debian12:~# time ping -c 3 202.232.2.191
PING 202.232.2.191 (202.232.2.191) 56(84) bytes of data.
64 bytes from 202.232.2.191: icmp_seq=1 ttl=57 time=5.85 ms
64 bytes from 202.232.2.191: icmp_seq=2 ttl=57 time=6.08 ms
64 bytes from 202.232.2.191: icmp_seq=3 ttl=57 time=6.13 ms

--- 202.232.2.191 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 5.849/6.019/6.127/0.122 ms

real    0m2.013s
user    0m0.004s
sys     0m0.000s

同じIncusの環境内の Ubuntu 24.04 コンテナではホスト名を指定しても 遅くありませんでした。

root@numbat:~# time ping -6 -c 3 iij.ad.jp                                                                
PING iij.ad.jp (2001:240:bb81::10:191) 56 data bytes
64 bytes from 2001:240:bb81::10:191: icmp_seq=1 ttl=54 time=5.34 ms
64 bytes from 2001:240:bb81::10:191: icmp_seq=2 ttl=54 time=5.08 ms
64 bytes from 2001:240:bb81::10:191: icmp_seq=3 ttl=54 time=5.33 ms

--- iij.ad.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2095ms
rtt min/avg/max/mdev = 5.083/5.251/5.343/0.119 ms

real    0m2.104s
user    0m0.004s
sys     0m0.000s

Debian 12コンテナ内でtcpdumpを取りながらpingを実行すると、DNSの逆引きが遅いことがわかりました。

root@debian12:~# time ping -c 1 iij.ad.jp
PING iij.ad.jp (202.232.2.191) 56(84) bytes of data.
64 bytes from 202.232.2.191: icmp_seq=1 ttl=57 time=5.98 ms

--- iij.ad.jp ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.982/5.982/5.982/0.000 ms

real    0m10.005s
user    0m0.004s
sys     0m0.000s
root@debian12:~# sudo tcpdump -i any -n 'port 53'
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
06:29:00.227772 lo    In  IP 127.0.0.1.59882 > 127.0.0.53.53: 48407+ [1au] A? iij.ad.jp. (38)
06:29:00.227790 lo    In  IP 127.0.0.1.59882 > 127.0.0.53.53: 25868+ [1au] AAAA? iij.ad.jp. (38)
06:29:00.228250 lo    In  IP 127.0.0.53.53 > 127.0.0.1.59882: 48407 1/2/5 A 202.232.2.191 (180)
06:29:00.228501 lo    In  IP 127.0.0.53.53 > 127.0.0.1.59882: 25868 1/2/5 AAAA 2001:240:bb81::10:191 (192)
06:29:00.235127 lo    In  IP 127.0.0.1.52984 > 127.0.0.53.53: 11525+ [1au] PTR? 191.2.232.202.in-addr.arpa. (55)
06:29:05.240260 lo    In  IP 127.0.0.1.52984 > 127.0.0.53.53: 11525+ [1au] PTR? 191.2.232.202.in-addr.arpa. (55)
^C
6 packets captured
12 packets received by filter
0 packets dropped by kernel

digでも逆引きを試すとタイムアウトエラーになりました。

root@debian12:~# time dig -x 202.232.2.191
;; communications error to 127.0.0.53#53: timed out
;; communications error to 127.0.0.53#53: timed out
;; communications error to 127.0.0.53#53: timed out

; <<>> DiG 9.18.24-1-Debian <<>> -x 202.232.2.191
;; global options: +cmd
;; no servers could be reached


real    0m15.045s
user    0m0.012s
sys     0m0.008s

systemd-resolved の LLMNR が Ubuntu 24.04 では無効だが Debian 12 では有効という差異に気づく

Ubuntu 24.04:

root@numbat:~# resolvectl status
Global
         Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
  resolv.conf mode: stub

Link 9 (eth0)
    Current Scopes: DNS
         Protocols: +DefaultRoute -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 10.41.177.1
       DNS Servers: 10.41.177.1 fd42:3fbb:de08:f160::1 fe80::216:3eff:fec5:55bc
        DNS Domain: incus

Debian 12:

root@debian12:~# resolvectl status                   
Global                                               
       Protocols: +LLMNR +mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub                               
                                                     
Link 7 (eth0)                                        
    Current Scopes: DNS LLMNR/IPv4 LLMNR/IPv6        
         Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 10.41.177.1                      
       DNS Servers: 10.41.177.1 fe80::216:3eff:fec5:55bc
        DNS Domain: incus

eth0Current ScopesがUbuntu 24.04はDNSのみですが、Debian 12はDNSに加えて LLMNR/IPv4 LLMNR/IPv6があります。 またProtocolsもUbuntu 24.04は-LLMNRに対しDebianは+LLMNRとなっています。

https://wiki.archlinux.jp/index.php/Systemd-resolved#LLMNR によると

Link-Local Multicast Name Resolution は Microsoft によって作られたホストネーム解決プロトコルです。

とのことです。

/etc/systemd/resolved.confを見るとLLMNRはUbuntu 24.04コンテナではデフォルトで無効、Debian 12コンテナではデフォルトで有効でした。

root@numbat:~# grep '^#LLMNR=' /etc/systemd/resolved.conf
#LLMNR=no
root@debian12:~# grep '^#LLMNR=' /etc/systemd/resolved.conf                                                                                                                                                         
#LLMNR=yes

systemd-resolved の LLMNR を無効にして解決

以下のコマンドでLLMNRを無効にしました。

root@debian12:~# sed -i '/#LLMNR=yes/a\
LLMNR=no' /etc/systemd/resolved.conf
root@debian12:~# systemctl restart systemd-resolved

これでホスト名を指定してpingを実行すると遅い問題が解消できました。

root@debian12:~# time ping -c 3 iij.ad.jp
PING iij.ad.jp (202.232.2.191) 56(84) bytes of data.
64 bytes from 202.232.2.191 (202.232.2.191): icmp_seq=1 ttl=57 time=5.98 ms
64 bytes from 202.232.2.191 (202.232.2.191): icmp_seq=2 ttl=57 time=5.61 ms
64 bytes from 202.232.2.191 (202.232.2.191): icmp_seq=3 ttl=57 time=6.17 ms

--- iij.ad.jp ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 5.607/5.916/6.167/0.232 ms

real    0m2.015s
user    0m0.000s
sys     0m0.005s

余談

ちなみに、物理マシンの Debian 12 環境もあったのですが、そちらではこの問題は起きていませんでした。 DHCPで固定アドレスを付与していて/etc/resolve.confnameserverがDHCPサーバのアドレス になっており、systemd-resolvedは使っていないからでした。

また、IncusでDebian 12の仮想マシンでも問題ありませんでした。こちらは /etc/systemd/resolved.conf#LLMNR=noとLLMNRがデフォルトで無効になっていました。

https://images.linuxcontainers.org/ からリンクされていた https://github.com/lxc/lxc-ci を git clone して git log -p して大文字小文字無視で llmnr で検索してみましたがヒットなしでした。

ChatGPT 4 は今回非常に頼りになりました。自力では解決できなかったと思います。感謝。