Linux における DNS 問い合わせ
https://zenn.dev/koyamaso/books/cbc1f9f136634c/viewer/80c049
https://zenn.dev/koyamaso/books/cbc1f9f136634c/viewer/c5db67
systemd-resolved の経緯
https://kledgeb.blogspot.com/2016/06/ubuntu-1610-7-dnssystemd-resolved.html
systemd-resolved
Linux には systemd-resolved というサービスが動いている。
このサービスはスタブリゾルバであり、「自分自身で DNS レコードを持っている&名前解決できる」わけではない。
かわりに
外部の DNS サーバ複数に同時に問い合わせを行い、最も早く帰ってきたDNSレコードを使う
得られた DNS 情報を一定期間キャッシュして、同じドメインが問い合わされた場合はそのキャッシュを速やかに返す
などの、スタブ、つまり外部への代行のみを行っている。
code:sh
❯ sudo systemctl status systemd-resolved.service
sudo password for ganyariya:
● systemd-resolved.service - Network Name Resolution
Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2024-09-21 08:39:04 UTC; 15h ago
Docs: man:systemd-resolved.service(8)
man:org.freedesktop.resolve1(5)
https://www.freedesktop.org/wiki/Software/systemd/writing-network-configuration-managers
https://www.freedesktop.org/wiki/Software/systemd/writing-resolver-clients
Main PID: 830 (systemd-resolve)
Status: "Processing requests..."
Tasks: 1 (limit: 18742)
Memory: 8.4M
CPU: 1.460s
CGroup: /system.slice/systemd-resolved.service
└─830 /lib/systemd/systemd-resolved
resolvectl を実行すると、今の systemd-resolved の名前解決方法を確認できる。
code:sh
❯ resolvectl
Global
Protocols: -LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
resolv.conf mode: stub
Link 2 (enp2s0)
Current Scopes: none
Protocols: -DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Link 3 (wlp1s0)
Current Scopes: DNS
Protocols: +DefaultRoute +LLMNR -mDNS -DNSOverTLS DNSSEC=no/unsupported
Current DNS Server: 192.168.11.1
DNS Servers: 192.168.11.1
resolve.conf mode:stub とあるため、スタブモードで動作している。
また、 wlp1s0 が DNS 解決に利用されており、 ubuntu server は 192.168.11.1 に DNS を問い合わせている。
ubuntu server で DNS 解決が行われるまで
ブラウザで ganyariya.dev を問い合わせたとする。
するとブラウザは OS に対して getaddrinfo で DNS リクエストを発行する。
kernel は /etc/resolv.conf を参照する。
/etc/resolve.conf は /run/systemd/resolve/stub-resolv.conf のシンボリックリンクになっており、以下の内容になっている。
そのため、 DNS サーバではなく、 127.0.0.53 ローカルスタブリゾルバーに問い合わせることになる。
code:txt
# This is /run/systemd/resolve/stub-resolv.conf managed by man:systemd-resolved(8).
# Do not edit.
#
# ...
nameserver 127.0.0.53
options edns0 trust-ad
search .
127.0.0.53 で動作しているプログラムは systemd-resolved であり、 DNS クエリは systemd-resolved が処理することになる。
systemd-resolved はキャッシュされている DNS クエリがあるならその結果をそのまま帰す。
存在しないのであれば wlp1s0 を通じて 192.168.11.1 に DNS クエリを横流しする。(スタブリゾルバ)
192.168.11.1 (ルータ)が代理で 8.8.8.8 などの DNS サーバに問い合わせます。
その後ルータから帰ってきた内容を、 systemd-resolved がキャッシュしたうえでブラウザに返す。
systemd-resolved の設定方法
/etc/systemd/resolved.conf が設定ファイルであるため、これを書き換える
#Linux #DNS