Quay lại danh sách
Kiểm tra rò DNS qua proxy: hướng dẫn an toàn cho Python, cURL và trình duyệt

Kiểm tra rò DNS qua proxy: hướng dẫn an toàn cho Python, cURL và trình duyệt

14 tháng 9, 2026

DNS không phải lúc nào cũng đi theo proxy

Khi một ứng dụng được cấu hình dùng proxy, nhiều kiểm tra chỉ xác nhận địa chỉ IP công khai đã đổi. Kết quả đó chưa chứng minh DNS cũng đi qua proxy. Nếu máy vẫn gửi truy vấn tên miền tới resolver cục bộ, nhà mạng, thiết bị quản trị hoặc hệ thống giám sát nội bộ có thể thấy tên miền bạn tra cứu, dù nội dung HTTPS sau đó được mã hóa.

Proxy HTTP thường nhận hostname trong yêu cầu, nhưng ứng dụng khách thường phân giải hostname tại máy trước khi nối tới proxy. SOCKS5 có hai chế độ: socks5 dùng DNS cục bộ, socks5h yêu cầu proxy phân giải. HTTPS bảo vệ phần còn lại của phiên, nhưng không tự động chuyển toàn bộ quá trình phân giải tên miền. DoH, VPN, IPv6 và bộ phân giải tùy ứng dụng có thể tạo thêm đường thoát.

Mục tiêu là xác định ba điểm riêng biệt: IP hiển thị, nơi gửi truy vấn DNS và đường dẫn IPv6. Khi biết ba điểm này, bạn sửa đúng nguyên nhân thay vì chỉ xoay proxy.

Kiểm tra bằng cURL

Hãy thử nghiệm trên máy hoặc container do bạn quản lý. Kết quả phụ thuộc hệ điều hành, trình duyệt và phần mềm trung gian. Trước khi đổi cài đặt, ghi bốn dữ liệu: IP công khai khi không có proxy, IP khi có proxy, resolver hiện hành và loại proxy đang dùng.

Dùng một tên miền chưa được cache, chẳng hạn example.com, rồi chạy:

curl -sS https://api.ipify.org?format=json
curl -sS -x socks5h://127.0.0.1:1080 https://api.ipify.org?format=json
curl -sS -x socks5://127.0.0.1:1080 https://api.ipify.org?format=json

socks5h cho thấy DNS được gửi tới proxy; socks5 là phép đối chứng khi ứng dụng khách tự phân giải. Nếu cURL báo không hỗ trợ SOCKS5, hãy dùng bản build có SOCKS hoặc proxy HTTP. Với proxy HTTP, thay URL SOCKS bằng http://proxy.example:8080 và kiểm tra cả IPv4 lẫn IPv6.

Để quan sát DNS, chạy tcpdump trên giao diện đang dùng, thay 1.1.1.1 bằng resolver thực tế:

sudo tcpdump -i any 'host 1.1.1.1 and (port 53 or port 853)'

Sau đó truy cập một tên miền mới bằng curl. Gói UDP/TCP port 53 hoặc DoT port 853 tới resolver ngoài proxy là dấu hiệu DNS chưa được chuyển hướng. DoH thường đi qua port 443 nên cần kiểm tra cấu hình trình duyệt và endpoint DoH; không xuất hiện trong bộ lọc trên không đồng nghĩa với việc chắc chắn không có rò rỉ.

Trên Linux, resolvectl status cho biết resolver đang dùng. Trên macOS dùng scutil --dns; trên Windows PowerShell dùng Get-DnsClientServerAddress. So sánh khi proxy bật và tắt. Quy trình này áp dụng cho RoProxy và nhà cung cấp proxy khác; thay 127.0.0.1:1080 bằng điểm cuối được cấp.

Kiểm tra bằng Python

Requests không tự bảo đảm mọi resolver của ứng dụng sẽ đi theo proxy; đường dẫn phụ thuộc lớp SOCKS và cách thư viện xử lý hostname. Cài đặt hỗ trợ SOCKS rồi gửi URL proxy rõ ràng:

pip install 'requests[socks]' PySocks
import requests

proxy = 'socks5h://127.0.0.1:1080'
response = requests.get(
    'https://api.ipify.org',
    proxies={'http': proxy, 'https': proxy},
    timeout=10,
)
print(response.text)

socks5h nói lớp SOCKS thực hiện phân giải tên miền ở phía proxy. Nếu thay bằng socks5, hostname thường được giải tại client. Đừng gọi socket.getaddrinfo('api.ipify.org', 443) trước request nếu muốn kiểm tra DNS từ xa; hàm đó tạo một truy vấn DNS cục bộ và làm kết quả khó diễn giải.

Kiểm tra NO_PROXY hoặc no_proxy: một mục như api.ipify.org có thể khiến requests đi thẳng. Trong môi trường có nhiều proxy, truyền proxies cho request và ghi log URL đích, thời điểm, IP trả về.

Kiểm tra trình duyệt và các tác nhân ẩn

Trình duyệt dễ tạo kết luận sai nhất. Cài đặt proxy ở hệ điều hành chưa chắc áp dụng cho mọi tiến trình; tiện ích mở rộng, phần mềm bảo mật, VPN và lối thoát dự phòng IPv6 có thể mở đường riêng.

  1. Tạm tắt DNS bảo mật hoặc Secure DNS trong Chrome, Edge hoặc Firefox để cô lập bài kiểm tra, rồi bật lại theo chính sách tổ chức.
  2. Trong thiết lập proxy của Firefox, chọn sử dụng proxy cho DNS nếu tùy chọn có sẵn. Với Chrome và Edge, kiểm tra phần DNS bảo mật vì DoH có thể đi tới nhà cung cấp riêng.
  3. Mở hồ sơ trình duyệt mới và thử ít nhất ba tên miền. Cửa sổ riêng không tự xóa cấu hình mạng.
  4. Tạm tắt tiện ích mở rộng; một số công cụ lọc quảng cáo hoặc bảo mật có thể đi thẳng khỏi proxy.
  5. So sánh IP, quốc gia, resolver và kết quả IPv4/IPv6 trên một trang kiểm tra rò DNS đáng tin cậy.

Nếu IP proxy đúng nhưng resolver vẫn là nhà mạng, nguyên nhân thường là DoH, resolver hệ thống hoặc ứng dụng dùng DNS riêng. Nếu IP đổi giữa các tab, kiểm tra VPN, proxy theo miền và lối thoát dự phòng.

Sửa theo nguyên nhân

Dùng chế độ DNS từ xa

Với SOCKS, dùng socks5h, không phải socks5. Với HTTP hoặc HTTPS proxy, bảo đảm ứng dụng gửi hostname dưới dạng URI tuyệt đối cho proxy; nhiều thư viện làm việc này, nhưng client tùy chỉnh có thể tự phân giải trước. Nếu thư viện chỉ nhận IP hoặc có hàm phân giải riêng, hãy đưa hàm phân giải vào proxy hoặc bật tùy chọn DNS từ xa tương ứng.

Thiết lập biến cho mọi giao thức và giữ danh sách cho phép địa phương rõ ràng:

export HTTP_PROXY='socks5h://127.0.0.1:1080'
export HTTPS_PROXY='socks5h://127.0.0.1:1080'
export ALL_PROXY='socks5h://127.0.0.1:1080'
export NO_PROXY='localhost,127.0.0.1'

Một số công cụ chỉ đọc chữ thường, một số chỉ đọc chữ hoa. Kiểm tra tài liệu công cụ và dùng cùng giá trị cho cả hai nếu cần. NO_PROXY nên chỉ chứa dịch vụ nội bộ thực sự cần đi thẳng; đừng để tên miền kiểm tra nằm trong danh sách này.

Vô hiệu hóa DNS và IPv6 không kiểm soát

Nếu chính sách cho phép, chặn UDP port 53 và DoT port 853 ra ngoài qua firewall, nhưng cho phép resolver cục bộ khi proxy chạy trên cùng máy. DoH chạy trên port 443 nên cần chính sách trình duyệt hoặc luồng ra mạng riêng; không nên chỉ dựa vào việc chặn port 53.

Kiểm tra cả hai phiên bản:

curl -4 -x socks5h://127.0.0.1:1080 https://api.ipify.org
curl -6 -x socks5h://127.0.0.1:1080 https://api.ipify.org

Nếu IPv6 đi thẳng hoặc báo lỗi khác biệt, proxy có thể chỉ hỗ trợ IPv4. Khi đó tạm tắt IPv6 trên môi trường kiểm thử hoặc cấu hình proxy IPv6; không để trình duyệt fallback mà không ghi nhận.

Trong container, DNS thường được cấp bởi Docker hoặc hệ điều phối thay vì proxy của ứng dụng. Kiểm tra /etc/resolv.conf, biến proxy và network mode. Container chạy host network có thể bỏ qua lớp proxy mong muốn.

Xác nhận và khắc phục nhanh

Sau mỗi lần thay đổi, chạy lại cùng một ma trận: request không proxy, SOCKS5, SOCKS5h, HTTP proxy nếu có, trình duyệt hồ sơ sạch và cả IPv4/IPv6. Dùng một tên miền mới để tránh cache.

Kết quả hợp lệ nên có IP thuộc vùng proxy, resolver không phải nhà mạng hoặc máy cục bộ, và không có gói DNS trực tiếp ngoài đường proxy. Lưu log ngắn hạn rồi xóa dữ liệu nhạy cảm theo chính sách.

Nếu vẫn thấy sự cố:

  • IP là IP máy thật: kiểm tra biến proxy, NO_PROXY, VPN, route mặc định và fallback IPv6.
  • IP là proxy nhưng tên miền xuất hiện ở resolver máy: đổi socks5 sang socks5h, kiểm tra DoH và resolver tùy ứng dụng.
  • Chỉ một trình duyệt bị ảnh hưởng: kiểm tra tiện ích mở rộng, DNS prefetch và Secure DNS.
  • Chỉ container bị ảnh hưởng: kiểm tra /etc/resolv.conf, network mode và biến proxy của môi trường chạy.
  • Kết quả thay đổi theo thời gian: làm rỗng cache DNS, đóng kết nối cũ rồi chạy lại.

Kiểm tra rò DNS là một phần của thiết kế an toàn, không phải cách né kiểm soát. Chỉ chạy trên tài nguyên được ủy quyền, bảo vệ mật khẩu hoặc token proxy và tuân thủ điều khoản dịch vụ. Khi DNS, IP và IPv6 cùng đi theo một đường đã kiểm chứng, bạn mới đánh giá đúng quyền riêng tư và hành vi của hệ thống.