DNS 리졸버

DNS 리졸버 모듈은 DNS 가로채기 및 구성 업데이트 공격으로부터 사용자를 보호하며 DNS 변환에 관한 네트워크 성능을 개선했습니다. 모듈에는 www.google.com과 같은 이름을 2001:db8::1과 같은 IP 주소로 해석하는 DNS 스터브 리졸버를 구현하는 코드가 포함되어 있습니다. DNS 스터브 리졸버는 InetAddress#getAllByNameNetwork#getAllByName과 같은 자바 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 해상도에서 제외됩니다.