DNS Resolver モジュールは、DNS 傍受および構成更新攻撃からユーザーを保護し、DNS 解決のネットワーク パフォーマンスを向上させます。このモジュールには、 www.google.comなどの名前を2001:db8::1などの IP アドレスに変換する DNS スタブ リゾルバを実装するコードが含まれています。 DNS スタブ リゾルバーは、 InetAddress#getAllByNameやNetwork# getAllByName などの Java API 要素、およびネイティブ ネットワーク機能をサポートし、DNS クエリの送受信と結果のキャッシュを実装します。
Android 10 の変更点
Android 9 以前を実行しているデバイスでは、DNS リゾルバー コードは Bionic とnetd
に分散されています。 DNS ルックアップはnetd
デーモンで一元化され、システム全体のキャッシュを可能にしますが、アプリは Bionic で関数 ( getaddrinfo
など) を呼び出します。クエリは、UNIX ソケットを介して/dev/socket/dnsproxyd
のnetd
デーモンに送信されます。netd デーモンは、要求を解析し、 getaddrinfo
を再度呼び出して DNS ルックアップを発行し、結果をキャッシュして、他のアプリがそれらを使用できるようにします。 DNS リゾルバーの実装は、大部分がbionic/libc/dns/
に含まれ、一部がsystem/netd/server/dns
に含まれていました。
Android 10 では、DNS リゾルバー コードがsystem/netd/resolv,
移動され、C++ に変換されてから、コードがモダナイズされてリファクタリングされます。 Bionic のコードはアプリの互換性のために引き続き存在しますが、システムによって呼び出されることはなくなりました。これらのソース パスは、リファクタリングの影響を受けます。
-
bionic/libc/dns
-
system/netd/client
-
system/netd/server/dns
-
system/netd/server/DnsProxyListener
-
system/netd/server/ResolverController
-
system/netd/resolv
形式と依存関係
DNS リゾルバー モジュール (`com.android.resolv`) はAPEXファイルとして提供され、 netd
によって動的にリンクされます。ただし、モジュールはローカルソケット/dev/socket/dnsproxyd
を直接提供するため、 netd
は依存関係ではありません。リゾルバー構成の Binder エンドポイントがnetd
からリゾルバーに移動されました。つまり、システム サービスはnetd
を介さずにリゾルバー モジュールを直接呼び出すことができます。
DNS Resolver モジュールはlibc
(Bionic) に依存し、その依存関係を静的にリンクします。他のライブラリは必要ありません。
mDNS .local 解決
2021 年 11 月以降、Android リゾルバーは mDNS .local 解決をサポートします。これは、RFC 6762 の「5.1 ワンショット マルチキャスト DNS クエリ」を実装して、標準の DNS クエリを 224.0.0.251:5353 または [FF02::FB]:5353 に盲目的に送信します。 mDNS 解決は、 *.local
で終わるホスト名でgetaddrinfo()
を呼び出すことによって透過的にサポートされます。
mDNS .local 解決は、 getaddrinfo()
の既存の機能を拡張してアドレスを取得します。デバイスが mDNS .local 解決をサポートしている場合、 getaddrinfo()
API は mDNS クエリを 224.0.0.251:5353 または [FF02::FB]:5353 に送信し、ローカル アドレスを返します。デバイスが mDNS .local 解決をサポートしていない場合、 getaddrinfo()
API メソッドは DNS クエリを DNS サーバーに送信します。
コードは AOSP にあり、 packages/modules/DnsResolver
にあります。ユーザーは現在の mDNS 設計を維持してアドレスを取得するか、代わりにgetaddrinfo()
を使用できます。この機能の動作は、mDNS マルチキャスト アドレスに送信される通常の DNS クエリに似ています。この機能は、システムの状態には影響しません。
ユーザーはコマンドadb shell ping6 HOSTNAME .local
を使用できます。ここで、 HOSTNAMEは LAN 上のターゲット デバイスのホスト名です (例: adb shell ping6 ipad.local
。
VPN およびモバイル データ接続は、.local 解決から除外されます。