chromium DNSTask めも (overriding the DNS configuration)

 

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のみかな。

linux

https://bugs.chromium.org/p/chromium/issues/detail?id=1350321

windows

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() の中に

IPEndPoint ipe;
ipe = IPEndPoint(IPAddress(1,1,1,1), 53);
nameservers.push_back(ipe);

を追記した。

 

これで、async resolver (not DoH) のときに 1.1.1.1に問い合わせがされるをを確認できた。わいわい。1.1.1.1に聴きに行くようにこの3行でできた。

system resolver の時には変化なし。

async resolver (DoH) の時は何をどう見れば確認できるのかわからなかった。もともとtcpdump host [設定されてるDNSキャッシュサーバ] をしてもパケットが表示されなかった。

ここら辺のコード読んで勉強します。