[{"data":1,"prerenderedAt":21},["ShallowReactive",2],{"blog:post:vi:dns-leak-check-with-proxy":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":14,"thumbnail_url":17,"translations":18,"body":19,"asset_base":20},"dns-leak-check-with-proxy","vi","Kiểm tra rò DNS qua proxy: hướng dẫn an toàn cho Python, cURL và trình duyệt","Hiểu cách DNS thoát khỏi proxy, nhận diện dấu hiệu rò rỉ và kiểm tra cấu hình bằng Python, cURL cùng thiết lập trình duyệt an toàn.","2026-09-14",[10,11,12,13],"dns","proxy","riêng tư","mạng",[10,11,15,16],"rieng-tu","mang","https://blog-api.ro-proxy.com/api/blog/posts/dns-leak-check-with-proxy/thumbnail.svg?lang=vi",[5],"## DNS không phải lúc nào cũng đi theo proxy\n\nKhi 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.\n\nProxy 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.\n\nMụ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.\n\n## Kiểm tra bằng cURL\n\nHã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.\n\nDùng một tên miền chưa được cache, chẳng hạn `example.com`, rồi chạy:\n\n```bash\ncurl -sS https://api.ipify.org?format=json\ncurl -sS -x socks5h://127.0.0.1:1080 https://api.ipify.org?format=json\ncurl -sS -x socks5://127.0.0.1:1080 https://api.ipify.org?format=json\n```\n\n`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.\n\nĐể 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ế:\n\n```bash\nsudo tcpdump -i any 'host 1.1.1.1 and (port 53 or port 853)'\n```\n\nSau đó 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ỉ.\n\nTrê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.\n\n## Kiểm tra bằng Python\n\nRequests 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:\n\n```bash\npip install 'requests[socks]' PySocks\n```\n\n```python\nimport requests\n\nproxy = 'socks5h://127.0.0.1:1080'\nresponse = requests.get(\n    'https://api.ipify.org',\n    proxies={'http': proxy, 'https': proxy},\n    timeout=10,\n)\nprint(response.text)\n```\n\n`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.\n\nKiể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ề.\n\n## Kiểm tra trình duyệt và các tác nhân ẩn\n\nTrì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.\n\n1. 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.\n2. 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.\n3. 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.\n4. 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.\n5. 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\nNế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.\n\n## Sửa theo nguyên nhân\n\n### Dùng chế độ DNS từ xa\n\nVớ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.\n\nThiế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:\n\n```bash\nexport HTTP_PROXY='socks5h://127.0.0.1:1080'\nexport HTTPS_PROXY='socks5h://127.0.0.1:1080'\nexport ALL_PROXY='socks5h://127.0.0.1:1080'\nexport NO_PROXY='localhost,127.0.0.1'\n```\n\nMộ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.\n\n### Vô hiệu hóa DNS và IPv6 không kiểm soát\n\nNế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.\n\nKiểm tra cả hai phiên bản:\n\n```bash\ncurl -4 -x socks5h://127.0.0.1:1080 https://api.ipify.org\ncurl -6 -x socks5h://127.0.0.1:1080 https://api.ipify.org\n```\n\nNế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.\n\nTrong 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.\n\n## Xác nhận và khắc phục nhanh\n\nSau 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.\n\nKế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\nNếu vẫn thấy sự cố:\n\n- IP là IP máy thật: kiểm tra biến proxy, `NO_PROXY`, VPN, route mặc định và fallback IPv6.\n- 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.\n- 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.\n- 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.\n- 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.\n\nKiể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.\n","https://blog-api.ro-proxy.com/api/blog/posts/dns-leak-check-with-proxy/assets",1790057932515]