DNSリゾルバー

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

DNS Resolver モジュールは、DNS 傍受および構成更新攻撃からユーザーを保護し、DNS 解決のネットワーク パフォーマンスを向上させます。このモジュールには、 www.google.comなどの名前を2001:db8::1などの IP アドレスに変換する DNS スタブ リゾルバを実装するコードが含まれています。 DNS スタブ リゾルバーは、 InetAddress#getAllByNameNetwork# getAllByName などの Java API 要素、およびネイティブ ネットワーク機能をサポートし、DNS クエリの送受信と結果のキャッシュを実装します。

Android 10 の変更点

Android 9 以前を実行しているデバイスでは、DNS リゾルバー コードは Bionic とnetdに分散されています。 DNS ルックアップはnetdデーモンで一元化され、システム全体のキャッシュを可能にしますが、アプリは Bionic で関数 ( getaddrinfoなど) を呼び出します。クエリは、UNIX ソケットを介して/dev/socket/dnsproxydnetdデーモンに送信されます。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 解決から除外されます。