Chuyên mục
Linux Network Self Hosting

Hướng dẫn cài đặt Pi-hole + Unbound

Để 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:

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 ~/piholeCode language: Bash (bash)

Tạo file docker-compose.yml để cấu hình Pi-hole

nano docker-compose.ymlCode 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ị.

Giao diện trang quản trị Pi-hole

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-resolvedCode 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 :53Code 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, …

Cấu hình Upstream DNS Servers

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.ymlCode 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 .envCode 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.localCode 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!

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

31 trả lời trong “Hướng dẫn cài đặt Pi-hole + Unbound”

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.

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

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.

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.

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.

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ả.

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.

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 network testpi 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.

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ế. 🙁

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 ạ.

Trả lời Trung Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *