chromiumにはいくつかDNSを行う方法がある。
chromiumの //net/dns/README.mdに色々書いてある。
https://source.chromium.org/chromium/chromium/src/+/main:net/dns/README.md
もっとあるが、大事なのは以下の三つかと勝手に思う。
1. system resolver
2. async resolver (not DoH)
3. async resolver (DoH)
system resolver
実装は net::HostResolverManager::ProcTask にある。OSのリゾルバを使用する。
async resolver がうまくできないときに使われる。
async resolver (not DoH)
実装は net::HostResolverManager::DnsTask にある。
chrome自らDNSキャッシュサーバにパケットを送る。OSのリゾルバをそのまま使わないが、DNS configurationは読み込むため、同じDNSキャッシュサーバにアクセスする。(もし 8.8.8.8 に設定されていたらそれに聞くし、ISPの提供するDNSキャッシュサーバが設定されていたらそれを使う。
async resolver (DoH)
あまりよくわかっていないけど、DoHを使う。DoHなので tcpdump port 53 で出てこないし、さらに、tcpdump host [設定されてるDNSキャッシュサーバ] をしてもパケットが表示されなかった。
もうしょっとコードを読む。
async resolver は まだMacOSのみかな。
https://bugs.chromium.org/p/chromium/issues/detail?id=1350321
https://bugs.chromium.org/p/chromium/issues/detail?id=1317948
chromiumのコードを変更して、async resolverの問い合わせ先を変更してみた。
遊びです。変更した箇所は以下のファイル。開発環境Mac
https://source.chromium.org/chromium/chromium/src/+/main:net/dns/public/resolv_reader.cc
absl::optional<std::vector<IPEndPoint>> GetNameservers() の中に
を追記した。
これで、async resolver (not DoH) のときに 1.1.1.1に問い合わせがされるをを確認できた。わいわい。1.1.1.1に聴きに行くようにこの3行でできた。
system resolver の時には変化なし。
async resolver (DoH) の時は何をどう見れば確認できるのかわからなかった。もともとtcpdump host [設定されてるDNSキャッシュサーバ] をしてもパケットが表示されなかった。
ここら辺のコード読んで勉強します。