DNS-over-HTTPS cho AdGuard qua Cloudflare Tunnel

Tóm tắt

Ghi chú thao tác trực tiếp: expose AdGuard Home (chạy trên Pi, chỉ bind LAN 10.0.0.22:53) ra ngoài Internet dưới dạng DNS-over-HTTPS (DoH), tận dụng tunnel Cloudflare đã có sẵn (homelab-ssh) thay vì phụ thuộc IP WAN động của nhà. Mục tiêu: điện thoại/laptop vẫn được lọc quảng cáo bởi AdGuard ngay cả khi ra khỏi mạng nhà.

Điểm chính

  • AdGuard Home có sẵn server DoH tại route /dns-query (cấu hình trong http.doh của AdGuardHome.yaml), nhưng mặc định insecure_enabled: false — chỉ phục vụ DoH khi TLS được bật trực tiếp trên AdGuard.
  • Vì Cloudflare Tunnel đã lo phần TLS ở biên (edge), không cần AdGuard tự quản lý chứng chỉ — chỉ cần bật insecure_enabled: true để AdGuard chấp nhận DoH qua cổng HTTP nội bộ (0.0.0.0:3000, cổng dùng chung với giao diện quản trị).
  • Thêm 1 ingress rule vào tunnel homelab-ssh đã có (cùng tunnel với SSH, không cần tạo tunnel mới): hostname dns.nguyenbinhson.com, giới hạn bằng path: ^/dns-query.* để chỉ lộ đúng endpoint DoH — không lộ giao diện quản trị AdGuard (vốn cũng chạy trên cổng 3000) ra Internet.
  • Route DNS: cloudflared tunnel route dns homelab-ssh dns.nguyenbinhson.com.
  • Đã test bằng curl --doh-url https://dns.nguyenbinhson.com/dns-query: phân giải example.com thành công (HTTP 200), còn doubleclick.net (domain quảng cáo) bị chặn hẳn (kết nối thất bại) — xác nhận traffic đi đúng qua AdGuard, không fallback DNS hệ thống.
  • Đánh đổi bảo mật đã chấp nhận: endpoint DoH này không thể gắn Cloudflare Access (email OTP) vì cấu hình DNS-over-HTTPS ở tầng hệ điều hành (iOS/macOS/Android) không hỗ trợ luồng xác thực trình duyệt. Domain coi như public nhưng khó đoán — ai biết đúng URL vẫn dùng được resolver, rủi ro chấp nhận được (tốn tài nguyên, không lộ dữ liệu mạng nhà).
  • Áp dụng thật lên máy (2026-07-24): thử cài Configuration Profile (com.apple.dnsSettings.managed) trên macOS trước — thất bại, báo lỗi “VPN Service payload could not be installed” (giới hạn đã biết của macOS với profile DNS cài thủ công, không qua MDM). Chuyển sang giải pháp thay thế: cài dnscrypt-proxy (Homebrew) trên MacBook opera-macbook, cấu hình forward qua DoH tới đúng endpoint này (stamp tĩnh trỏ dns.nguyenbinhson.com/dns-query), chạy như service dưới root ở 127.0.0.1:53, rồi trỏ DNS hệ thống (networksetup) về 127.0.0.1. Test xác nhận: doubleclick.net bị chặn (trả về 0.0.0.0), domain thường resolve bình thường — máy đã thật sự dùng AdGuard Home để lọc DNS khi ở mạng public, không chỉ test bằng curl.

Khái niệm

Người liên quan

Câu hỏi mở

  • Cấu hình DoH trên các thiết bị di động (Encrypted DNS profile trên iOS, Private DNS trên Android) — chưa làm, mới chỉ áp dụng cho MacBook.