Trình phân giải DNS

Mô-đun Trình phân giải DNS giúp bảo vệ người dùng khỏi tính nă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 DNS độ phân giải. Mô-đun này có chứa mã triển khai mã giả lập DNS trình phân giải, giúp dịch các tên, chẳng hạn như www.google.com sang IP như 2001:db8::1. Trình phân giải mã giả lập DNS hoạt động trở lại Các phần tử API Java như InetAddress#getAllByNameNetwork#getAllByName, cũng như các chức năng kết nối mạng gốc, đồng thời triển khai tính năng gửi và nhận truy vấn DNS và 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 trải rộng trên Bionic và netd. Hoạt động tra cứu DNS được tập trung ở 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. Đã gửi truy vấn qua một ổ cắm UNIX đến /dev/socket/dnsproxyd Daemon netd, phân tích cú pháp yêu cầu và gọi getaddrinfo một lần nữa để 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 có trong bionic/libc/dns/ và một phần nằm 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 hoá và tái cấu trúc mã. Mã trong Bionic tiếp tục tồn tại cho ứng dụng tương thích nhưng không còn được hệ thống gọi. Các nguồn này đường dẫn 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ầ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 APEX và được liên kết động bằng netd; tuy nhiên, netd không phải là một phần phụ thuộc dưới dạng mô-đun phân phát ổ 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 di 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 phải trải 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; không cần có 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 sẽ hỗ trợ độ phân giải mDNS .local, vốn thực thi "5.1 Truy vấn DNS đa hướng một lần" trong RFC 6762 để gửi các truy vấn DNS chuẩn một cách mù mờ đến 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() bằng 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() để nhận địa chỉ. Nếu thiết bị hỗ trợ độ phân giải mDNS .local, thì API getaddrinfo() gửi truy vấn mDNS đến 224.0.0.251:5353 hoặc [FF02::FB]:5353 và trả về địa chỉ địa phương. Nếu thiết bị không hỗ trợ mDNS .local phân giải, thì phương thức API getaddrinfo() sẽ gửi truy vấn DNS đến DNS máy chủ.

Mã này nằm trong AOSP (Dự án nguồn mở Android) ở packages/modules/DnsResolver. Người dùng có thể duy trì thiết kế mDNS hiện tại để lấy địa chỉ hoặc chuyển sang 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 các địa chỉ đa hướng mDNS. Tính năng này không có đến tình trạng của 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.

Các kết nối dữ liệu di động và VPN không được áp dụng độ phân giải .local.