Trình phân giải DNS

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

Những 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 trải rộng trên Bionic và netd . Việc tra cứu DNS được tập trung trong daemon netd để cho phép lưu vào bộ đệ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 tới /dev/socket/dnsproxyd tới daemon netd . Daemon này sẽ phân tích yêu cầu và gọi lại getaddrinfo để đưa ra 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 chúng. Việc triển khai trình phân giải DNS chủ yếu được chứa trong bionic/libc/dns/ và một phần trong system/netd/server/dns .

Android 10 chuyển mã trình phân giải DNS sang system/netd/resolv, chuyển đổi mã này thành C++, sau đó hiện đại hóa và tái cấu trúc mã. Mã trong Bionic tiếp tục tồn tại vì lý do tương thích với ứng dụng nhưng không còn được hệ thống gọi nữa. Các đường dẫn nguồn này bị ảnh hưởng bởi việc 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ụ 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ởi netd ; tuy nhiên, netd không phải là một phần phụ thuộc vì mô-đun này phục vụ trực tiếp ổ cắm cục bộ /dev/socket/dnsproxyd . Điểm cuối 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 nó; không có thư viện khác được yêu cầu.

độ phân giải mDNS .local

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

Độ phân giải mDNS .local tăng cường 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 truy vấn mDNS tới 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 truy vấn DNS đến máy chủ DNS.

Mã nằm trong AOSP, nằm trong packages/modules/DnsResolver . Người dùng có thể giữ lại thiết kế mDNS hiện tại của mình để lấy địa chỉ hoặc thay vào đó sử dụng getaddrinfo() . Hoạt động 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 các địa chỉ multicast mDNS. Tính năng này không ảnh hưởng đến sức khỏe 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ị đích trên mạng LAN, ví dụ: adb shell ping6 ipad.local .

Các kết nối dữ liệu di động và VPN bị loại khỏi độ phân giải .local.