DNS 리졸버

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

DNS 확인자 모듈은 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/dnsproxyd 에 대한 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 Resolver 모듈(`com.android.resolv`)은 APEX 파일로 전달되며 netd 에 의해 동적으로 연결됩니다. 그러나 모듈이 로컬 소켓 /dev/socket/dnsproxyd 를 직접 제공하므로 netd 는 종속성이 아닙니다 . 해석기 구성에 대한 바인더 끝점이 netd 에서 해석기로 이동되었습니다. 즉, 시스템 서비스는 netd 를 거치지 않고 해석기 모듈을 직접 호출할 수 있습니다.

DNS Resolver 모듈은 libc (Bionic)에 의존하며 그 종속성을 정적으로 연결합니다. 다른 라이브러리는 필요하지 않습니다.

mDNS .local 해상도

2021년 11월부터 Android 해석기는 표준 DNS 쿼리를 맹목적으로 224.0.0.251:5353 또는 [FF02::FB]:5353으로 보내기 위해 RFC 6762에서 "5.1 원샷 멀티캐스트 DNS 쿼리"를 구현하는 mDNS .local 확인을 지원합니다. 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 서버에 보냅니다.

코드는 packages/modules/DnsResolver 에 있는 AOSP에 있습니다. 사용자는 현재 mDNS 디자인을 유지하여 주소를 가져오거나 대신 getaddrinfo() 를 사용할 수 있습니다. 이 기능의 동작은 mDNS 멀티캐스트 주소로 전송되는 일반 DNS 쿼리와 같습니다. 이 기능은 시스템 상태에 영향을 주지 않습니다.

사용자는 adb shell ping6 HOSTNAME .local 명령을 사용할 수 있습니다. 여기서 HOSTNAME 은 LAN에 있는 대상 장치의 호스트 이름입니다(예: adb shell ping6 ipad.local .

VPN 및 모바일 데이터 연결은 .local 해상도에서 제외됩니다.