5 Level cấu hình Adguard Home – Level 4
Loạt bài viết này mình sẽ chia sẻ 5 level thiết lập AdguardHome (AGH) khi self-host từ dễ đến khó. 5 cấp độ này là do mình tự đặt ra trong quá trình mình sử dụng để giải quyết các nhu cầu thực tế, đồng thời đưa ra nhiều giải pháp để ứng dụng trong self-host nói chung và sử dụng AGH nói riêng
Nếu các bạn chưa biết thì AGH là một phần mềm chặn quảng cáo dựa trên DNS, hay AGH chính là một DNS server có chứ năng chặn quảng cáo. Thay vì sử dụng trực tiếp các DNS công cộng như Google (8.8.8.8) hay Cloudflare (1.1.1.1), chúng ta sẽ truy vấn DNS thông qua AGH để áp dụng các bộ lọc quảng cáo.
Tuy nhiên, AGH không chỉ có mỗi chức năng đó, mà còn hỗ trợ thêm một vài tính năng nâng cao rất thú vị mà sẽ phát huy được sức mạnh khi chúng ta self-host và kết hợp với các ứng dụng khác, mình cũng chia sẻ những điều đó thông qua 5 cấp độ, từ cơ bản đến nâng cao tương ứng với từ dễ đến phức tạp.
- Level 1: Cài đặt và cấu hình cơ bản – [cấp độ: dễ]
- Level 2: Host 2 Server AGH và đồng bộ qua AGH Sync – [dễ]
- Level 3: Dùng AGH ở bất cứ đâu – [trung bình]
- Level 4: Dùng AGH với Cloudflare Tunnel cấu hình server DoH https, kích hoạt Encryption Clien Hello cho trình duyệt – [bắt đầu hơi phức tạp]
- Level 5: Kết hợp DNS Rewrite + Reverse Proxy + Cloudflare Tunnel để có hệ thống DoH Split Horizontal DNS – [rất là phức tạp]
Nội dung chính
Video
Level 4: Dùng AGH với Cloudflare Tunnel
Bên cạnh việc chặn quảng cáo AGH còn hỗ trợ DNS over HTTPS (DoH), DNS over TLS (DoT) và DNS over QUIC (DoQ), những tính năng này hiểu đơn giản là mã hóa truy vấn DNS, giúp truy vấn đó không bị bên thứ ba (ví dụ như nhà mạng) đọc được.
Tuy nhiên vẫn còn một điểm yếu đó là gói tin Client Hello. Mặc dù khi truy vấn tên miền đã được AGH mã hóa, nhưng sau khi có địa chỉ IP để kết nối, trình duyệt vẫn sẽ gửi một gói tin gọi là Client Hello đến website để bắt đầu giao thức bắt tay bảo mật giữa server và trình duyệt.
Mà với các trình duyệt hiện nay, nếu không bật tính năng DNS bảo mật, đa phần tính năng mã hóa gói tin Client Hello (Encryption Client Hello – ECH) cũng sẽ bị tắt theo.
Nếu các bạn còn nhớ thì cuối level 1, mình có 1 lưu ý về việc để các trình duyệt có thể sử dụng AGH mà chúng ta đã cấu hình, sẽ cần vào tắt DNS bảo mật của trình duyệt vì nếu không, trình duyệt sẽ tự kết nối đến server DoH công cộng của Google, Cloudflare, và không đi qua AGH, dẫn đến việc không chặn được quảng cáo.
Để bật tính năng DNS bảo mật mà vẫn có chặn quảng cáo của AGH, chúng ta sẽ cần một đường link DNS over https. Và để làm được điều đó với AGH chúng ta sẽ cần có một tên miền trỏ về server AGH, kèm theo chứng chỉ bảo mật (certificate) cho server khớp với tên miền đó. Cũng có rất nhiều cách để đạt được điều này, nhưng trong bối cảnh self-host, home-lab, mình sẽ chia sẻ cách an toàn, đó là dùng Cloudflare Tunnel.
Kiểm tra ECH đã được kích hoạt chưa
Khi chưa sử dụng DNS bảo mật, các bạn có thể vào một vài 2 website sau để kiểm tra ECH đã được bật hay chưa:
- ECH Check: https://tls-ech.dev/ -> Kết quả You are not using ECH
- Cloudflare Browser check: https://www.cloudflare.com/ssl/encrypted-sni/ -> Kết quả: Secure SNI chưa được bật


Sau khi thay đổi cài đặt DNS bảo mật, các bạn cần khởi động lại Chrome, sau đó xóa cache DNS của Chrome và xóa DNS cache của thiết bị để đảm bảo kết quả test lần tiếp theo chuẩn xác:
- Xóa DNS Cache Chrome: chrome://net-internals/#dns
- Xóa DNS Cache Mac (Terminal): sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
- Xóa DNS Cache Win (CMD/Shell): ipconfig /flushdns
Cấu hình trên Cloudflare và cài đặt Cloudflare Tunnel lên server
Các bạn sẽ cần có tên miền, và đã trỏ Name Server của tên miền về Cloudflare quản lý.
Sau đó các bạn vào phần Zero Trust. Nếu đây là lần đầu các bạn vào, có thể sẽ phải kích hoạt để sử dụng. Zero Trust có gói cước miễn phí, tuy nhiên quá trình kích hoạt vẫn sẽ phải thêm phương thức thanh toán như là thẻ quốc tế.
Khi đã vào được giao diện Zero Trust, các bạn vào mục Network -> Tunnel and Mesh và sau đó chọn Create Tunnel, tiếp tục chọn Cloudflared, đặt tên cho Tunnel tùy ý, sau đó ấn Save lại là Tunnel đã được tạo thành công. Màn hình sẽ chuyển qua bước cài đặt Connector (chính là phần mềm Cloudflare-Tunnel sẽ cài trên server)
Tại đây các bạn có thể lựa chọn nền tảng mà server các bạn đang dùng, ví dụ như Debian, RedHat hay Docker. Mình thấy cài trên Docker là tiện và đủ dùng rồi nên mình sẽ chọn phương thức đó.

Khi chọn docker, các bạn copy dòng lệnh docker run và có thể chạy lệnh đó trực tiếp trên server đang cài docker, hoặc mình khuyên là nên chuyển thành dạng docker composer, các bạn chỉ cần lấy phần token và thay thế vào composer dưới đây là được. Vì sang phần 5 chúng ta có tái sử dụng lại composer này lần nữa.
services:
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared-tunnel
network_mode: bridge
restart: always
command: tunnel --no-autoupdate run --token paste_token_vao_day
Sau khi chạy xong, các bạn sẽ thấy Connectors hiện ở trên trang Config của Cloudflare. Sau đó ấn Next là sẽ chuyển qua phần cấu hình Route Tunnel.
Đây là nơi các bạn sẽ cấu hình tên miền để trỏ về server AGH tại nhà.
Tại mục Hostname, các bạn sẽ cấu hình như sau:
- Subdomain: không bắt buộc nhưng nên dùng. Có thể đặt là: dns, agh, tùy ý các bạn
- Domain: chọn domain trong list, chính là domain mà Cloudflare quản lý
- Path: để trống
Trước mắt các bạn cứ cấu hình 3 mục này như vậy. Sang phần 5 mình sẽ chia sẻ thêm một số cấu hình nâng cao để tăng tính bảo mật, còn hiện tại ở phần 4 cứ làm như vậy để có thể kết nối đến server AGH đã.
Tại mục Service, các bạn cấu hình như sau:
- Type: chọn HTTP
- URL: các bạn điền IP + Port quản lý của AGH (Port quản lý là port dùng để các bạn truy cập trang Admin của AGH, không phải port 53)

Sau đó các bạn ấn complete, như vậy là đã cấu hình xong Cloudflare Tunnel trỏ tên miền về AGH.
Ví dụ: dns.tenmiencuaban.com -> trỏ về IP: 10.1.1.20:8080 (là IP của AGH cùng port quản lý 8080)
Cấu hình AdGuard Home để tiếp nhận truy vấn DoH
Thông thường, chúng ta sẽ cài đặt tên miền trỏ thẳng vào AGH, và như vậy đồng nghĩa với việc để tên miền đó có https, chúng ta phải cấu hình chứng chỉ cho tên miền. Tuy nhiên, khi sử dụng Cloudflare và Cloudflare Tunnel, Cloudflare đã tự động lo phần chứng chỉ đó, vì vậy như cấu hình ở phần trước, chúng ta chỉ cần sử dụng kết nối HTTP thường giữa Cloudflare Tunnel và AGH.
Nhưng cũng chính vì vậy, chúng ta sẽ cần thêm 1 bước cấu hình cho AGH để cho phép trả kết quả truy vấn DoH thông qua HTTP thường.
Các bạn còn nhớ ở phần 1 khi chúng ta cấu hình AGH, mình có đề cập về thư mục cài đặt. Các bạn sẽ vào đó, đối với Linux, thư mục mặc định nếu dùng script cài đặt tự động là /opt/AdGuardHome/ còn với docker là thư mục các bạn tự chọn. Tiếp tục vào thư mục config, các bạn sẽ thấy file AdGuardHome.yaml
Trước khi sửa file, các bạn hãy đảm bảo là đã tắt AGH, với Linux có thể dùng 1 trong 2 lệnh dưới
sudo /opt/AdGuardHome/AdGuardHome -s stop
#hoặc
sudo systemctl stop AdGuardHome
Với Docker có thể dùng lệnh hoặc ấn stop trên giao diện app Docker Desktop, Portainer, v.v…
docker stop adguardhome
Sau khi tắt AGH các bạn mở file bằng ứng dụng edit text hoặc edit code. Thông thường sẽ là dùng lệnh
nano /opt/AdGuardHome/AdGuardHome.yaml
Tìm đến mục doh: các bạn sẽ nhìn thấy dòng insecure_enabled: false các bạn đổi thành true, sau đó save file này lại bằng tổ hợp Ctrl + O, Enter và thoát bằng Ctrl + X

Sau đó chạy lệnh bên dưới để bật lại AGH
sudo /opt/AdGuardHome/AdGuardHome -s start
#hoặc
sudo systemctl start AdGuardHome
#hoặc
docker start adguardhome
Mục đích cấu hình như vậy là để AGH trả lời truy vấn DoH qua giao thức không bảo mật, vì chúng ta đang cấu hình truy cập từ cloudflare tunnel tới AGH bằng giao thức HTTP thông thường. Cái đoạn từ Cloudflare Tunnel đến AGH mà dùng HTTP này chỉ diễn ra trong mạng nội bộ, vì vậy sẽ không quá cần thiết phải dùng HTTPS.
Kiểm tra sau khi cấu hình
Sau khi các bạn cài đặt xong, các bạn thử truy cập tên miền đã cấu hình, ví dụ https://dns.tenmiencuaban.com -> Kết quả phải là trang quản lý của AGH, không bị cảnh báo gì về kết nối không bảo mật. Như vậy là Cloudflare Tunnel đã hoạt động, tự động lấy chứng chỉ cho tên miền và kết nối vào được server AGH.
Tiếp tục thử truy cập https://dns.tenmiencuaban.com/dns-query (cần thêm path /dns-query vào đuôi của link) -> Kết quả trả về phải là màn hình trắng với 1 dòng chữ duy nhất Bad Request! -> Như vậy là đã có thể truy vấn DNS qua HTTPS. Đường link DoH đã sẵn sàng
Kế tiếp, các bạn vào cài đặt của Chrome, cài đặt quyền riêng tư vào bảo mật, kéo xuống mục Sử dụng DNS bảo mật, và gạt công tắc bật lên. Sau đó trong mục chọn nhà cung cấp DNS, các bạn chọn thêm nhà cung cấp DNS tùy chỉnh (Add custom DNS provider) và paste đường link DoH của các bạn vào đây: https://dns.tenmiencuaban.com/dns-query

Nếu đường link chưa đúng, Chrome sẽ báo: Please verify that this is a valid provider or try again later. Nếu đường link hoạt động, Chrome sẽ không hiện cảnh báo. Sau đó các bạn tắt hoàn toàn Chrome và khởi động lại.
Rồi các bạn thực hiện lại việc kiểm tra ECH như phần đầu bài mình đã giới thiệu (nhớ restart Chrome, xóa DNS cache của trình duyệt lẫn thiết bị), lúc này sẽ ra kết quả là đã được bật Secure SNI. Trong test này, nếu như mục Secure DNS hiện dấu hỏi chấm thì các bạn cũng không cần lo lắng, vì nó sẽ chỉ hiển thị Secure DNS nếu chúng ta cấu hình Upstream DNS là của Cloudflare, nhưng mà ở level 1 chúng ta còn cấu hình cả của các nhà cung cấp khác nên khi test bằng trang này của Cloudflare thì mục Secure DNS sẽ hiện vậy.
Cấu hình bảo mật cơ bản cho AGH trên Cloudflare
Khi cấu hình tên miền trên Cloudflare, các chứng chỉ bảo mật sẽ được Cloudflare tự động đăng kí, và đồng thời tên miền của bạn cũng sẽ được Public ra internet, vì vậy, cũng nên có một số cấu hình cơ bản để không cho phép truy cập đến AGH từ đường link công cộng, tránh việc bị người ngoài truy cập hoặc bị bot quét.
Các bạn vào trang quản lý của Cloudflare, thoát ra trang chủ (không còn trong mục Zero Trust nữa), vào mục Domain -> Overview -> vào domain của các bạn.
Kế tiếp chọn mục Security và chọn Security Rule. Sau đó ấn Create Rule
Các bạn cấu hình như sau:
- Field: Hostname
- Operator: equals
- Value: dns.tenmiencuaban.com
Sau đó chọn And để thêm 1 dòng nữa, và cấu hình như sau:
- Field: URL Path
- Operator: does not equal
- Value: /dns-query

Kéo xuống dưới chọn action là block, chọn status là active và sau đó Save lại là được. Ý nghĩa của Rule này là chỉ cho phép truy cập dns.tenmiencuaban.com/dns-query còn mọi được link khác, ví dụ như dns.tenmiencuaban.com sẽ bị chặn.
Chờ khoảng 30 giây, các bạn thử truy cập lại dns.tenmiencuaban.com (bằng tab ẩn danh cho chắc chắn) sẽ thấy màn hình Block của cloudflare hiện lên. Còn truy cập bằng dns.tenmiencuaban.com/dns-query thì vẫn sẽ báo Bad Request như bình thường. Vậy là đã thành công.
Đến đây, các bạn đã hoàn thành level 4 của AGH, đó là tự cấu hình DoH với tên miền riêng và có thể truy cập từ mọi nơi một cách an toàn thông qua Cloudflare Tunnel.
Tuy nhiên vẫn còn 3 vấn đề:
- Khi các bạn ở nhà, trong cùng 1 mạng nội bộ với AGH, mà lại sử dụng đường link vòng ra Cloudflare ở server quốc tế, rồi lại vòng lại Tunnel về AGH ở nhà, tự nhiên sẽ lại tăng độ trễ lên vài chục vài trăm ms cho sự vòng vèo đó.
- URL Path /dns-query vẫn là path mặc định và phổ biến của DoH Server, vì vậy AGH vẫn có thể bị biến thành một DNS server công cộng mà người lạ có thể sử dụng tài nguyên của bạn, hoặc đứng trước nguy cơ bị tấn công ddos.
- Bạn có 2 server AGH, nhưng hiện tại mới chỉ kết nối với 1 Tunnel. Vậy toàn bộ DNS query từ Tunnel sẽ đổ dồn vào 1 AGH server, có thể gây mất cân bằng, hoặc khi server đó sập, tunnel sập, DoH cũng sập theo.
Đó là lý do chúng ta có Phần 5: Kết hợp DNS Rewrite + Reverse Proxy + Cloudflare Tunnel để có hệ thống DoH Split Horizontal DNS
Nếu thấy nội dung bài viết hữu ích, hãy chia sẻ cho bạn bè và người thân. Đừng quên theo dõi Ngon Bổ Xẻ qua Facebook và Youtube để luôn cập nhật các nội dung mới nhất. Ngoài ra, mình cũng có lập Group FB chuyên chia sẻ các deal hời cho anh em về công nghệ, điện từ, gia dụng… các bạn cũng có thể tham gia nha. Một lần nữa, chân thành cám ơn các bạn và hẹn gặp lại trong những nội dung kế tiếp ❤️
Chia sẻ bài viết:
