Mô-đun DNS Resolver cung cấp khả năng bảo vệ người dùng đối với các cuộc tấn công đánh 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 chứa mã triển khai trình phân giải gốc DNS, dịch các tên như www.google.com thành các địa chỉ IP chẳng hạn như 2001: db8 :: 1 . Trình phân giải sơ khai DNS sẽ hỗ trợ các phần tử API Java như InetAddress # getAllByName và Network # getAllByName , cũng như các chức năng mạng riêng, đồng thời triển khai gửi và nhận các truy vấn DNS và lưu vào bộ nhớ đệm kết quả.
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
. Tra cứu DNS được tập trung trong daemon 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 chức năng (chẳng hạn như getaddrinfo
) trong Bionic. Truy vấn được gửi qua một ổ cắm UNIX tới /dev/socket/dnsproxyd
đến netd
daemon, trình nền này sẽ phân tích cú pháp 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 di chuyển mã của trình phân giải DNS sang system/netd/resolv,
chuyển nó sang C ++, sau đó hiện đại hóa và cấu trúc lại 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 gọi bởi hệ thống. 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 DNS Resolver (`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à phần phụ thuộc vì mô-đun phục vụ trực tiếp socket /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, có 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 DNS Resolver 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 .local mDNS
Bắt đầu từ tháng 11 năm 2021, trình phân giải Android hỗ trợ độ phân giải .local mDNS, thực hiện "5.1 Truy vấn DNS đa hướng One-Shot" 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ợ minh bạch bằng cách gọi getaddrinfo()
với tên máy chủ kết thúc bằng *.local
.
mDNS .local phân giải tăng cường chức năng hiện có của getaddrinfo()
để lấy địa chỉ. Nếu thiết bị hỗ trợ độ phân giải .local mDNS, thì API getaddrinfo()
sẽ gửi các 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 .local mDNS, thì phương thức API getaddrinfo()
sẽ gửi một 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ữ thiết kế mDNS hiện tại của họ để lấy địa chỉ hoặc sử dụng getaddrinfo()
để thay thế. 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 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
.
VPN và kết nối dữ liệu di động bị loại trừ khỏi độ phân giải .local.