Bạn lấy shell trên thiết bị, đọc /etc/resolv.conf hoặc đào ra một giá trị net.dns1 cũ, và nhận được một địa chỉ. Ứng dụng trước mặt bạn phân giải qua một thứ hoàn toàn khác. Trong bản Android hiện hành, resolver là theo từng mạng: hệ thống giữ chính sách cho mỗi Network và áp nó cho socket đã gửi yêu cầu. Tệp và thuộc tính cũ chỉ là tàn dư, và không cái nào mô tả đường đi mà truy vấn của bạn thực sự đã đi.

Khoảng trống này lộ ra khi triển khai split-tunnel và Private DNS, nơi hai ứng dụng trên cùng một điện thoại có thể thấy câu trả lời khác nhau một cách hợp lệ. Hướng dẫn này bắt đầu từ lần phân giải sai hoặc thiếu và lần ngược về cấu hình sở hữu nó.

Resolver thuộc về một mạng, không phải thiết bị

Phân giải tên trên Android 9 trở đi đi qua resolver hệ thống dựa trên Network mà socket được gắn vào. Mỗi mạng mang LinkProperties riêng, và các thuộc tính đó chứa danh sách máy chủ DNS, miền tìm kiếm và trạng thái Private DNS chỉ cho mạng đó. Không có gì trong mô hình đó tương ứng với một danh sách chung cho toàn thiết bị mà bạn đọc được từ tệp.

VPN làm sự tách biệt trở nên rõ ràng. Khi đường hầm lên, ứng dụng VPN cấp các máy chủ DNS được đăng ký trên mạng riêng của VPN, nên các ứng dụng được định tuyến qua nó phân giải qua những máy chủ đó trong khi ứng dụng bị loại trừ vẫn dùng mạng bên dưới. Một thiết bị, hai đường trả lời, không mâu thuẫn.

Đọc ảnh chụp từ bên trong ứng dụng bị ảnh hưởng

Hãy hỏi chính ứng dụng. Một phương thức có Context và quyền android.permission.ACCESS_NETWORK_STATE thông thường có thể đọc ảnh chụp mà không động vào thuộc tính hệ thống:

val cm = getSystemService(ConnectivityManager::class.java) ?: return
val network = cm.activeNetwork
val links = network?.let { cm.getLinkProperties(it) }

val dnsServers = links?.dnsServers
val privateDnsActive = links?.isPrivateDnsActive
val privateDnsName = links?.privateDnsServerName

activeNetwork là mạng mặc định của tiến trình bạn, không phải mạng duy nhất trên thiết bị, và có thể là null khi bên gọi không có mặc định dùng được. VPN mặc định bị chặn là lý do thường gặp. isPrivateDnsActive cho biết các truy vấn trên mạng đó có đi qua TLS tới resolver có tên hay không, điều này thay đổi những gì một phép thử UDP 53 đơn giản cho bạn thấy. Bề mặt API được ghi tài liệu dưới LinkProperties, và mọi giá trị trong đó là ảnh chụp cấu hình, không phải bằng chứng rằng một truy vấn cụ thể đã tới một máy chủ cụ thể.

Khi mạng mặc định không phải mạng đang làm việc

Ảnh chụp chỉ trả lời cho mạng mặc định. Ứng dụng có thể gắn tiến trình hoặc một socket vào mạng khác, và khi đó việc phân giải theo lựa chọn ấy trong khi chẩn đoán của bạn vẫn báo mạng mặc định. Trình duyệt mang resolver DNS-over-HTTPS riêng không hề hỏi danh sách hệ thống, nên câu trả lời của nó không nói gì về phần còn lại của thiết bị. Ứng dụng hồ sơ công việc chạy dưới người dùng riêng với chính sách riêng. Kiểm tra ràng buộc trước khi đổ lỗi cho máy chủ.

Tích hợp VPN là nửa còn lại. Nhận một dòng dhcp-option DNS trong hồ sơ OpenVPN và đăng ký địa chỉ đó trên mạng VPN của Android là hai bước riêng, và thiếu tuyến tới máy chủ sẽ thất bại âm thầm như một địa chỉ sai. Từ máy phát triển, adb shell dumpsys connectivity in các thuộc tính liên kết y hệt theo từng mạng khi bản dựng cho phép, điều này xác nhận danh sách mà không phải viết mã.

So cấu hình với một lần phân giải bạn được phép làm

Chọn một tên bắt buộc phải phân giải trong không gian tên riêng và một tên công khai, rồi ghi cả hai kết quả bên cạnh ảnh chụp: mạng, máy chủ đã cấu hình, trạng thái Private DNS và văn bản lỗi chính xác. Truy vấn trực tiếp tới một máy chủ có tên chứng minh máy chủ đó trả lời bạn; nó không chứng minh rằng việc phân giải thông thường của ứng dụng đã chọn nó. Câu trả lời trong bộ nhớ đệm không phải một phép thử mới, nên hãy xóa bộ nhớ đệm hoặc dùng một tên mà hôm nay chưa ai hỏi.

Nếu resolver chỉ phục vụ khách hàng từ một mạng truy cập nhất định, điều nó thấy sau khi ra khỏi VPN có thể quyết định kết quả, và đây là câu hỏi chính sách cho người vận hành nó chứ không phải bằng chứng rằng nhà mạng chặn UDP 53. Ở nơi Private DNS đang bật, một tên máy chủ không đủ tiêu chuẩn có thể bị từ chối theo thiết kế trong khi cùng máy chủ đó vẫn trả lời tên công khai bình thường. Đọc các thuộc tính cho bạn biết chế độ nào đang áp dụng, nhờ đó bạn thôi đoán về bộ lọc gói.

Sửa lớp sở hữu sự không khớp

Làm ngược lên thay vì sửa trạng thái toàn cục. Nếu ứng dụng bị gắn vào sai mạng, sửa ràng buộc. Nếu hồ sơ cấp sai tùy chọn DNS, sửa hồ sơ. Nếu Private DNS nghiêm ngặt trên một mạng mà resolver của nó không phục vụ được vùng riêng của bạn, đó là quyết định quản lý thiết bị chứ không phải lý do tắt tính năng ở mọi nơi.

Ép resolver công khai vào một móc DHCP hoặc một thuộc tính hệ thống là cách sửa liên tục gây sự cố: tên riêng thôi phân giải, thay đổi sống lâu hơn phiên VPN, và người tiếp theo trên thiết bị tìm thấy một địa chỉ cũ không có chủ. Giữ thay đổi trong VPN, ứng dụng hoặc lớp quản lý sở hữu sự không khớp, rồi đọc lại ảnh chụp để xác nhận danh sách máy chủ thực sự đã đổi.

Điều bạn muốn cuối cùng là một yêu cầu ứng dụng gắn với một mạng, một danh sách resolver và một trạng thái Private DNS. Khi bạn chứng minh được chuỗi đó, một địa chỉ quen thuộc trong tệp không còn là bằng chứng của bất cứ điều gì.

Bài viết liên quan