Cấu hình ban đầu
Để bắt đầu, chúng ta sẽ tạo một VPS mới hoàn toàn sạch sẽ, chưa có bất kỳ cài đặt nào, chạy trên hệ điều hành Debian 13. Bạn có thể sử dụng tính năng reinstall để đưa VPS về trạng thái ban đầu.
- Nếu bạn đã cài đặt Docker và Docker Compose, có thể bỏ qua bước chuẩn bị dưới đây.
wget -qO vps.sh https://go.bibica.net/ubuntu-22-04-basic-optimization && sudo bash vps.sh
Việc thiết lập ban đầu này sẽ đảm bảo môi trường làm việc sạch sẽ và sẵn sàng cho các bước cài đặt tiếp theo.
Cấu hình AdGuard Home và Caddy
Để bắt đầu, bạn cần tạo một thư mục riêng cho AdGuard Home và Caddy. Điều này giúp việc quản lý và sao lưu dữ liệu trở nên dễ dàng hơn.
- Tạo thư mục
/home/adguardhome
và di chuyển vào thư mục đó:mkdir /home/adguardhome cd /home/adguardhome
- Tạo file
compose.yml
và chỉnh sửa nội dung:nano compose.yml
Nội dung của file compose.yml
như sau:
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
Lưu và thoát bằng cách nhấn Ctrl+O
, Enter
, Ctrl+X
.
Cấu hình Caddyfile
Tiếp theo, bạn cần tạo file Caddyfile
để cấu hình Caddy.
nano Caddyfile
Nội dung của file Caddyfile
như sau:
:80 {
respond "Hello, world!"
}
# Import các file cấu hình riêng
import /domain-config/*.conf
Lưu và thoát bằng cách nhấn Ctrl+O
, Enter
, Ctrl+X
.
Tạo tài khoản quản trị
- Khởi chạy dịch vụ: Chạy lệnh sau để hoàn thành cài đặt:
docker compose up -d --build --remove-orphans --force-recreate
- Truy cập AdGuard Home: Mở trình duyệt và truy cập vào địa chỉ
IP:3000
(ví dụ:64.181.123.123:3000
) để bắt đầu quá trình cấu hình AdGuard Home.
- Thực hiện theo hướng dẫn, tạo tài khoản quản trị với username và password mong muốn.
- Cấu hình domain: Tạo một sub domain (ví dụ:
adguard.bibica.net
) để truy cập vào AdGuard Home.
- Tạo file cấu hình cho domain:
nano domain-config/bibica.net.conf
Nội dung file như sau:
adguard.bibica.net {
reverse_proxy adguardhome:80 {
header_up X-Forwarded-For {header.X-Forwarded-For}
}
}
- Lưu và thoát.
- Cấu hình AdGuard Home: Mở file cấu hình của AdGuard Home:
nano /home/adguardhome/adguard/config/AdGuardHome.yaml
Tìm đến phần trusted_proxies
và thêm vào dòng mới:
trusted_proxies:
- 127.0.0.0/8
- ::1/128
- 172.16.0.0/12
- Thêm dòng mới tại đây
- Lưu và thoát.
- Cấu hình Cloudflare: Thêm A Records cho sub domain tại Cloudflare và bật proxy status.
- Khởi động lại dịch vụ: Chạy lệnh sau để khởi động lại các container:
docker compose stop && docker compose start
Chờ một chút để Caddy tạo SSL certificate, sau đó bạn có thể truy cập vào AdGuard Home bằng sub domain đã cấu hình.
Cấu hình AdGuard Home
Để cấu hình AdGuard Home hiệu quả, bạn cần thực hiện các bước sau:
- Thêm bộ lọc chặn quảng cáo:
- Truy cập vào phần Filters → DNS Blocklists để thêm các bộ lọc cần thiết.
- Sử dụng các bộ lọc cơ bản như
AdGuard DNS filter
vàVNM: ABPVN List
để bắt đầu. Đây là những bộ lọc nhẹ và hiệu quả, giúp giảm thiểu vấn đề chặn nhầm các trang web.
- Tạo bộ lọc tùy chỉnh:
- Nếu cần chặn thêm các domain cụ thể, bạn có thể tạo bộ lọc ngoài trên GitHub. Ví dụ, bạn có thể tạo danh sách chặn cho domain của Cốc Cốc và MSN.
- Để thêm domain vào danh sách cho phép (Allowlist), bạn có thể chỉnh sửa trực tiếp trong phần Filters → Custom filtering rules. Ví dụ, thêm
@@||umami.is^
để cho phép domainumami.is
.
- Quản lý Allowlist:
- Nếu cần quản lý nhiều domain trong danh sách cho phép, bạn có thể tạo một bộ lọc ngoài trên GitHub và thêm vào phần Filters → DNS allowlists. Điều này giúp bạn dễ dàng chỉnh sửa danh sách mà không cần truy cập vào giao diện quản trị.
Cấu hình Upstream DNS servers
- Cấu hình DNS upstream:
- Truy cập vào Settings → DNS Settings và thêm các Upstream DNS servers như 1.1.1.1 và 8.8.8.8.
- Sử dụng các DNS upstream an toàn và nhanh chóng sẽ giúp cải thiện hiệu suất. Trung bình, thời gian xử lý có thể nằm trong khoảng 1ms – 5ms.
- Lựa chọn DNS upstream:
- Bạn có thể sử dụng một DNS upstream duy nhất như 1.1.1.1 để đảm bảo sự ổn định. Việc sử dụng nhiều DNS upstream cùng lúc có thể gây ra tình trạng mất ổn định khi có quá nhiều request cùng lúc.
Cấu hình Máy chủ DNS Xuôi dùng cho cá nhân:
Cấu hình đang được sử dụng hàng ngày cho các dịch vụ DNS cá nhân.
- Do sử dụng rộng rãi các dịch vụ của Cloudflare, đã dùng Cloudflare DNS nhiều năm và rất hài lòng, nên lựa chọn nó làm DNS chính cho mọi trang web.
- Sử dụng Cloudflare Gateway, tạo ra một vị trí DNS 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
Trong thực tế sử dụng, nếu người dùng dùng IPv6, ở một 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ả các máy chủ DNS Xuôi, 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 máy chủ DNS Xuôi sẽ hiệu quả hơn). - Fallback DNS servers (chỉ sử dụng nếu máy chủ DNS Xuôi 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 của máy chủ DNS Xuôi 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
Cấu hình máy chủ DNS:
- Rate limit:
20
(mặc định 20 là đủ cho sử dụng bình thường, có thể 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).
Cấu hình bộ nhớ đệm DNS:
- 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 một domain mới hoàn toàn, user mới thấy chậm một 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.
Cài đặt chung:
- Filter update interval:
1 hour
(thời gian cập nhật các bộ lọc, có thể tắt vì tính năng này sử dụng RAM rất nhiều).
Cấu hình Encryption Settings
Cấu hình quan trọng để kích hoạt DNS over HTTPS tự động
Để hoàn tất quá trình thiết lập DNS over HTTPS tự động, bước cấu hình Encryption settings là cực kỳ quan trọng. Hãy thực hiện theo các bước sau:
- Truy cập vào mục Settings và chọn Encryption settings
- Kích hoạt tùy chọn Enable Encryption (HTTPS, DNS-over-HTTPS, and DNS-over-TLS)
- Kích hoạt tùy chọn Enable plain DNS
- Nhập Server name: Ví dụ
adguard.bibica.net
- Thiết lập HTTPS port:
443
- Để DNS-over-TLS port và DNS-over-QUIC port là
0
(hoặc để trống)
Cấu hình Certificates
Tùy thuộc vào subdomain bạn sử dụng, hãy truy cập đường dẫn /home/adguardhome/caddy_data/caddy/certificates/
trên VPS để tìm các khóa SSL .crt
và .key
do Caddy tạo ra. Đường dẫn chi tiết sẽ có dạng:
/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
Tiếp theo, mở file cấu hình gốc của AdGuardHome bằng lệnh:
nano /home/adguardhome/adguard/config/AdGuardHome.yaml
Kéo xuống phần tls
và kiểm tra các thông số:
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
Sửa dòng allow_unencrypted_doh: false
thành allow_unencrypted_doh: true
để cho phép DNS over HTTPS không mã hóa.
Cuối cùng, khởi động lại AdGuard Home để các thay đổi có hiệu lực:
docker restart adguardhome
Sau khi hoàn tất, truy cập vào đường dẫn https://adguard.bibica.net/dns-query
để kiểm tra. Nếu thấy thông báo Bad Request
, nghĩa là việc cài đặt đã chính xác.
Xác minh cấu hình hiện tại
Cấu hình hiện tại sử dụng AdGuard Home DoH chạy trên Docker, kết hợp với Caddy làm reverse proxy. Điều này giúp không cần mở thêm bất kỳ port nào ngoài port đã được cấu hình ban đầu. Ngoài ra, IP server được ẩn đi thông qua Cloudflare, giúp tăng cường bảo mật. Logs của clients được lưu trữ theo IP của Docker, giúp tăng thêm sự an tâm cho người dùng.
Sau này, nếu cần chuyển server chạy AdGuard Home, chỉ cần sao chép thư mục /home/adguardhome/
sang server mới là đủ, mà không cần phải sửa lại IP trong cấu hình domain.
Khi chạy, AdGuard Home và Caddy sử dụng ban đầu khoảng 80MB RAM, và CPU được sử dụng không đáng kể. Dung lượng HDD ghi xuống phụ thuộc vào số lượng user sử dụng. Trong 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. Sau khi chạy ổn định, có thể tắt ghi log đi để giảm tải.
Cấu hình Docker cho AdGuard Home và Caddy đã được điều chỉnh để AdGuard Home có thể đọc trực tiếp 2 khóa SSL .crt
và .key
được tạo ra từ Caddy. Sau 90 ngày, khi SSL hết hạn và Caddy renew, AdGuard Home sẽ tự động đọc được cấu hình mới mà không cần điều chỉnh thủ công.
Nếu đã có sẵn Caddy, Nginx hay một dịch vụ khác làm Reverse Proxy, chỉ cần sửa lại cấu hình một chút là có thể sử dụng được.
Xử lý sự cố
Tham khảo thêm thông tin tại Cloudflare Gateway để biết thêm chi tiết.
Hiệu Năng của Hệ Thống DNS-over-HTTPS
Khi triển khai AdGuard Home trên VPS tại Singapore, hiệu năng phân giải DNS cho người dùng tại Việt Nam cho kết quả chính xác. Tuy nhiên, khi sử dụng VPS tại Mỹ, vẫn có một số kết nối đi qua Mỹ, điều này có thể do nhiều yếu tố như Cloudflare, nhà mạng hoặc trang web được kết nối. Một giải pháp đơn giản là sử dụng VPS gần với người dùng nhất để tránh các vấn đề về định tuyến.
Khi sử dụng DoH qua AdGuard Home, hiệu năng phân giải DNS không ảnh hưởng nhiều vì chỉ kiểm tra ở lần truy cập đầu tiên. Các lần truy cập sau sẽ sử dụng cache cũ, giúp tăng hiệu quả. Tuy nhiên, hiệu năng có thể bị ảnh hưởng bởi các domain sử dụng dịch vụ DNS tại Việt Nam.
- Lần đầu truy cập có thể mất ~ 370ms
- Các lần sau khi đã có cache giảm xuống còn ~ 190ms
Sử dụng thực tế cho thấy sau lần đầu tiên (~200ms), các lần sau chỉ mất ~ 1ms-2ms nhờ vào bộ nhớ cache của trình duyệt. Một số domain như medium.com có thể cần cấu hình DNS rewrites để hoạt động bình thường.
Cấu Hình DNS-over-HTTPS cho Các Trình Duyệt
Để cấu hình DoH với AdGuard Home, người dùng có thể thực hiện các bước sau trên các trình duyệt di động như Chromium, Cốc Cốc, Edge:
- Vào Settings → Privacy and security → Security
- Cuộn xuống phần Advanced
- Tìm Use secure DNS → Enable
- Chọn With Custom
- Nhập:
https://adguard.bibica.net/dns-query
Người dùng có thể tham khảo thêm nhiều endpoint DoH khác tại đây.
Cấu Hình DNS-over-HTTPS cho iOS và iPadOS
Trên iOS và iPadOS, người dùng có thể tải profile cấu hình sẵn và cài đặt tương tự như NextDNS. Kết quả thử nghiệm cho thấy AdGuard Home hoạt động hiệu quả, cho phép tùy chỉnh các domain cần chặn, rất phù hợp cho thiết bị di động.