Cài đặt và cấu hình AdGuard Home trên Ubuntu để chặn quảng cáo và bảo mật DNS toàn mạng nội bộ

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Vấn đề: Quảng cáo và tracking DNS xâm nhập toàn bộ mạng nhà bạn

Mình từng cài uBlock Origin trên từng trình duyệt, từng máy — laptop, điện thoại, TV box — mà vẫn thấy quảng cáo chạy phành phạch trong app Android và Smart TV. Lý do đơn giản: extension chỉ hook vào trình duyệt, còn DNS query từ app native thì phóng thẳng ra ngoài, không có gì lọc.

Chưa kể camera IP, bóng đèn WiFi, robot hút bụi — những thứ đó âm thầm gửi telemetry về server của hãng suốt ngày. Mình từng bắt traffic một con camera Xiaomi rẻ tiền: nó query khoảng 15 domain khác nhau trong vòng 10 phút đầu khởi động. Bạn không cài được extension lên những thứ đó.

Cách duy nhất xử lý được tất cả là đặt một DNS server tự quản lý ngay trong mạng nhà, lọc query trước khi chúng đi ra ngoài. AdGuard Home làm đúng việc đó.

AdGuard Home là gì và tại sao nên chọn nó thay vì Pi-hole?

AdGuard Home là DNS sinkhole — nó đứng giữa thiết bị của bạn và DNS server thật (như 8.8.8.8), kiểm tra từng domain được query. Nếu domain đó nằm trong blocklist, nó trả về 0.0.0.0 thay vì địa chỉ thật. Quảng cáo không tải được vì domain không resolve được.

So với Pi-hole (cũng rất phổ biến), có một số thứ mình thấy AdGuard tiện hơn:

  • Tích hợp sẵn DNS-over-HTTPS (DoH) và DNS-over-TLS (DoT) — không cần cài thêm cloudflared
  • Web UI hiện đại hơn, setup qua wizard chứ không phải chỉnh config file tay
  • Hỗ trợ DHCP server tích hợp (tùy chọn)
  • Binary đơn, không kéo theo PHP hay lighttpd

Hồi mình mới chuyển từ CentOS sang Ubuntu, mất cả tuần để quen với cách apt lock version khác yum như thế nào. AdGuard Home cài theo kiểu binary nên tránh hẳn vấn đề dependency đó — chạy được trên Ubuntu 20.04, 22.04, 24.04 mà không cần lo.

Thực hành: Cài đặt AdGuard Home trên Ubuntu

Yêu cầu trước khi bắt đầu

  • Ubuntu Server 20.04/22.04/24.04 (Desktop cũng được, nhưng Server ít noise hơn)
  • IP tĩnh trong mạng LAN — bắt buộc, vì router và các thiết bị sẽ trỏ DNS về IP này
  • Port 53 chưa bị chiếm bởi systemd-resolved

Bước 1: Giải phóng port 53

Ubuntu mặc định chạy systemd-resolved lắng nghe trên 127.0.0.53:53. AdGuard Home cần cái port này. Phải tắt stub resolver trước:

# Kiểm tra xem port 53 đang bị chiếm chưa
sudo ss -tlnp | grep ':53'

# Tắt stub listener của systemd-resolved
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf

# Xóa symlink /etc/resolv.conf và tạo lại
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

# Restart service
sudo systemctl restart systemd-resolved

# Xác nhận port 53 đã trống
sudo ss -tlnp | grep ':53'

Bước 2: Tải và cài AdGuard Home

# Cách nhanh nhất — script tự detect architecture và tải binary phù hợp
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v

# Hoặc cài thủ công nếu không muốn pipe curl vào sh (an toàn hơn):
wget https://github.com/AdguardTeam/AdGuardHome/releases/latest/download/AdGuardHome_linux_amd64.tar.gz
tar -xzf AdGuardHome_linux_amd64.tar.gz
cd AdGuardHome
sudo ./AdGuardHome -s install

Script tự động tải binary, đăng ký systemd service rồi khởi động luôn. Sau khi xong, web UI chạy ở port 3000, DNS ở port 53.

Bước 3: Cấu hình qua Web UI

Mở trình duyệt, vào http://<IP_SERVER>:3000. Wizard khá thẳng:

  1. Network interfaces: Chọn interface lắng nghe DNS — thường là tất cả hoặc interface LAN. Web UI giữ port 3000 hoặc đổi sang 80 tùy thích.
  2. Tạo tài khoản admin: Đặt username/password, đừng dùng admin/admin.
  3. Sau wizard, đăng nhập rồi vào Settings → DNS settings.

Bước 4: Cấu hình Upstream DNS với DoH

Thay DNS cleartext bằng DNS-over-HTTPS để query upstream được mã hóa — ISP sẽ không đọc được bạn đang query gì:

# Trong web UI → Settings → DNS settings → Upstream DNS servers
# Xóa hết mặc định, thêm vào:
https://dns.cloudflare.com/dns-query
https://dns.google/dns-query

# Hoặc nếu muốn ưu tiên Cloudflare:
https://1.1.1.1/dns-query
https://1.0.0.1/dns-query

Tick “Load-balancing” để AdGuard tự chọn server có latency thấp nhất.

Bước 5: Thêm blocklist

Vào Filters → DNS blocklists → Add blocklist → Choose from list. Bốn list mình hay dùng:

  • AdGuard DNS filter — list chính thức, ít false positive nhất
  • EasyList — quảng cáo web phổ biến
  • EasyPrivacy — tracking scripts
  • Malware Domain List — chặn domain phát tán malware

Click Update để tải về. Bốn list này gộp lại khoảng 500k–800k domain bị chặn — đủ dùng mà false positive vẫn ở mức chấp nhận được.

Bước 6: Trỏ DNS của router về AdGuard Home

Đây là bước mấu chốt. Thay vì cấu hình từng thiết bị, trỏ DNS server trong DHCP settings của router — tất cả thiết bị nhận IP mới sẽ tự dùng AdGuard:

# Ví dụ cấu hình router (tùy firmware):
# Primary DNS: 192.168.1.x  (IP của máy Ubuntu chạy AdGuard)
# Secondary DNS: 1.1.1.1    (fallback nếu AdGuard down)

# Test ngay trên máy Ubuntu trước khi đổi router:
sudo resolvectl dns eth0 127.0.0.1
sudo resolvectl domain eth0 ~.

# Kiểm tra query có đi qua AdGuard không:
dig @127.0.0.1 doubleclick.net
# Trả về 0.0.0.0 là đang chặn đúng

Bước 7: Cấu hình tường lửa

# Mở port DNS và Web UI
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 3000/tcp   # Web UI (hoặc 80 nếu đổi)

# Nếu dùng DoT (DNS-over-TLS):
sudo ufw allow 853/tcp

sudo ufw reload

Kiểm tra hoạt động

Sau khi router cấp DHCP với DNS mới, vào tab Dashboard sẽ thấy query log chạy realtime. Mở một trang nhiều quảng cáo và quan sát — domain của ad network sẽ hiện với status Blocked.

# Test nhanh từ terminal:
nslookup ads.google.com 192.168.1.x
# → Server: 192.168.1.x
# → Address: 0.0.0.0  ← bị block

nslookup github.com 192.168.1.x
# → Server: 192.168.1.x
# → Address: 20.207.73.82  ← resolve bình thường

Xử lý false positive — whitelist domain bị chặn nhầm

Một số CDN hay API endpoint đôi khi bị chặn nhầm. Vào Filters → Custom filtering rules và thêm exception bằng cú pháp AdBlock:

# Format whitelist trong Custom rules:
@@||domain.com^          # Cho phép toàn bộ domain
@@||sub.domain.com^      # Chỉ cho phép subdomain cụ thể

# Ví dụ thực tế hay bị chặn nhầm:
@@||cdn.jsdelivr.net^
@@||fonts.googleapis.com^

Kết luận

Cái hay của AdGuard Home là nó chặn ở tầng thấp hơn extension trình duyệt rất nhiều — ngay tại DNS, trước khi thiết bị kịp gửi một byte nào đến server quảng cáo. Một lần cài, toàn mạng nhà — Smart TV, camera IP, điện thoại Android — đều được lọc mà không cần đụng vào từng thiết bị.

Tính trước một việc: AdGuard Home cần máy chủ chạy 24/7. Raspberry Pi 4 tiêu khoảng 3–5W là lý tưởng, hoặc dùng VM nhỏ trên NAS cũng được. Quan trọng là luôn đặt secondary DNS là 1.1.1.1 hoặc 8.8.8.8 trong router — nếu máy chủ down mà không có fallback, cả nhà mất Internet.

Share: