Để chặn quảng cáo cho mạng nội bộ, bên cạnh AdGuard Home mình đã chia sẻ trước đây, chúng ta còn có một công cụ khác mạnh mẽ không kém: Pi-hole. Trên thực tế mình sử dụng Pi-hole trước, rồi sau đó mới chuyển qua dùng AdGuard Home.
Pi-hole tuy có giao diện không thân thiện, dễ dùng như AdGuard Home nhưng bù lại ưu điểm có thể kết hợp với Unbound và WireGuard VPN để tạo thành combo truy cập mạng bảo mật tối ưu. Các bạn có thêm tham khảo thêm về WireHole-UI, bộ công cụ Pi-hole + Unbound + WireGuard VPN mình đã chia sẻ trước đây
Nếu cần cài đặt Pi-hole trên Raspberry Pi hay máy ảo trong nhà để chặn quảng cáo, bạn không cần dùng đến WireHole-UI, mà chỉ cần cài đặt Pi-hole trực tiếp trên Docker. Hoặc nếu muốn tăng bảo mật và riêng tư thì có thể cài thêm Unbound.
Bài viết này sẽ hướng dẫn bạn cách cài đặt Pi-hole và Unbound để chặn quảng cáo cho mạng nội bộ trong nhà.
Yêu cầu hệ thống:
- Máy tính / máy ảo / Raspberry Pi cài đặt hệ điều hành Ubuntu / Debian / Arch / …
- Máy đã được cài đặt Docker và Docker-Compose.
Mục Lục
I. Cài đặt Pi-hole bằng Docker
Bạn có thể cài đặt Pi-hole trực tiếp lên hệ điều hành bằng 1 dòng lệnh như sau
curl -sSL https://install.pi-hole.net | bash
Code language: Nginx (nginx)
Tuy nhiên, mình thích cài đặt bằng Docker cho nhanh gọn, dễ quản lý hệ thống.
Truy cập SSH vào máy tính và tạo thư mục pihole
mkdir ~/pihole
cd ~/pihole
Code language: Bash (bash)
Tạo file docker-compose.yml
để cấu hình Pi-hole
nano docker-compose.yml
Code language: CSS (css)
Nhập vào nội dung sau và lưu lại: bấm Ctrl-O, rồi Ctrl-X
version: "3"
# More info at https://github.com/pi-hole/docker-pi-hole/ and https://docs.pi-hole.net/
services:
pihole:
container_name: pihole
image: pihole/pihole:latest
ports:
- "53:53/tcp"
- "53:53/udp"
- "67:67/udp"
- "80:80/tcp"
environment:
TZ: 'Asia/Ho_Chi_Minh'
WEBPASSWORD: 'thuanbuidepchai'
# Volumes store your data between container upgrades
volumes:
- './etc-pihole/:/etc/pihole/'
- './etc-dnsmasq.d/:/etc/dnsmasq.d/'
# Recommended but not required (DHCP needs NET_ADMIN)
# https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
cap_add:
- NET_ADMIN
restart: unless-stopped
Code language: YAML (yaml)
Bạn cần chú ý sửa lại thông số WEBPASSWORD
– mật khẩu để đăng nhập vào trang quản lý của Pi-hole.
Kích hoạt Pi-hole bằng lệnh docker-compose
docker-compose up -d
Chờ vài phút để hệ thống tải Docker image của Pi-hole và khởi động.
Bạn sử dụng trình duyệt để truy cập vào trang quản lý của Pi-hole theo địa chỉ IP của máy tính đang dùng: http://<IP-server>/admin
Bấm vào mục Login ở menu bên trái, sau đó nhập mật khẩu bạn đã chọn ở mục WEBPASSWORD
ở bước trên để đăng nhập vào trang quản trị.
Sửa lỗi fail to bind on port 53
Nhiều khả năng khi cài đặt trên Ubuntu, bạn sẽ bị báo lỗi fail to bind on port 53. Lý do là vì đã có dịch vụ systemd-resolved
đang sử dụng port 53 này. Bạn tắt dịch vụ này đi và deploy lại là được.
sudo mkdir -p /etc/systemd/resolved.conf.d/
sudo nano /etc/systemd/resolved.conf.d/adguardhome.conf
Code language: Nginx (nginx)
Điền vào nội dung sau
[Resolve]
DNS=127.0.0.1
DNSStubListener=no
Bấm CTRL + O để lưu lại và bấm CTRL + X để thoát ra
Tiếp theo chạy lệnh này để cập nhật thông số và khởi động lại systemd-resolved
sudo mv /etc/resolv.conf /etc/resolv.conf.backup
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved
Code language: Dockerfile (dockerfile)
Port 53 giờ đã được trả tự do để bạn cài đặt Pi-hole. Bạn có thể kiểm tra lại bằng lệnh
sudo lsof -i :53
Code language: CSS (css)
Nếu không thấy kết quả nào trả lại nghĩa là port 53 đã được tự do.
II. Cấu hình Pi-hole
Mặc định sau khi cài đặt xong, Pi-hole đã có thể hoạt động được ngay. Bạn có thể truy cập vào Router để chỉnh lại DNS theo IP của máy tính đang cài Pi-hole.
Nếu muốn cấu hình chi tiết hơn, bạn có thể bấm vào nút Settings để thay đổi Upstream DNS (Google, Cloudflare,…), DHCP, …
Nếu muốn sử dụng Pi-hole làm DHCP Server, bạn bấm qua tab DHCP và cấu hình theo thiết lập mong muốn.
Nếu muốn thêm danh sách chặn quảng cáo, truy cập vào mục Group Management –> Adlist, rồi cấu hình trong đây.
III. Cài đặt Pi-hole + Unbound
Trong trường hợp muốn kết hợp Pi-hole và Unbound để tăng tính bảo mật và riêng tư khi kết nối mạng, chúng ta sẽ sử dụng docker-pihole-unbound. Tham khảo thêm về lợi ích khi sử dụng thêm Unbound ở đây.
Cấu hình pihole-unbound dưới đây đã bao gồm sẵn Pi-Hole. Do đó, trước khi thực hiện, bạn cần tạm ngưng dịch vụ Pi-Hole đã cài đặt ở trên bằng cách gõ lệnh docker-compose down
trong thư mục chứa file docker-compose.yml của Pi-Hole. Nếu không, bạn sẽ gặp lỗi Bind for 0.0.0.0:443 failed: port is already allocated
khi kích hoạt pihole-unbound.
Tạo thư mục mới pihole-unbound
để dễ quản lý và tạo file docker-compose.yml
mới
mkdir ~/pihole-unbound
cd ~/pihole-unbound
nano docker-compose.yml
Code language: Bash (bash)
Nhập vào nội dung như sau và lưu lại
version: '2'
services:
pihole:
container_name: pihole
image: cbcrowe/pihole-unbound:latest
hostname: ${HOSTNAME}
domainname: ${DOMAIN_NAME}
ports:
- 443:443/tcp
- 53:53/tcp
- 53:53/udp
- 80:80/tcp
# - 5335:5335/tcp # Uncomment to enable unbound access on local server
# - 22/tcp # Uncomment to enable SSH
environment:
ServerIP: ${ServerIP}
TZ: ${TZ}
WEBPASSWORD: ${WEBPASSWORD}
#REV_SERVER: ${REV_SERVER}
#REV_SERVER_TARGET: ${REV_SERVER_TARGET}
#REV_SERVER_DOMAIN: ${REV_SERVER_DOMAIN}
#REV_SERVER_CIDR: ${REV_SERVER_CIDR}
DNS1: 127.0.0.1#5335 # Hardcoded to our Unbound server
DNS2: 127.0.0.1#5335 # Hardcoded to our Unbound server
DNSSEC: "true" # Enable DNSSEC
volumes:
- ./pihole-unbound:/etc/pihole:rw
- ./pihole_dnsmasq-unbound:/etc/dnsmasq.d:rw
restart: unless-stopped
Code language: YAML (yaml)
Tiếp theo tạo file .env
để cấu hình thông số
nano .env
Code language: CSS (css)
Nhập vào nội dung như sau
ServerIP=192.168.0.50
TZ=Asia/Ho_Chi_Minh
WEBPASSWORD=thuanbuidepchai
#REV_SERVER=true
#REV_SERVER_DOMAIN=local
#REV_SERVER_TARGET=192.168.0.1
#REV_SERVER_CIDR=192.168.0.0/24
HOSTNAME=pihole
DOMAIN_NAME=pihole.local
Code language: Shell Session (shell)
Bạn cần chỉnh sửa lại các thông số cho phù hợp:
- ServerIP: địa chỉ IP của máy đang sử dụng
- WEBPASSWORD: mật khẩu đăng nhập vào Pi-hole
Nâng cao (không bắt buộc): Nếu bạn muốn sử dụng tính năng DNS conditional forwarding của Pi-hole thì bỏ dấu #
trong file docker-compose.yml
và file .env
trước các mục REV_ và sửa lại thông tin trong file .env
như sau
* REV_SERVER_TARGET: địa chỉ IP của router chính
* REV_SERVER_CIDR: IP Subnet của mạng nội bộ
Nếu đã kích hoạt Pi-hole ở bước I, bạn cần phải tắt nó bằng lệnh docker-compose down
, rồi mới kích hoạt Pi-hole + Unbound ở đây được.
Kích hoạt Pi-hole + Unbound
docker-compose up -d
Truy cập và đăng nhập vào Pi-hole tương tự như bước I: http://<IP-may-tinh>
Truy cập vào mục Settings –> DNS, bạn sẽ thấy Pi-hole đã được thiết lập sẵn sử dụng Upstream DNS Server ở địa chỉ localhost 127.0.0.1#5335
, chính là địa chỉ IP và port hoạt động của Unbound.
Bạn không cần thiết lập gì thêm trên Pi-hole nữa. Giờ chỉ cần thay đổi DNS trên Router thành IP của Pi-hole là xong.
Vậy là xong nhé! Chúc bạn cài đặt thành công!
Hello, mình cài thủ công từng mục cũng ok rồi bác, tuy nhiên nếu phải cài lại thì mình sẽ theo hướng dẫn của bạn.
Nhân tiện bạn làm luôn hướng dẫn tạo adguard-unbound được không, ag-ub nó chỉ có image, ko có hướng dẫn gì hết trơn.
Cảm ơn bạn nhiều nha.
nếu mình muốn cài trên VPS A1 Flex của Oracle Cloud, thì sao bạn? có phải cấu hình port, mở firewall gì không?
cám ơn bạn nhiều
Nếu cài trên Oracle Cloud, bạn cần phải mở port 53, 443 và 80 trên VPS và trong Subnet: https://thuanbui.me/cau-hinh-vps-mien-phi-oracle-cloud
cám ơn bạn nhiều.
nhưng mình chạy sao nó báo lỗi:
ERROR: for pihole Cannot start service pihole: driver failed programming external connectivity on endpoint pihole (8a8fc 1521e3bf7520c5f250c52358763a6d92db2bb951e35913aadcbaeed6404): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind : address already in use
ERROR: for pihole Cannot start service pihole: driver failed programming external connectivity on endpoint pihole (8a8fc 1521e3bf7520c5f250c52358763a6d92db2bb951e35913aadcbaeed6404): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind : address already in use
Lỗi này là do port 53 đã bị sử dụng trên hệ điều hành. Nếu bạn dùng Ubuntu thì xem qua cách fix ở đây: https://thuanbui.me/adguard-home/#3-sua-loi-fail-to-bind-on-port-53
cám ơn bạn rất nhiều.
chạy được lệnh: docker-compose up -d rồi, không thấy báo lỗi gì nữa cả
nhưng vẫn không vào được trang pi-hole.: http://
check lại trong UFW
To Action From
— —— —-
22/tcp (OpenSSH) ALLOW IN Anywhere
22/tcp ALLOW IN Anywhere
22 ALLOW IN Anywhere
53 ALLOW IN Anywhere
67 ALLOW IN Anywhere
80 ALLOW IN Anywhere
443 ALLOW IN Anywhere
22/tcp (OpenSSH (v6)) ALLOW IN Anywhere (v6)
22/tcp (v6) ALLOW IN Anywhere (v6)
22 (v6) ALLOW IN Anywhere (v6)
53 (v6) ALLOW IN Anywhere (v6)
67 (v6) ALLOW IN Anywhere (v6)
80 (v6) ALLOW IN Anywhere (v6)
443 (v6) ALLOW IN Anywhere (v6)
mở port hết rồi.
kể cả trong subnet => Default Security List for vcn
No 0.0.0.0/0 TCP 53 53 TCP traffic for ports: 53 Domain Name System (DNS)
6
No 0.0.0.0/0 UDP 53 53 UDP traffic for ports: 53 Domain Name System (DNS)
7
No 0.0.0.0/0 TCP 443 443 TCP traffic for ports: 443 HTTPS
8
No 0.0.0.0/0 UDP 443 443 UDP traffic for ports: 443 HTTPS
9
No 0.0.0.0/0 TCP All 67 TCP traffic for ports: 67
10
No 0.0.0.0/0 UDP All 67
không biết mình sai chỗ nào nhỉ?
mình mới làm tới phần: I. Cài đặt Pi-hole bằng Docker và Sửa lỗi fail to bind on port 53
Subnet bạn cấu hình sai rồi nhé. Mục Source Port Range phải để trống (nó hiện ra chữ All), chỉ điền port vào mục Destination Port Range. Ngoài ra bạn chưa mở port 80 trên Subnet.
cám ơn bạn nhiều, bạn hướng dẫn mình đã làm được rồi.
Hello, mình cài ph+unb theo hướng dẫn của bạn vào docker, mọi thứ đều ok nhưng nay xuất hiện 1 warning như sau: reducing DNS packet size for nameserver 127.0.0.1 to 1280.
Mình search các diễn đàn thì thấy cách fix bằng cách edit file 99-edns.conf trong filder dnsmasq.d nhưng mình tìm mãi ko ra folder đó, dùng nano thì nó báo ko có folder đó.
Không biết có phải do cài trên docker nên ko có không.
Nó chỉ Warning thôi, ko có gì phải lo. Nếu Pi-Hole vẫn hoạt động bình thường thì cứ mặc kệ nó đi bạn. Dev của Pi-Hole cũng nói không có gì phải lo về cái cảnh báo này: https://www.reddit.com/r/pihole/comments/rmkizp/warning_dnsmasq_warn_reducing_dns_packet_size_for/
Mình bị lỗi port 443 thì sửa sao vậy b?
Bind for 0.0.0.0:443 failed: port is already allocated’
trong config pihole cũ mình đang dùng cổng 443 rồi
Lỗi này là do cổng 443 đã bị sử dụng bởi ứng dụng khác. Bạn cần xoá cái Pi-Hole cũ đi, rồi mới cài đặt cái này.
Mình cứ tưởng là cài pi-hole xong mới cài pi-unbound.
Hóa ra là gộp lại được.
Bạn nên giải thích rõ trong bài viết cho những người ko chuyên như mình hiểu, chứ mình cài pi xong lại cài đè pi-unbound ko dc cái bối rối ngay.
Cám ơn bạn đã góp ý. Trong bài viết mình đã có ghi dòng này rồi: Nếu đã kích hoạt Pi-hole ở bước I, bạn cần phải tắt nó bằng lệnh docker-compose down, rồi mới kích hoạt Pi-hole + Unbound ở đây được.
Chắc bạn không xem kỹ rồi.
Mình có chạy lệnh docker-compose down xong rồi chạy docker-compose up -d
như hướng dẫn nhưng vẫn có lỗi.
Dù sao cũng cám ơn bạn đã chia sẻ.
lệnh
docker-compose down
phải được thực thi trong thư mục cài đặt Pi-Hole trước đó. Còn bạn chạy trong thư mục pihole-unbound này thì nó không có tác dụng gì cả.À ra vậy.
Cám ơn bạn nhé
Bạn Thuận cho mình hỏi trong phần nội dung file docker-compose.yml
Mình muốn thêm 3 máy chủ phân giải tên miền DNSCrypt-Proxy, UnBound, CloudFlared
tương ứng với 3 địa chỉ 127.0.1.1:1111, 127.0.2.2:2222, 127.0.3.3:3333 thì thêm vào file docker-compose.yml để Pi-Hole có để gửi truy vấn đến. Cả 3 máy chủ đó mình đều chạy trực tiếp bên ngoài docker.
Mình cám ơn.
Phần này bạn cần phải truy cập vào trang Settings của Pi-Hole và chỉnh DNS Upstrem, trỏ về các địa chỉ IP đó. Hướng dẫn ở đây: https://docs.pi-hole.net/guides/dns/unbound/
Mình chạy Pi-Hole trên máy thực thì vẫn trỏ về bình thường. Nhưng khi Pi-Hole chạy trên docker Pi-Hole không gửi truy vấn đến các máy chủ nội bộ được, nên mình mới hỏi bạn có cách nào fix lỗi này không?
Thực tế khi bạn chạy UnBound khác container với Pi-Hole, bạn cũng cần phải bắc cầu để cả 2 thấy nhau rồi mới truyền dữ liệu được.
Nếu Pi-Hole và Unbound chạy trên 2 Container khác nhau thì mình sẽ tạo 1 network chung cho 2 anh này bằng lệnh
docker network create --subnet=10.5.0.0/24 bridge testpi
. Sau đó chỉnh sửa lại file docker-compose của Pi-Hole và Unbound cho nó kết nối vào networktestpi
mới và set Static IP cho từng em. Cuối cùng chỉnh Upstream DNS trên Pi-Hole về Private IP của Unbound.Hy vọng cách này giúp bạn fix được lỗi.
P/S: À, mình mới xem lại thấy bạn chạy Unbound bên ngoài Docker. Vậy thì cần thiết lập Pi-Hole Docker sử dụng chế độ Network_mode: “Host”, và xoá phần ports trong file docker-compose.yml. Lúc này sẽ chỉnh được DNS trỏ về các máy chủ nội bộ kia.
pihole kết hợp với v2ray, chặn quảng cáo qua vpn. bạn có thể giải đáp giúp
Bạn có thể tham khảo cái này để chặn quảng cáo kết hợp WireGuard VPN: https://thuanbui.me/wirehole-ui-wireguard-vpn-server-dns-chan-quang-cao/. Còn PiHole + V2Ray thì mình ko rành.
Cảm ơn bác Thuận Bùi đã chia sẻ. Mình muốn hỏi chút là theo từng bước trên pi-hole đã cài tốt và dùng được nhưng đến bước cài pi-hole unbound chạy lệnh đến bước compose up -d thì mình bị lỗi này:
Pulling pihole (cbcrowe/pihole-unbound:latest)…
ERROR: Get “https://registry-1.docker.io/v2/”: x509: certificate has expired or is not yet valid: current time 2022-09-10T01:58:00+07:00 is before 2022-10-31T00:00:00Z
Bạn có thể hướng dẫn mình fix hay không? Mình có thử gg mà ko thấy lỗi nào giống thế. 🙁
Lỗi này do trang tải Docker image nó bị lỗi, không phải lỗi của máy chủ. Bạn đợi 1-2 ngày thử lại sẽ ổn.
Chào bạn,
Mình có thể cài trực tiếp DietPi lên Pi4 rồi cài pi-hole+unbound cho nó không?
Làm sao mình có thể update whitelist và blacklist automatic?
Thanks
DietPi dựa trên Debian nên có thể cài Docker vô tư. Sau đó bạn cài Pi-Hole + Unbound bình thường.
Còn vụ Whitelist và Blacklist cho Pi-Hole thì bạn google thêm nhé.
Mình có làm theo hướng dẫn này thời điểm 6/2023 có ver 3 rồi mà mình không rành config lắm. Thấy vào Pi-hole nó có thông báo cập nhật. Bạn hướng dẫn thêm được không ạ.
Bạn tham khảo bài này: https://thuanbui.me/cap-nhat-ung-dung-docker-len-phien-ban-moi-nhat/
Pi hole bị nhìu ip lạ vô quá, có cách nào giới hạn lại k ạ?
Em chào anh!!!
Anh cho em hỏi một chút, hiện tại e đã cài PI Hole trên LXC Promox ở địa chỉ 192.168.1.160 thành công:
1. Đã add list block
2. Đã add blacklist website để test
3. Đã đổi DNS Server trong Router Mikrotik và reboot lại rồi
4. Nslookup các IP thì thấy về DNS Pi Hole này rồi
Tuy nhiên thấy báo chạy, thấy báo list block nhưng các website block vẫn chạy phà phà, quảng cáo vẫn hiện tùm lum không block đc cái gì hết, mặc dù bên trong trang chủ của Pi Hole thì báo thấy rất nhiều, anh có thể chỉ dùm e cách fix được không ạ
P/S: Em đang dùng caddy server làm reverse proxy và NAT đường vào vào IP của caddy, điều này có ảnh hưởng gì không anh?
Rất tiếc, cái này là thiết lập cá nhân, nằm ngoài phạm vi tư vấn của anh rồi.
Vì hiện tại môi trường sử dụng của em khá giống của anh:
NAS lưu trữ
NUC PC làm Home Lab, docker chạy trên con này
và Router Mikrotik
—–
Anh cho em hỏi chút là ở nhà anh đang dùng caddy làm reverse server , và cài cả pi hole thì ở trên router anh đang cấu hình như thế nào ạ.
Cấu hình của mình như sau: Caddy làm Reverse Proxy, Adguard Home để chặn quảng cáo. Cấu hình DNS trên Mikrotik là IP của LXC đang chạy Adguard Home.
Caddy và Adguard Home / Pi-Hole không liên quan gì đến nhau cả. Caddy dùng để xử lý truy cập từ ngoài, còn Adguard Home để lo DNS trong mạng nội bộ.
Dạ!! Cảm ơn anh đã reply, thế cái Pihole của em đang ko block được cái gì chắc do em đang thao tác sai cái gì đó rồi, kể cả đưa website vào mục blacklist vẫn vào phà phà không gặp cản trở gì hết…
hello a,mình cài đặt hoàn tất và cũng cài dns lên pc windows 11 nhưng không thấy pihole nó chạy.
mình cài pihole trên máy có địa chỉ 192.168.1.9
nhờ bạn xem giúp
cảm ơn