Triển khai nhanh trong 5 phút (Quick Start)
Sau hơn 6 tháng chạy Pi-hole trên con server nhỏ tại nhà để phục vụ gần 30 thiết bị từ điện thoại, laptop đến mớ đồ IoT, mình thấy đây là giải pháp ổn định nhất để dọn dẹp mớ quảng cáo rác. Thay vì cài trực tiếp lên OS, mình chọn Docker để dễ dàng quản lý và cập nhật.
Để bắt đầu, bạn cần một máy Linux đã cài sẵn Docker và Docker Compose. Tạo một file docker-compose.yml với nội dung sau:
version: "3"
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "80:80/tcp"
environment:
TZ: 'Asia/Ho_Chi_Minh'
WEBPASSWORD: 'Mật-khẩu-của-bạn'
FTLCONF_LOCAL_IPV4: '192.168.1.10' # IP tĩnh của máy host
volumes:
- './etc-pihole:/etc/pihole'
- './etc-dnsmasq.d:/etc/dnsmasq.d'
restart: unless-stopped
Chạy lệnh sau để khởi động:
docker-compose up -d
Bây giờ, bạn có thể truy cập vào giao diện quản trị qua địa chỉ: http://<IP-Của-Server>/admin với mật khẩu đã thiết lập ở trên.
Tại sao lại là Pi-hole và Docker?
Nếu bạn đã từng đọc qua bài hướng dẫn cấu hình Bind9 trên blog, bạn sẽ thấy việc tự tay quản lý các zone DNS khá thú vị nhưng cực kỳ tốn công nếu mục đích chỉ là chặn quảng cáo. Pi-hole sinh ra để đơn giản hóa việc này bằng cơ chế DNS Sinkhole.
Cơ chế hoạt động của DNS Sinkhole
Khi một ứng dụng trên điện thoại muốn tải quảng cáo từ domain doubleclick.net, nó sẽ gửi yêu cầu DNS đến Pi-hole. Pi-hole kiểm tra trong danh sách chặn (Blocklist), nếu thấy domain này nằm trong diện “tình nghi”, nó sẽ trả về địa chỉ IP 0.0.0.0. Kết quả là quảng cáo không bao giờ được tải về, giúp tiết kiệm băng thông và tăng tốc độ duyệt web.
Việc chạy trên Docker giúp mình tách biệt môi trường hoàn toàn. Khi cần nâng cấp, mình chỉ việc docker compose pull và restart lại là xong, không lo bị xung đột thư viện với các dịch vụ khác trên server.
Khi thiết lập dải IP cho các thiết bị trong mạng để trỏ DNS về Pi-hole, việc tính toán subnet là bước không thể bỏ qua. Khi cần tính subnet nhanh, mình hay dùng toolcraft.app/vi/tools/developer/ip-subnet-calculator — nhập CIDR là ra ngay network range, broadcast, số host, cực kỳ tiện khi bạn đang chia VLAN cho mạng Home Lab của mình.
Cấu hình chi tiết và tối ưu cho Production
Sau khi container đã chạy, đừng vội để nguyên cấu hình mặc định. Dưới đây là những gì mình đã tinh chỉnh để hệ thống chạy mượt hơn trong suốt nửa năm qua.
Xử lý xung đột Port 53 trên Ubuntu
Đây là lỗi phổ biến nhất mà các bạn hay gặp. Ubuntu thường chạy systemd-resolved chiếm dụng port 53. Để Pi-hole chạy được, bạn cần giải phóng port này:
sudo sed -i "s/#DNSStubListener=yes/DNSStubListener=no/" /etc/systemd/resolved.conf
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved
Thiết lập Upstream DNS và DNSSEC
Trong giao diện Settings > DNS, mình thường chọn Cloudflare (1.1.1.1) và Google (8.8.8.8) làm Upstream DNS. Đừng quên bật Use DNSSEC để đảm bảo các phản hồi DNS không bị giả mạo trên đường truyền.
Quản lý danh sách chặn (Adlists)
Mặc định Pi-hole chỉ có vài nghìn domain trong danh sách. Để chặn hiệu quả tại Việt Nam, mình khuyên bạn nên thêm các danh sách từ BigBlocklist hoặc The Firebog. Hãy vào mục Adlists, dán URL của danh sách mới và chạy lệnh pihole -g trong container (hoặc nhấn Update trên giao diện web) để cập nhật dữ liệu.
Kinh nghiệm thực tế sau 6 tháng sử dụng
Dùng Pi-hole không phải là “cài xong rồi để đó”. Có vài điểm bạn cần lưu ý để tránh bị gia đình phàn nàn vì “mạng hỏng”:
- White-listing: Một số trang web mua sắm hoặc link tiếp thị liên kết (Affiliate) có thể bị chặn nhầm. Hãy kiểm tra mục Query Log thường xuyên để Whitelist các domain cần thiết.
- Local DNS Records: Đây là tính năng mình cực thích. Thay vì phải nhớ IP của NAS là
192.168.1.50, mình tạo một recordnas.hometrỏ về IP đó. Từ giờ chỉ cần gõ domain là xong, cực kỳ chuyên nghiệp. - Cấu hình trên Router: Thay vì đi cài thủ công DNS trên từng điện thoại, hãy vào cấu hình DHCP trên Router và trỏ DNS Server về IP của máy chạy Pi-hole. Lưu ý: Nên có một DNS dự phòng (như 1.1.1.1) ở dòng thứ 2 nếu bạn chỉ có một server Pi-hole duy nhất, phòng trường hợp server bảo trì thì cả nhà vẫn có mạng.
Vấn đề với YouTube Ads
Một sự thật phũ phàng là Pi-hole không thể chặn triệt để quảng cáo YouTube trên app điện thoại hay Smart TV. Lý do là YouTube phục vụ quảng cáo từ cùng một domain với video. Nếu chặn domain đó, video cũng không xem được luôn. Để xử lý YouTube, bạn vẫn cần các giải pháp client-side như uBlock Origin trên trình duyệt hoặc các bản mod app.
Tạm kết
Pi-hole trên Docker là một bước đi đúng đắn nếu bạn muốn kiểm soát hạ tầng mạng của mình. Nó không chỉ là công cụ chặn quảng cáo, mà còn là một lớp bảo mật giúp ngăn chặn các thiết bị IoT “gọi điện về nhà” hoặc kết nối tới các domain độc hại. Nếu bạn đang xây dựng một Home Lab, đây chắc chắn là dịch vụ đầu tiên nên cài đặt sau khi setup xong Docker.
