Trình phân giải DNS

Mô-đun Trình phân giải DNS bảo vệ người dùng khỏi các cuộc tấn công chặn DNS và cập nhật cấu hình, đồng thời cải thiện hiệu suất mạng cho các giải pháp DNS. Mô-đun này chứa mã triển khai trình phân giải DNS giả lập, giúp chuyển đổi các tên như www.google.com thành địa chỉ IP như 2001:db8::1. Trình phân giải DNS giả lập hỗ trợ các phần tử API Java như InetAddress#getAllByNameNetwork#getAllByName, cũng như các hàm kết nối mạng gốc, đồng thời triển khai việc gửi và nhận truy vấn DNS cũng như lưu kết quả vào bộ nhớ đệm.

Các thay đổi trong Android 10

Trên các thiết bị chạy Android 9 trở xuống, mã trình phân giải DNS được phân bổ trên Bionic và netd. Các lượt tra cứu DNS được tập trung trong trình nền netd để cho phép lưu vào bộ nhớ đệm trên toàn hệ thống, trong khi các ứng dụng gọi các hàm (chẳng hạn như getaddrinfo) trong Bionic. Truy vấn được gửi qua ổ cắm UNIX đến /dev/socket/dnsproxyd đến trình nền netd. Trình nền này phân tích cú pháp yêu cầu và gọi lại getaddrinfo để thực hiện tra cứu DNS, sau đó lưu kết quả vào bộ nhớ đệm để các ứng dụng khác có thể sử dụng. Việc triển khai trình phân giải DNS chủ yếu nằm trong bionic/libc/dns/ và một phần trong system/netd/server/dns.

Android 10 di chuyển mã trình phân giải DNS sang system/netd/resolv,, chuyển đổi mã đó thành C++, sau đó hiện đại hoá và tái cấu trúc mã. Mã trong Bionic vẫn tồn tại vì lý do tương thích với ứng dụng, nhưng hệ thống không còn gọi mã này nữa. Các đường dẫn nguồn này sẽ chịu ảnh hưởng của quá trình tái cấu trúc:

  • bionic/libc/dns
  • system/netd/client
  • system/netd/server/dns
  • system/netd/server/DnsProxyListener
  • system/netd/server/ResolverController
  • system/netd/resolv

Định dạng và phần phụ thuộc

Mô-đun Trình phân giải DNS ("com.android.resolv") được phân phối dưới dạng tệp APEX và được liên kết động bằng netd; tuy nhiên, netd không phải là phần phụ thuộc vì mô-đun này trực tiếp phân phát /dev/socket/dnsproxyd ổ cắm cục bộ. Điểm cuối của Binder cho cấu hình trình phân giải đã được chuyển từ netd sang trình phân giải, nghĩa là dịch vụ hệ thống có thể gọi trực tiếp vào mô-đun trình phân giải mà không cần thông qua netd.

Mô-đun Trình phân giải DNS phụ thuộc vào libc (Bionic) và liên kết tĩnh các phần phụ thuộc của mô-đun; không yêu cầu thư viện nào khác.

Phân giải mDNS .local

Kể từ tháng 11 năm 2021, trình phân giải Android hỗ trợ giải pháp mDNS .local. Giải pháp này triển khai "5.1 Truy vấn DNS đa điểm một lần" trong RFC 6762 để gửi các truy vấn DNS chuẩn một cách mù quáng đến 224.0.0.251:5353 hoặc [FF02::FB]:5353. Giải pháp mDNS được hỗ trợ một cách minh bạch bằng cách gọi getaddrinfo() có tên máy chủ kết thúc bằng *.local.

Độ phân giải mDNS .local bổ sung chức năng hiện có của getaddrinfo() để lấy địa chỉ. Nếu một thiết bị hỗ trợ độ phân giải mDNS .local, thì API getaddrinfo() sẽ gửi các truy vấn mDNS đến 224.0.0.251:5353 hoặc [FF02::FB]:5353 và trả về địa chỉ cục bộ. Nếu một thiết bị không hỗ trợ độ phân giải mDNS .local, thì phương thức API getaddrinfo() sẽ gửi một truy vấn DNS đến máy chủ DNS.

Mã này nằm trong AOSP, nằm trong packages/modules/DnsResolver. Người dùng có thể giữ nguyên thiết kế mDNS hiện tại để lấy địa chỉ hoặc sử dụng getaddrinfo(). Hành vi của tính năng này giống như một truy vấn DNS thông thường được gửi đến địa chỉ truyền tin nhiều điểm của mDNS. Tính năng này không ảnh hưởng đến tình trạng hệ thống.

Người dùng có thể sử dụng lệnh adb shell ping6 HOSTNAME.local, trong đó HOSTNAME là tên máy chủ của thiết bị mục tiêu trên mạng LAN, ví dụ: adb shell ping6 ipad.local.

Kết nối VPN và dữ liệu di động không được đưa vào độ phân giải .local.