2025년 3월 27일부터 AOSP를 빌드하고 기여하려면 aosp-main
대신 android-latest-release
를 사용하는 것이 좋습니다. 자세한 내용은 AOSP 변경사항을 참고하세요.
DNS 리졸버
컬렉션을 사용해 정리하기
내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
DNS 리졸버 모듈은 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 소켓을 통해 netd
데몬의 /dev/socket/dnsproxyd
에 전송되며 데몬은 요청을 파싱하고 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
는 종속 항목이 아닙니다. 리졸버 구성의 바인더 엔드포인트가 netd
에서 리졸버로 이동했습니다. 즉, 시스템 서비스에서 netd
를 거치지 않고 리졸버 모듈로 직접 호출할 수 있습니다.
DNS 리졸버 모듈은 libc
(Bionic)에 종속되며 종속 항목을 정적으로 연결합니다. 다른 라이브러리는 필요하지 않습니다.
mDNS .local 해상도
2021년 11월부터 Android 리졸버는 mDNS .local 해상도를 지원합니다. 이 해상도는 RFC 6762의 '5.1 One-Shot 멀티캐스트 DNS 쿼리'를 구현하여 224.0.0.251:5353 또는 [FF02::FB]:5353에 맹목적으로 표준 DNS 쿼리를 전송합니다. *.local
로 끝나는 호스트 이름과 함께 getaddrinfo()
를 호출하면 mDNS 해상도가 투명하게 지원됩니다.
mDNS .local 해상도는 getaddrinfo()
의 기존 기능을 확장하여 주소를 가져옵니다. 기기에서 mDNS .local 해상도를 지원하면 getaddrinfo()
API는 224.0.0.251:5353 또는 [FF02::FB]:5353에 mDNS 쿼리를 보내고 로컬 주소를 반환합니다. 기기에서 mDNS .local 해상도를 지원하지 않으면 getaddrinfo()
API 메서드는 DNS 서버로 DNS 쿼리를 보냅니다.
코드는 packages/modules/DnsResolver
에 있는 AOSP에 있습니다. 사용자는 현재 mDNS 디자인을 유지하여 주소를 가져올 수 있고 또는 getaddrinfo()
를 사용할 수 있습니다. 이 기능의 동작은 mDNS 멀티캐스트 주소로 전송되는 일반 DNS 쿼리와 같습니다. 이 기능은 시스템 상태에 영향을 주지 않습니다.
사용자는 adb shell ping6 HOSTNAME.local
명령어를 사용할 수 있습니다. 여기서 HOSTNAME은 LAN에 있는 대상 기기의 호스트 이름입니다(예: adb shell ping6 ipad.local
).
VPN 및 모바일 데이터 연결은 .local 해상도에서 제외됩니다.
이 페이지에 나와 있는 콘텐츠와 코드 샘플에는 콘텐츠 라이선스에서 설명하는 라이선스가 적용됩니다. 자바 및 OpenJDK는 Oracle 및 Oracle 계열사의 상표 또는 등록 상표입니다.
최종 업데이트: 2025-07-27(UTC)
[[["이해하기 쉬움","easyToUnderstand","thumb-up"],["문제가 해결됨","solvedMyProblem","thumb-up"],["기타","otherUp","thumb-up"]],[["필요한 정보가 없음","missingTheInformationINeed","thumb-down"],["너무 복잡함/단계 수가 너무 많음","tooComplicatedTooManySteps","thumb-down"],["오래됨","outOfDate","thumb-down"],["번역 문제","translationIssue","thumb-down"],["샘플/코드 문제","samplesCodeIssue","thumb-down"],["기타","otherDown","thumb-down"]],["최종 업데이트: 2025-07-27(UTC)"],[],[],null,["# DNS Resolver\n\nThe DNS Resolver module provides user protection for DNS interception\nand configuration update attacks and improved network performance for DNS\nresolutions. The module contains the code that implements the DNS stub\nresolver, which translates names such as **www.google.com** to IP\naddresses such as **2001:db8::1** . The DNS stub resolver backs\nJava API elements such as\n[InetAddress#getAllByName](https://developer.android.com/reference/java/net/InetAddress#getAllByName(java.lang.String)) and\n[Network#getAllByName](https://developer.android.com/reference/android/net/Network#getAllByName(java.lang.String)), as well as\n[native networking functions](https://developer.android.com/ndk/reference/group/networking), and implements sending and\nreceiving DNS queries and caching the results.\n\nChanges in Android 10\n---------------------\n\n\nOn devices running Android 9 and lower, the DNS resolver code is spread across\nBionic and `netd`. DNS lookups are centralized in the\n`netd` daemon to allow for system-wide caching, while apps\ncall functions (such as `getaddrinfo`) in Bionic. The query is sent\nover a UNIX socket to `/dev/socket/dnsproxyd` to the\n`netd` daemon, which parses the request and calls\n`getaddrinfo` again to issue DNS lookups, then caches the results\nso that other apps can use them. The DNS resolver implementation was mostly\ncontained in `bionic/libc/dns/` and partly in\n`system/netd/server/dns`.\n\n\nAndroid 10 moves the DNS resolver code to\n`system/netd/resolv,` converts it to C++, then modernizes and\nrefactors the code. The code in Bionic continues to exist for app\ncompatibility reasons, but is no longer called by the system. These source\npaths are affected by the refactoring:\n\n- `bionic/libc/dns`\n- `system/netd/client`\n- `system/netd/server/dns`\n- `system/netd/server/DnsProxyListener`\n- `system/netd/server/ResolverController`\n- `system/netd/resolv`\n\nFormat and dependencies\n-----------------------\n\n\nThe DNS Resolver module (\\`com.android.resolv\\`) is delivered as an\n[APEX](/docs/core/ota/apex) file and is dynamically linked by\n`netd`; however, `netd` is **not** a\ndependency as the module serves the local socket\n`/dev/socket/dnsproxyd` directly. The Binder endpoint for the\nresolver configuration was moved from `netd` to the resolver,\nmeaning that the system service can call directly into the resolver module\nwithout going through `netd`.\n\n\nThe DNS Resolver module depends on `libc` (Bionic) and\nstatically links its dependencies; no other libraries are required.\n\nmDNS .local resolution\n----------------------\n\nStarting from November 2021, Android resolver supports mDNS .local resolution, which implements\n\"5.1 One-Shot multicast DNS Queries\" in RFC 6762 to send standard DNS queries blindly to\n224.0.0.251:5353 or \\[FF02::FB\\]:5353. mDNS resolution is transparently supported\nby calling `getaddrinfo()` with a hostname ending in `*.local`.\n\nmDNS .local resolution augments the existing functionality of `getaddrinfo()`\nto get the addresses. If a device supports mDNS .local resolution, then the\n`getaddrinfo()` API sends mDNS queries to 224.0.0.251:5353 or \\[FF02::FB\\]:5353\nand returns the local addresses. If a device doesn't support mDNS .local\nresolution, then the `getaddrinfo()` API method sends a DNS query to the DNS\nserver.\n\nThe code is in AOSP, located in `packages/modules/DnsResolver`. Users can keep their\ncurrent mDNS design to get the addresses, or use `getaddrinfo()` instead. The behavior of\nthis feature is like a regular DNS query sent to the mDNS multicast addresses. This feature has no\nimpact on system health.\n\nUsers can use the command `adb shell ping6 `\u003cvar translate=\"no\"\u003eHOSTNAME\u003c/var\u003e`.local`,\nwhere \u003cvar translate=\"no\"\u003eHOSTNAME\u003c/var\u003e is the hostname of a target device on the LAN, for example,\n`adb shell ping6 ipad.local`.\n\nVPN and mobile data connections are excluded from .local resolution."]]