AdGuard Home là phiên bản self-hosting của AdGuard, về cơ bản nó rất tương đồng với NextDNS mà mình từng giới thiệu cách đây vài năm, ưu điểm của nó so với NextDNS là có thể cấu hình thêm các blocklists riêng, khả năng chặn triệt để hơn so với các addon như Ublock Origin (vì gần như không thể bị phát hiện), cũng đỡ hao pin, nhẹ, ít tốn RAM hơn ở các thiết bị di động, có điều AdGuard Home cần server riêng để cài đặt, cấu hình khá phức tạp, độ ổn định, tốc độ, bảo mật …. thường sẽ kém hơn so với các dịch vụ có sẵn (dùng VPS riêng downtime thường cao, quản trị, bảo mật, bảo trì phiền phức), dùng cá nhân NextDNS bản miễn phí khá rủng rỉnh rồi (thực tế vài năm nay mình vẫn dùng NextDNS bản miễn phí trên iPhone, iPad)
Lý do vì sao AdGuard Home đã ra mắt nhiều năm mà mình không giới thiệu là như thế, dùng cá nhân không cần thiết, cách đây vài tháng, mình có làm 1 số phiên bản trình duyệt di động Chromium, Cốc Cốc, Edge … ở bước cấu hình DNS, duy trì sử dụng DNS của Cloudflare qua file .reg
Với AdGuard Home, có thể tạo ra 1 DNS endpoint DoH (DNS-over-HTTPS), dạng https://adguard.bibica.net/dns-query{?dns}
, sau đó quản lý chặn quảng cáo qua URL này sẽ tiện hơn so với cách dùng DNS truyền thống, cần chạy qua IP thực của VPS, cấu hình tự động trên trình duyệt di động cũng nhàn hơn, chỉ cần sửa lại đường dẫn DnsOverHttpsTemplates
; Cấu hình DNS bảo mật tự động (sử dụng AdGuard Home) "DnsOverHttpsMode"="automatic" "DnsOverHttpsTemplates"="https://adguard.bibica.net/dns-query{?dns}"
Thêm 1 điểm khả thi cho giải pháp này, VPS Oracle miễn phí mình đang có, uptime vài năm nay ~ 100%, cài đặt AdGuard Home, sử dụng hàng ngày sẽ tự tin hơn
Ý tưởng của bài này là cài đặt Adguard Home qua Docker, dùng Caddy để tự tạo và renew SSL giúp duy trì tính năng DNS-over-HTTPS, domain quản lý qua Cloudflare DNS, có bật proxied (đám mây cam) để ẩn đi server gốc, tăng thêm 1 chút an toàn cho người dùng
Các bước hướng dẫn cài đặt bên dưới, dành cho bạn nào có VPS, muốn setup riêng, nếu chỉ sử dụng, ấn vào đây cho nhanh
Cấu hình ban đầu
Để mọi thứ đơn giản, tạo mới 1 con VPS sạch sẽ, chưa cài đặt gì chạy OS Debian 13 😀 có thể dùng reinstall cho sạch sẽ
- Nếu bạn đã cài docker, docker compose thì không cần làm bước bên dưới
wget -qO vps.sh https://go.bibica.net/ubuntu-22-04-basic-optimization && sudo bash vps.sh
Cài đặt Adguard Home – Caddy
- Nên cài đặt vào 1 thư mục con, để sau này backup, restore cho tiện
mkdir /home/adguardhome cd /home/adguardhome nano compose.yml
- Nội dung bên trong điền vào
services: caddy: image: caddy:2.10.2-alpine container_name: caddy restart: always networks: - reverse_proxy volumes: - ./domain-config:/domain-config - ./Caddyfile:/etc/caddy/Caddyfile - ./caddy_data:/data - ./caddy_config:/config ports: - 80:80 - 443:443 - 443:443/udp adguardhome: image: adguard/adguardhome container_name: adguardhome restart: always networks: - reverse_proxy volumes: - ./adguard/work:/opt/adguardhome/work - ./adguard/config:/opt/adguardhome/conf - ./caddy_data:/caddy_data:ro ports: - 3000:3000/tcp networks: reverse_proxy: driver: "bridge" name: reverse_proxy
Ctrl+O
-> Enter
-> Ctrl+X
để save và exit.
- Tiếp theo tạo nội dung
Caddyfile
nano Caddyfile
- Nội dung bên trong điền vào
:80 { respond "Hello, world!" } # Import các file cấu hình riêng import /domain-config/*.conf
Ctrl+O
-> Enter
-> Ctrl+X
để save và exit.
- Cuối cùng chạy lệnh bên dưới để hoàn thành cài đặt
docker compose up -d --build --remove-orphans --force-recreate
Tạo tài khoản admin
Truy cập vào trang cài đặt AdGuard Home theo địa chỉ IP:3000
, ví dụ 64.181.123.123:3000
- Cứ next như mặc định ở bước 1 và 2, tới bước 3, tạo 1 tài khoản admin với username, password tùy thích
- Tạo ra 1 sub domain ngắn gọn, dạng
adguard.bibica.net
, truy cập vào tài khoản quản trị và cấu hình sau này cho dễ nhớ
nano domain-config/bibica.net.conf
- Bên trong điền vào
adguard.bibica.net { reverse_proxy adguardhome:80 { header_up X-Forwarded-For {header.X-Forwarded-For} } }
Ctrl+O
-> Enter
-> Ctrl+X
để save và exit.
- Mở file cấu hình gốc của AdGuardHome
nano /home/adguardhome/adguard/config/AdGuardHome.yaml
- Kéo xuống dưới 1 chút sẽ thấy phần
trusted_proxies
trusted_proxies: - 127.0.0.0/8 - ::1/128 - 172.16.0.0/12
- Thêm vào bên dưới dòng
- 172.16.0.0/12
Ctrl+O
-> Enter
-> Ctrl+X
để save và exit.
- Login vào Cloudflare, thêm A Records
adguard.bibica.net
như thông thường, bật sẵn proxy status, đám mây cam lên luôn
- Khởi động lại các docker
docker compose stop && docker compose start
- Chờ 1 chút để Caddy tạo SSL
Truy cập vào adguard.bibica.net
, đăng nhập tài khoản tạo ra ở bước 3
Cấu hình Adguard Home
- Thêm bộ lọc chặn quảng cáo, Filters –> DNS Blocklists
- Sử dụng 1 số bộ lọc cơ bản, nhẹ nhất, dùng
AdGuard DNS filter
vàVNM: ABPVN List
là đủ, cần chỉnh sửa thêm gì thì add thủ công vào, hạn chế vấn đề chặn nhầm
AdGuard DNS filter VNM: ABPVN List CocCoc & MSN Domains
Cá nhân chặn các domain từ Cốc Cốc và trang new tab của Edge, nên tạo thêm bộ lọc ngoài CocCoc & MSN Domains trên github, cần chặn thêm thì sửa từ danh sách trên github, đỡ phải login vào quản trị cấu hình lỉnh kỉnh
- Tạo danh sách Allowlist
Trong trường hợp bộ lọc chặn nhầm domain nào đó (ví dụ umami.is
), nếu ít, có thể thêm thủ công thẳng vào Filters -> Custom filtering rules, thêm vào @@||umami.is^
Nếu cần quản lý nhiều domain allowlist hơn, tạo bộ lọc ngoài whitelist tương tự trên github, thêm nó vào Filters -> DNS allowlists, sau này cần whitelist domain nào thì sửa từ danh sách trên github, đỡ phải login vào quản trị
Cấu hình Upstream DNS servers
- Settings –> DNS Setting, phần
Upstream DNS servers
thêm vào
1.1.1.1 8.8.8.8
Dãy Upstream DNS an toàn, đủ nhanh (average processing time sau ít ngày sử dụng ở mức 1ms – 5ms)
- Đơn giản, ổn định, dùng duy nhất 1 DNS như 1.1.1.1, dùng nhiều Upstream DNS cùng lúc, đôi khi vào 1 trang lớn, nó request tới 10-20 domain phụ, mỗi domain này nếu check cùng lúc trên 5-10 Upstream DNS sẽ tạo ra 50-200 request 1 lúc, đôi khi mất ổn định
Cấu hình Upstream DNS servers dùng cá nhân:
Cấu hình đang sử dụng hàng ngày 😅
- Cá nhân do sử dụng rất nhiều dịch vụ của Cloudflare, dùng nhiều năm Cloudflare DNS rất hài lòng, nên lựa chọn nó làm DNS chính cho mọi trang
- Sử dụng Cloudflare Gateway, tạo ra 1 DNS locations có bật EDNS Client Subnet, giúp một số dịch vụ CDN định tuyến người dùng đến máy chủ gần hơn
https://iabucttpma.cloudflare-gateway.com/dns-query
Thực tế sử dụng, nếu user dùng IPv6, ở 1 vài dịch vụ, định tuyến tốt hơn so với IPv4
- Bật sử dụng
Parallel requests
(chạy đồng loạt tất cả Upstream DNS servers, lấy kết quả trả về đầu tiên, không có tác dụng với cấu hình đang dùng, do chỉ dùng duy nhất DNS servers, thêm vào sẵn để nếu cần dùng nhiều Upstream DNS servers sẽ hiệu quả hơn) - Fallback DNS servers (chỉ sử dụng nếu Upstream DNS servers bị lỗi, thêm vào cho an toàn)
94.140.14.14 94.140.15.15
- Bootstrap DNS servers (dùng để phân giải tên miền Upstream DNS servers khi được khai báo bằng domain thay vì IP)
1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001
DNS server configuration
- Rate limit:
20
(mặc định 20 là đủ cho sử dụng bình thường, set 50-60 cũng ổn, dùng cá nhân có thể để0
luôn cho thoải mái) - Bật
Enable EDNS client subnet
(gửi vị trí địa lý của client để nhận server gần nhất, tùy chọn quan trọng)
DNS cache configuration
- Bật
Enable cache
- Cache size:
67108864
- Override minimum TTL:
60
- Override maximum TTL:
300
- Bật
Optimistic caching
Khi bật Enable cache và Optimistic caching, AdGuard Home quản lý theo logic thông minh hơn, ví dụ theo cấu hình bên trên
- Lần đầu truy cập bibica.net:
- Ví dụ response time: ~200ms
- TTL upstream = 300s
- AdGuard Home giữ nguyên 300s (vì 60 ≤ 300 ≤ 300)
- Trong 300s (5 phút) tiếp theo:
- Truy cập lại bibica.net -> dùng cache
- Response time: ~1ms
- Sau 300s, cache hết hạn:
- Optimistic caching: vẫn dùng IP cũ (response time ~1ms)
- Background: refresh cache mới
- -> User không thấy chậm dù đã hết thời gian cache
- Sau 10s (T=310s):
- Cache đã refresh, lưu IP hiện tại dùng cho 300s tiếp theo
Với logic hoạt động như này, khi truy cập lần đầu tiên tới 1 domain mới hoàn toàn, user mới thấy chậm 1 chút, còn lại gần như đều dùng cache cũ, khi hết thời gian cache cũng sẽ chạy ngầm, user sẽ không thấy chậm, TTL 60-300 là con số hợp lý, phù hợp với đại đa số cấu hình hiện tại (GitHub dùng TTL 60s), nếu domain đổi IP, quá trình gián đoạn không quá dài, tối đa 300s + 10s
General settings
- Filter update interval:
1 hour
(thời gian cập nhập các bộ lọc, có thể tắt, vì tính năng này sử dụng RAM rất nhiều)
Encryption settings (quan trọng, cấu hình theo hướng dẫn)
Bước này là phần quan trọng nhất để tạo chế độ DNS over HTTPS tự động
- Settings -> Encryption settings
- Bật
Enable Encryption (HTTPS, DNS-over-HTTPS, and DNS-over-TLS)
- Bật
Enable plain DNS
- Server name:
adguard.bibica.net
- HTTPS port:
443
- DNS-over-TLS port:
0
(hoặc để trắng) - DNS-over-QUIC port:
0
(hoặc để trắng)
Certificates
Tùy thuộc bạn dùng sub domain gì, truy cập vào đường dẫn /home/adguardhome/caddy_data/caddy/certificates/
trên VPS, sẽ thấy 2 khóa SSL .crt
và .key
tương ứng được Caddy tạo ra, dùng đường dẫn theo cấu trúc /caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/
/caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/adguard.bibica.net/adguard.bibica.net.crt /caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/adguard.bibica.net/adguard.bibica.net.key
- Mở file cấu hình gốc của AdGuardHome
nano /home/adguardhome/adguard/config/AdGuardHome.yaml
- Kéo xuống dưới, sẽ thấy phần
tls
tls: enabled: true server_name: adguard.bibica.net force_https: false port_https: 443 port_dns_over_tls: 0 port_dns_over_quic: 0 port_dnscrypt: 0 dnscrypt_config_file: "" allow_unencrypted_doh: false certificate_chain: "" private_key: "" certificate_path: /caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/adguard.bibica.net/adguard.bibica.net.crt private_key_path: /caddy_data/caddy/certificates/acme-v02.api.letsencrypt.org-directory/adguard.bibica.net/adguard.bibica.net.key strict_sni_check: false
- Dòng
allow_unencrypted_doh: false
sửa lại thànhallow_unencrypted_doh: true
Khởi động lại AdGuard Home để thay đổi có hiệu lực
docker restart adguardhome
- Lúc này, truy cập vào đường dẫn
https://adguard.bibica.net/dns-query
sẽ thấy thông báoBad Request
là việc cài đặt đã chính xác
Kiểm tra lại các cài đặt
Cài đặt hiện tại, AdGuard Home DoH chạy qua Docker, dùng Caddy làm reverse proxy, nhờ thế không cần mở thêm port nào (sau khi cài đặt xong, có thể bỏ đi port 3000 mở ra ban đầu), IP server được ẩn qua Cloudflare, tăng thêm 1 chút an toàn, logs clients được lưu theo IP của docker, cũng tăng thêm 1 chút an tâm cho người dùng
Sau này có chuyển server chạy AdGuard Home, copy thư mục /home/adguardhome/
sang server mới là xong, không cần sửa lại IP trong cấu hình domain
Adguard Home và Caddy khi chạy, sử dụng ban đầu ~ 80MB RAM, CPU dùng không đáng kể, về HDD ghi xuống bao nhiêu tùy thuộc số user sử dụng, ở giai đoạn đầu cần kiểm tra chất lượng dãy DNS, xem có chặn nhầm gì không, có thể lưu log kiểm tra … chạy ổn định rồi thì tắt ghi log đi cho nhẹ
Về cấu hình docker Adguard Home – Caddy, mình đã sửa lại để AdGuard Home đọc trực tiếp 2 khóa SSL .crt
và .key
tạo ra từ Caddy, sau 90 ngày SSL hết hạn, Caddy renew, AdGuard Home sẽ tự đọc được cấu hình mới, không phải điều chỉnh thủ công
Bạn nào đã có sẵn Caddy, Nginx hay 1 dịch vụ khác làm Reverse Proxy thì sửa lại cấu hình 1 chút là được
Lỗi?
High RAM consumption during filter updates, giải thích ngắn gọn thì bất cứ khi nào bạn ấn vào update danh sách bộ lọc, Adguard Home sẽ dùng cập nhập lại danh sách, AdGuard sẽ tạo bản index mới trong RAM, còn bản cũ không được giải phóng triệt để ngay lập tức, kết quả là nó cứ tăng RAM mãi cho tới khi sập VPS? mình thấy 1 user chạy Adguard Home mà dùng 13Gb/16GB RAM
Theo Adguard họ nói vấn đề này lỗi do Go, và không có kế hoạch xử lý, vì không biết xử lý kiểu gì
Cá nhân tạm xử lý bằng cách cài đặt Adguard Home trên Debian 13, tắt chế độ cập nhập tự động, tắt luôn các rule chặn quảng cáo, để chặn quảng cáo dùng thông qua Upstream DNS servers Cloudflare Gateway, Adguard Home lúc này chỉ dùng để cache DNS, RAM dùng ởn định ~ 30MB-45MB, tạm chưa thấy vấn đề tăng RAM quá mức
Hiệu năng
Trên VPS tại Singapore, khi user Việt Nam sử dụng, thông số hiển thị ra chính xác
Trên VPS tại US, vẫn có vài kết nối sang US, vấn đề định tuyến đường truyền này phức tạp lắm, vừa có thể do Cloudflare, vừa có thể do nhà mạng, vừa có thể do trang kết nối tới, tạm coi Anycast của Cloudflare có vấn đề gì đó, chứ chịu, không hiểu vì sao,
Giải pháp đơn giản thô bạo, cứ dùng VPS gần user nhất, tránh các vấn đề định tuyến nhầm
Khi dùng DoH qua Adguard Home, hiệu năng phân giải DNS không có nhiều ý nghĩa, vì nó chỉ kiểm tra ở lần truy cập đầu tiên, các lần truy cập sau, sẽ dùng lại cache cũ, DNS càng nhiều người dùng, truy cập càng nhiều domain, thì càng hiệu quả, thứ ảnh hưởng hiệu năng năng nhất, là các domain dùng các dịch vụ DNS tại Việt Nam để quản lý
- User VN -> AGH (US) -> Domain DNS (baomoi.com) -> AGH (US) -> User VN
Lần đầu, khi chưa có cache, khá lâu ~ 370ms, từ lần 2 khi có cache, còn khoảng 190ms, có thể nói là con số tối đa, mà VPS US có thể đáp ứng được, không có cách nào thấp hơn … 180ms
Sử dụng thực tế, sau lần đầu tiên truy cập domain (~200ms), từ lần 2, trình duyệt dùng lại giá trị này (1ms-2ms), nên cũng không gây sự khó chịu
- Với 1 số domain như medium.com, có thể dùng DNS rewrites sửa lại để truy cập được bình thường
Không có gì phàn nàn về hiệu năng phân giải DNS của AdGuard Home, kịch trần hiệu năng rồi, vấn đề chặn quảng cáo tới đâu, tùy thuộc vào bộ lọc sử dụng, càng không có gì để phàn nàn, tổng thể hài lòng
Cấu hình DNS-over-HTTPS cho các trình duyệt
Cấu hình DoH AdGuard Home trong bài này chủ yếu áp dụng cho các trình duyệt di động Chromium, Cốc Cốc, Edge dùng cá nhân … chạy file .reg
đi kèm là được
- Trong trường hợp bạn muốn dùng DoH AdGuard Home chặn sẵn 1 số quảng cáo cơ bản
- Settings → Privacy and security → Security
- Scroll xuống phần “Advanced”
- Tìm “Use secure DNS” → Enable
- Chọn “With Custom”
- Nhập:
https://adguard.bibica.net/dns-query
Có thể lấy thêm rất nhiều endpoint DoH khác tại đây
Cấu hình DNS-over-HTTPS cho iOS, iPadOS
Trên iOS, iPadOS download profile làm sẵn, ấn cài đặt tương tự như NextDNS
Thử nghiệm sơ bộ trên iOS, iPadOS hoạt động hiệu quả, tương tự NextDNS mình dùng đó giờ, mà có thể tủy chỉnh thêm bớt các domain cần chặn, cực hợp trên iOS, iPadOS, vì chặn quảng cáo trên iPhone, iPad phiền hơn trên Windows PC nhiều
Chính sách bình luận: Chúng tôi rất trân trọng các bình luận của bạn và cảm ơn thời gian bạn dành để chia sẻ ý tưởng và phản hồi.
Ghi chú: Những bình luận được xác định là spam hoặc chỉ mang tính quảng cáo sẽ bị xóa.
• Để cải thiện trải nghiệm bình luận, chúng tôi khuyến khích bạn tạo một tài khoản Gravatar. Thêm avatar vào tài khoản Gravatar sẽ giúp bình luận của bạn dễ nhận diện hơn đối với các thành viên khác.
• ✂️ Sao chép và 📋 Dán Emoji 💪 giúp bình luận thêm sinh động và thú vị!