Pi-hole trên Synology bằng Docker: chặn ads cả mạng

Pi-hole trên Synology bằng Docker: chặn ads cả mạng

Nói ngắn gọn: Pi-hole là một DNS sinkhole — nghe đao to búa lớn vậy thôi, thực chất nó chỉ là một máy chủ DNS "biết nói không". Mỗi lần thiết bị trong nhà định load quảng cáo hay lén gửi dữ liệu track

Pi-hole là gì mà dân NAS ai cũng nhắc?

Nói ngắn gọn: Pi-hole là một DNS sinkhole — nghe đao to búa lớn vậy thôi, thực chất nó chỉ là một máy chủ DNS "biết nói không". Mỗi lần thiết bị trong nhà định load quảng cáo hay lén gửi dữ liệu tracking về đâu đó, nó phải hỏi DNS trước: "domain này ở đâu?". Pi-hole đứng giữa, trả lời thẳng "không có đâu" cho các domain quảng cáo/tracker, request chết yểu trước khi kịp bắn ra Internet.

Khác hẳn mấy extension chặn quảng cáo kiểu uBlock Origin — thứ chỉ chặn được trên trình duyệt đã cài nó — Pi-hole chặn ở tầng mạng. Chỉ cần đổi DNS server cho cả nhà trỏ về Pi-hole, mọi thiết bị đều được hưởng: điện thoại, laptop, Smart TV, kể cả cái loa thông minh chẳng ai rảnh đi cài app riêng cho nó.

Pi-hole làm được gì cụ thể:

  • Chặn quảng cáo và tracker cho toàn bộ mạng từ một điểm duy nhất trên NAS, không cần đụng vào từng thiết bị
  • Chặn được quảng cáo trong app di động và Smart TV — chỗ mà trình duyệt adblock bó tay
  • Dashboard thống kê real-time: bao nhiêu query DNS, tỷ lệ % bị chặn, domain nào bị chặn nhiều nhất, thiết bị nào "gọi điện" nhiều nhất
  • Whitelist/blacklist theo domain hoặc regex, phòng khi chặn nhầm trang cần dùng

Vài tình huống hay gặp: nhà có cái Android TV Box coi phim lậu quảng cáo dày đặc — không app adblock trình duyệt nào chặn nổi, chỉ Pi-hole ở tầng DNS mới trị được. Hoặc bạn để ý con camera an ninh, cái loa thông minh cứ âm thầm gọi về server hãng, muốn chặn bớt cho yên tâm privacy. Hoặc đơn giản nhà đông người, chẳng ai rảnh cài extension cho từng máy của từng người — Pi-hole giải quyết một lần cho tất cả.

Điểm cần nhớ: Pi-hole không thay được uBlock Origin hoàn toàn. Quảng cáo pre-roll nhúng thẳng trong video YouTube thì Pi-hole chịu, vì nó không chặn ở tầng nội dung được. Hai thứ này bổ sung cho nhau, không thay thế nhau.

Sơ đồ Pi-hole chặn quảng cáo và tracker ở tầng DNS cho toàn mạng

Vì sao chọn Docker + network_mode: host

Nói thẳng luôn: Synology không có package Pi-hole chính thức, SynoCommunity cũng không. Muốn cài, Docker qua Container Manager (DSM 7.2.1 trở lên) là đường duy nhất — không phải "chọn cho vui" giữa cả rừng lựa chọn.

Trong Docker cũng có hai cách setup mạng: macvlan (cấp IP riêng cho Pi-hole, tách hẳn khỏi NAS) hoặc network_mode: host (Pi-hole dùng chung IP với NAS). Macvlan đúng chuẩn hơn về kỹ thuật, thống kê theo thiết bị cũng chính xác hơn — nhưng để tạo network macvlan bạn phải mở Terminal chạy lệnh docker network create, và có một cái dở: NAS sẽ không tự dùng được chính Pi-hole đó làm DNS của mình nữa.

Bài này đi theo network_mode: host — dán thẳng docker-compose vào Container Manager, không cần mở Terminal câu lệnh nào cả. Đơn giản hơn hẳn mà vẫn chặn ads ngon lành cho cả nhà. Muốn lên đời macvlan thì để cuối bài, phần nâng cao.

Tiêu chíMacvlannetwork_mode: host
Cần mở Terminal, gõ lệnh
IP riêng cho Pi-hole✗ (dùng chung IP NAS)
NAS tự dùng Pi-hole làm DNS
Thống kê chính xác theo thiết bị
Dễ cài qua Container Manager

Chuẩn bị trước khi cài

  • DSM 7.2.1 trở lên, đã cài package Container Manager (vào Package Center gõ tìm là ra)
  • NAS chưa bật package DNS Server hoặc DHCP Server của Synology — hai ông này chiếm port 53, để yên sẽ đá nhau với Pi-hole
  • Quyền truy cập router để đổi DNS server phát cho các thiết bị trong nhà (bước cuối cùng)

Các bước cài Pi-hole qua Container Manager

Bước 1: Tạo thư mục chứa cấu hình

Mở File Station, vào thư mục docker (chưa có thì tạo mới), tạo tiếp cấu trúc:

/volume1/docker/pihole/pihole
/volume1/docker/pihole/dnsmasq.d

Hai thư mục này giữ toàn bộ cấu hình, blacklist, log của Pi-hole. Xoá container thì cài lại vẫn giữ nguyên data, vì nó nằm ngoài container.

Bước 2: Mở Firewall cho port 53

Vào Control Panel → Security → Firewall, tạo rule cho phép Custom Port 53 (chọn All protocol — vì DNS chạy cả TCP lẫn UDP), và port dashboard bạn định dùng (ví dụ 8080). Bỏ qua bước này thì DNS từ máy khác trong mạng gõ vào NAS sẽ bị chặn ngay ở tường lửa. Cài xong tưởng lỗi Docker, hoá ra lỗi firewall — khá nhiều người dính vụ này.

Bước 3: Kiểm tra port có đang bị chiếm không

Vào Package Center xem có đang chạy package DNS Server không — có thì gỡ hoặc dừng trước, vì nó cũng nghe port 53 y hệt Pi-hole. Kiểm tra luôn port 80: DSM và Web Station thường chiếm sẵn port này rồi, nên Pi-hole phải dùng port khác cho dashboard (bài này chọn 8080).

Bước 4: Tạo Project trong Container Manager

Mở Container Manager → Project → Create. Đặt tên project (ví dụ pihole), chọn đường dẫn /docker/pihole vừa tạo ở Bước 1. Ở phần nguồn, chọn Create docker-compose.yml rồi dán đoạn YAML sau:

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    network_mode: host
    environment:
      TZ: 'Asia/Ho_Chi_Minh'
      FTLCONF_webserver_api_password: 'DatMatKhauManhOday'
      FTLCONF_webserver_port: '8080'
      FTLCONF_dns_listeningMode: 'all'
      PIHOLE_UID: '1000'
      PIHOLE_GID: '1000'
    volumes:
      - '/volume1/docker/pihole/pihole:/etc/pihole:rw'
      - '/volume1/docker/pihole/dnsmasq.d:/etc/dnsmasq.d:rw'
    cap_add:
      - NET_ADMIN
      - SYS_TIME
      - SYS_NICE
    restart: unless-stopped

Vài chỗ cần sửa đúng cho máy bạn trước khi bấm Next:

  • FTLCONF_webserver_api_password: đổi thành mật khẩu thật của bạn, đừng để nguyên chữ mẫu — đây là mật khẩu admin điều khiển toàn bộ DNS mạng nhà bạn, không phải chuyện đùa.
  • PIHOLE_UID/PIHOLE_GID: đây là ID user chạy Docker trên DSM. SSH vào NAS gõ lệnh id là ra ngay hai số này. Chưa biết cũng bình thường, ai cũng phải tra lần đầu — cứ để mặc định 1000/1000 nếu dùng user Docker mặc định, sai thì Pi-hole báo permission denied ở log, lúc đó quay lại sửa cũng chưa muộn.
  • FTLCONF_webserver_port: đổi 8080 thành port khác nếu nhà bạn đang dùng 8080 cho việc khác rồi.

Bấm Next → Done để build và chạy container. Container Manager tự pull image pihole/pihole:latest (bản Pi-hole v6.4.3 tại thời điểm viết bài) về và khởi động.

Bước 5: Đăng nhập dashboard

Mở trình duyệt, gõ http://<IP-NAS>:8080/admin, đăng nhập bằng mật khẩu đã đặt ở FTLCONF_webserver_api_password. Thấy dashboard hiện ra là container chạy đúng rồi.

Bước 6: Trỏ DNS cả nhà về Pi-hole

Đây mới là bước biến Pi-hole từ "cái dashboard đẹp" thành "công cụ chặn ads thật". Vào trang quản trị router, tìm mục cấu hình DHCP, đổi DNS server (Primary) trỏ về IP của NAS. Phần Secondary, nếu router cho đặt, nên đặt trùng luôn IP NAS — nhiều người chỉ đổi Primary, để Secondary là DNS công cộng mặc định của nhà mạng. Kết quả: thiết bị âm thầm bỏ qua Pi-hole, hỏi thẳng DNS ngoài mỗi khi Primary hơi chậm một nhịp. Chặn quảng cáo mà vẫn thấy ads là ở chỗ này đấy.

Đổi xong, reboot router hoặc ít nhất renew DHCP lease trên một thiết bị test (rút mạng cắm lại, tắt bật Wi-Fi) để nó nhận DNS mới. Vào lại dashboard Pi-hole, thấy số query DNS tăng lên là ổn.

Kiểm tra đã chạy đúng chưa

Cách nhanh nhất: mở dashboard, xem tab Query Log hoặc biểu đồ tổng quan — thấy tên thiết bị (điện thoại, TV...) xuất hiện với số query tăng dần là DNS đã đi qua Pi-hole. Lướt vài trang có quảng cáo, xem tỷ lệ % Blocked có nhích lên không.

Gặp trang bị chặn nhầm (whitelist thiếu), vào tab Domains trên dashboard, thêm domain đó vào Whitelist. Ngược lại muốn chặn thêm domain nào thì thêm vào Blacklist, hoặc dùng regex nếu muốn chặn cả một nhóm subdomain.

Lỗi hay gặp khi cài

  • Container báo lỗi bind port 53 ("Address already in use"): gần như chắc chắn do package DNS Server hoặc DHCP Server của Synology đang chạy song song. Vào Package Center gỡ hoặc dừng nó, rồi restart lại container Pi-hole.
  • Port 80 xung đột với DSM/Web Station: network_mode host nghĩa là Pi-hole "mượn" port trực tiếp của NAS, mà port 80 DSM đã giữ sẵn từ trước. Đừng cố tranh giành, đổi FTLCONF_webserver_port sang port khác (8080 chẳng hạn) là xong, đỡ mất công debug.
  • Dùng nhầm env var đời cũ: tìm hướng dẫn cũ trên mạng thấy ghi WEBPASSWORD thì bỏ qua luôn — đó là scheme của Pi-hole v5. Image v6 hiện tại dùng FTLCONF_webserver_api_password, đặt WEBPASSWORD vào chả có tác dụng gì, đăng nhập dashboard cứ báo sai mật khẩu hoài mà không hiểu vì sao.
  • Lỗi ghi permission denied vào /etc/pihole trong log container: do PIHOLE_UID/PIHOLE_GID không khớp với user thực chạy Docker trên DSM. SSH gõ id lấy đúng số rồi sửa lại trong compose, restart project.
  • Router chỉ cho set 1 DNS server, không có Secondary riêng: rủi ro là khi Pi-hole down (NAS update, reboot...), thiết bị tự fallback sang DNS công cộng và mất luôn khả năng chặn ads — coi như "vô hiệu hoá" tạm thời mà bạn không hay. Nên test kỹ trường hợp tắt Pi-hole xem mạng có còn chạy được không, và cấu hình fallback DNS ngay trong Pi-hole (nói ở phần dưới) để giảm downtime.

Tùy chọn nâng cao (không bắt buộc)

Phần này dành cho ai muốn vọc thêm, bỏ qua cũng không sao — Pi-hole cài theo hướng dẫn trên đã chạy tốt cho nhu cầu gia đình phổ thông rồi.

  • Macvlan network: cấp IP riêng hẳn cho Pi-hole thay vì dùng chung IP NAS. Thống kê theo thiết bị chính xác hơn (mỗi thiết bị hiện đúng tên thay vì gộp chung), nhưng phải mở Terminal chạy docker network create để tạo network, và NAS sẽ không tự dùng được Pi-hole làm DNS của chính nó — phải cấu hình DNS riêng cho NAS. Hợp với người đã quen SSH.
  • Unbound làm resolver DNS đệ quy riêng: thay vì Pi-hole forward request lên DNS ngoài (Cloudflare, Google...), Unbound tự tra cứu trực tiếp từ root DNS server. Tăng privacy, giảm phụ thuộc bên thứ ba, nhưng phải chạy thêm một container nữa và cấu hình Pi-hole trỏ upstream về Unbound.
  • Bật DHCP Server tích hợp trong Pi-hole: chỉ cần thiết khi router không cho tùy chỉnh DNS server qua DHCP (một số router ISP cấp bị khoá tính năng này). Lúc đó để Pi-hole tự phát DHCP luôn, không cần qua router nữa. Muốn dùng thì thêm port 67/udp vào compose và cấp thêm quyền NET_ADMIN (đã có sẵn trong file mẫu trên).

Bảo mật và bảo trì

Đừng bao giờ mở port dashboard (80/8080) ra Internet qua port forwarding. Dashboard Pi-hole không có 2FA mặc định, ai mò ra được là chiếm luôn quyền điều khiển DNS cả nhà bạn. Chỉ nên truy cập trong LAN, muốn xem từ ngoài thì đi qua VPN.

Mật khẩu FTLCONF_webserver_api_password nên đặt dài và khó đoán — nó bảo vệ toàn bộ cấu hình DNS mạng, không phải mật khẩu Wi-Fi để đọc cho khách qua chơi.

Vì Pi-hole giờ là điểm DNS duy nhất của cả nhà, NAS mà tắt hoặc restart để update là cả nhà mất mạng ngay lập tức — single point of failure đúng nghĩa. Vào Settings → DNS → Upstream trong Pi-hole, cấu hình sẵn vài DNS upstream dự phòng (Cloudflare 1.1.1.1, Google 8.8.8.8...) để giảm gián đoạn khi FTL service tự restart giữa chừng. Cân nhắc bật thêm DNSSEC trong Settings để chống DNS spoofing/cache poisoning — bật một lần, khỏi phải nghĩ lại.

Cuối cùng: backup thư mục /volume1/docker/pihole theo lịch Hyper Backup như mọi dữ liệu quan trọng khác trên NAS. Config blacklist/whitelist gầy dựng cả năm mà mất vì ổ cứng die không backup thì đúng là buồn hơn cả bị dính quảng cáo.

Mua NAS chính hãng

Xem tất cả →

Thiết bị NAS Synology & ổ cứng chính hãng Nhật Bản — tư vấn cấu hình, lắp đặt và bảo hành. Mua qua Shopee, giao toàn quốc.

No comments yet