Mình đã chia sẻ nhiều cách thiết lập WireGuard VPN Server trên blog:

Trong số này, wg-easy là lựa chọn yêu thích nhất của mình để thiết lập WireGuard VPN VPN bởi sự đơn giản cùng Web UI thân thiện để tạo client.

Tuy nhiên có vấn đề nảy sinh khi kết nối Internet thông qua WireGuard VPN là mình không còn sử dụng được bộ lọc quảng cáo của AdGuard Home. Lý do vì kết nối qua WireGuard tự động chuyển qua dùng DNS của Google (8.8.8.8) hoặc Cloudflare (1.1.1.1)

[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Address = 10.6.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
PresharedKey = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AllowedIPs = 0.0.0.0/24
Endpoint = aaa.bbb.ccc.ddd:51820Code language: YAML (yaml)

Trên thực tế, mình có thể thay đổi lại DNS trong file cấu hình conf qua dùng IP Address của Raspberry Pi 192.168.0.5 đang cài AdGuard Home để chặn quảng cáo như sau:

[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Address = 10.6.0.2/24
DNS = 192.168.0.5

[Peer]
PublicKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
PresharedKey = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AllowedIPs = 0.0.0.0/24
Endpoint = aaa.bbb.ccc.ddd:51820Code language: YAML (yaml)

Cách này chỉ hiệu quả khi mình kết nối qua WireGuard VPN khi ở nhà, có kết nối mạng trực tiếp đến AdGuard Home trên Raspberry Pi. Còn nếu sử dụng mạng Wifi bên ngoài hay 4G, không có cách nào để chặn quảng cáo khi kết nối qua VPN.

Do đó, mình phải tìm giải pháp mới để vừa có thể kết nối qua WireGuard VPN vừa có thể sử dụng bộ chặn quảng cáo, tránh bị làm phiền khi lướt web.

Đó là lý do của bài viết hôm nay: xin giới thiệu với mọi người WireGuard-UI – giải pháp tất cả trong một: WireGuard VPN + DNS chặn quảng cáo

I. Giới thiệu WireHole-UI

WireHole-UI là một bản fork do mình tạo ra dựa trên phiên bản gốc WireHole – công cụ kết hợp WireGuard + Pi-Hole + Unbound hoạt động trên nền Docker-Compose để tạo ra giải pháp VPN Server (WireGuard) có tính năng chặn quảng cáo (thông qua Pi-Hole*) và tối ưu bảo mật DNS (thông qua Unbound).

* Pi-Hole là giải pháp chặn quảng cáo bằng DNS Server tương tự như Adguard Home.

Mình thay thế Docker image WireGuard của Linuxserver bằng bản Wireguard của wg-easy để có thể thiết lập WireGuard dễ dàng hơn thông qua giao diện Web UI.

Thay vì phải thiết lập riêng lẻ wg-easy, Pi-Hole và unbound và cấu hình cho cả ba hoạt động cùng nhau, WireHole-UI tự động hoá tất cả mọi thao tác thông qua 1 file docker-compose.yml duy nhất. Bạn chỉ cần tải về, thay đổi vài thông số và kích hoạt bằng lệnh docker-compse up -d là xong.

Tính năng

  • Công cụ tất cả trong một: WireGuard + Web UI (wg-easy) + Chặn quảng cáo (Pi-Hole) + DNS Caching (Unbound)
  • Dễ cài đặt, dễ sử dụng.
  • Giao diện thân thiện, tạo, sửa, xoá client nhanh chóng.
  • Hỗ trợ QR Code để kết nối client bằng điện thoại
  • Hỗ trợ Split-Tunnel: chỉ sử dụng tính năng chặn quảng cáo khi kết nối qua VPN

II. Cài đặt WireHole-UI

Mình khuyến khích cài đặt WireHole-UI trên Ubuntu 20.04 để có sự tương thích tốt nhất. Nếu đang dùng Ubuntu 18.04, bạn cần phải cập nhật Linux kernel lên bản mới nhất mới sử dụng được WireGuard.

sudo apt-get install --install-recommends linux-generic-hwe-18.04Code language: JavaScript (javascript)

1. Cài đặt Docker & Docker-Compose

WireHole-UI hoạt động trên nền Docker-Compose. Do đó bạn cần phải cài đặt Docker trước khi bắt đầu.

2. Cài đặt git

Cài đặt thêm git trên máy nếu chưa có sẵn

sudo apt install gitCode language: Nginx (nginx)

3. Tải WireHole-UI

git clone https://github.com/10h30/wirehole-ui.git
cd wirehole-uiCode language: Bash (bash)

4. Thiết lập thông số

Trước khi kích hoạt WireHole-UI, bạn cần chỉnh sửa lại vài thông số của file docker-compose.yml

nano docker-compose.ymlCode language: CSS (css)

Nội dung mặc định của docker-compose.yml như dưới đây

version: "3"

networks:
  private_network:
    ipam:
      driver: default
      config:
        - subnet: 10.2.0.0/24

services:
  unbound:
    image: "klutchell/unbound"
    container_name: unbound
    restart: unless-stopped
    hostname: "unbound"
    volumes:
      - "./unbound:/opt/unbound/etc/unbound/"
    networks:
      private_network:
        ipv4_address: 10.2.0.200

  wg-easy:
    depends_on: [unbound, pihole]
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST= my.ddns.net

      # Optional:
      - PASSWORD=10h30
      # - WG_DEVICE=eth+
      - WG_PORT=51820
      - WG_DEFAULT_ADDRESS=10.6.0.x
      - WG_DEFAULT_DNS=10.2.0.100
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24

    image: ghcr.io/wg-easy/wg-easy:13
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
    dns:
      - 10.2.0.100 # Points to pihole
      - 10.2.0.200 # Points to unbound

    restart: unless-stopped
    networks:
      private_network:
        ipv4_address: 10.2.0.3

  pihole:
    depends_on: [unbound]
    container_name: pihole
    image: pihole/pihole:latest
    restart: unless-stopped
    hostname: pihole
    dns:
      - 127.0.0.1
      - 10.2.0.200 # Points to unbound
    environment:
      TZ: "Asia/Hong_Kong"
      WEBPASSWORD: "" # Blank password - Can be whatever you want.
      ServerIP: 10.2.0.100 # Internal IP of pihole
      DNS1: 10.2.0.200 # Unbound IP
      DNS2: 10.2.0.200 # If we don't specify two, it will auto pick google.
    # 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
    networks:
      private_network:
        ipv4_address: 10.2.0.100Code language: YAML (yaml)

Có hai thông số bắt buộc bạn phải thay đổi:

  • - WG_HOST= my.ddns.net Đổi thành Public IP của server bạn sử dụng. Nếu cài đặt tại nhà, bạn có thể dùng Dynamic DNS.
  • - PASSWORD=10h30 Đây là mật khẩu dùng để truy cập Web UI của WireGuard thông qua địa chỉ http://<IP-Address>:51821. Hãy thay đổi để tối ưu bảo mật.

Các thông số khác bạn có thể giữ nguyên nếu không rành về Docker.

Sau khi đã chỉnh sửa , lưu lại (CTRL + O) và thoát ra (CTRL + X).

Chú ý: Nếu bạn sử dụng Oracle Cloud VPS, và không truy cập được Internet sau khi kết nào vào WireGuard, tham khảo bài viết này để khắc phục

5. Kích hoạt WireHole-UI

Kích hoạt WireHole-UI bằng lệnh sau

docker-compose up -d

Đợi vài phút để máy tải Docker image và thiết lập các container. Sau khi hoàn tất, bạn đã có thể truy cập theo địa chỉ sau để thiết lập WireGuard client. Đăng nhập bằng mật khẩu bạn đã thiết lập ở mục ` – PASSWORD` trong file docker-compose.yml

http://<IP-Address>:51821Code language: JavaScript (javascript)

Nếu bạn đang cài đặt trên VPS miễn phí của Oracle, tham khảo bài viết này sẽ có hướng dẫn chi tiết hơn

III. Kết nối đến WireHole-UI

1. Tạo WireGuard Client

Để có thể kết nối đến WireGuard VPN Server, bạn cần phải truy cập vào Web UI để tạo client.

http://<IP-Address>:51821Code language: JavaScript (javascript)

Giao diện Web UI quản lý WireGuard cực kỳ thân thiện và dễ sử dụng.

  • Bấm New để tạo client.
  • Bấm vào biểu tượng QR để xem QR code dùng để thiết lập WireGuard client trên điện thoại.
  • Bấm vào biểu tượng Download để tải file cấu hình, dùng để thiết lập WireGuard client trên máy tính.
  • Bấm biểu tượng Thùng Rác để xoá client.
wg-easy Web UI

2. Cài đặt WireGuard Client

Nếu chưa biết cách thiết lập WireGuard Client, bạn xem lại mục Cài đặt WireGuard Client trong bài viết này

3. Cấu hình Pi-Hole

Mặc định sau khi kết nối thành công đến WireGuard VPN Server, bạn sẽ tự động được chặn quảng cáo nhờ vào hoạt động của Pi-Hole mà không cần phải thiết lập thêm gì cả.

Nếu muốn cấu hình nâng cao cho Pi-Hole, bạn có thể truy cập vào Dashboard của Pi-Hole theo địa chỉ sau

http://10.2.0.100/adminCode language: JavaScript (javascript)

Thông thường mình sẽ thiết lập thêm Local DNS Records để sau này truy cập vào Pi-Hole theo tên miền http://pi.hole cho dễ nhớ.

Truy cập vào mục DNS Records, tạo mục mới:

  • Domain: pi.hole
  • IP Address: 10.2.0.100

Sau đó bấm Save là xong

IV. Cấu hình Split-Tunnel

WireHole-UI có thêm tính năng Split-Tunnel rất hữu ích trong trường hợp bạn chỉ muốn tận dụng DNS Server của Pi-Hole để chặn quảng cáo mà không chuyển hướng đường truyền qua VPN Server.

Cách thực hiện rất đơn giản. Bạn chỉ cần tạo thêm 1 WireGuard client mới, ví dụ: Adblock, và tải file cấu hình Adblock.conf về máy.

Sau đó khi cấu hình trên WireGuard client, thay đổi thông số của dòng AllowsIP thành 10.2.0.0/24 và lưu lại.

[Interface]
PrivateKey = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Address = 10.6.0.2/24
DNS = 10.2.0.100

[Peer]
PublicKey = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
PresharedKey = zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
AllowedIPs = 10.2.0.0/24
Endpoint = aaa.bbb.ccc.ddd:51820Code language: YAML (yaml)

Với thiết lập này, chỉ có DNS Traffic được điều hướng qua VPN Server, truy cập web của bạn vẫn hoạt động bình thường, không chạy qua VPN.

Chúc bạn cài đặt thành công!

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 vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Để lại một bình luận

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 *


64 Comments

        1. Vụ “Creating network “wirehole-ui_private_network” with the default driver
          ERROR: Pool overlaps with other one on this address space”
          Hình như lỗi đánh máy sao ý. Mình lên github copy lại và chỉnh sửa thì ok luôn

        1. Split Tunnel của cái WireHole-UI này để dùng DNS của Pi-Hole chặn quảng cáo thôi, không có tính năng định tuyến tự động bạn nhé. Muốn dùng kiểu định tuyến tự động quốc tế thì bắt buộc phải dùng router Mikrotik / OpenWRT hoặc pfSense / OPNSense

      1. Cho mình hỏi thêm là mình set cái DNS pi.hole không hoạt động bạn ạ, không biết lỗi gì.

        Mình cũng đang nghĩ nếu set pi.hole poin tới một local IP đc thì không có thể tạo một local IP point tới WordPress, rồi xài local DNS poin to ip đó, nghĩa là tạo một WordPress cho nội bộ vpn được không nhỉ?

        0
          1. Cái DNS Pi-Hole đã work rồi, thêm “/admin” vào chứ không có giống như khi truy cập tới 10.2.0.100 sẽ có phần truy cập trang admin.

            Còn cái mục wordpress, ý của mình là muốn xây dựng một workpress chỉ có nội bộ vpn mới truy cập được thôi. Mình có search lòng vòng mà chưa kiếm được giải pháp.

          1. Hi bạn mình thử cài wirehole-ui trên Google Cloud như cũng bị lỗi ko access đươc ip public:51821 dù đã mở port trên firewall . Đã mở port cả ufw và trên policies fire wall của Google Cloud

    1. Muốn truy cập vô Pi-Hole thì phải kết nối vô WireGuard nhé. Khi vào được mạng nội bộ của WireGuard rồi thì mới truy cập 10.2.0.100 được

  1. oh, giờ mình muốn dùng pihole vừa set xong để chặn ads cho từ cấp router của mình thì trên router buộc phải cài wg client hay chỉ cần trỏ local ip của pihole về dns server của router là được ta, router mình chạy openwrt.

    1. Mục đích chính của cái WireHole-UI này là để tạo VPN, chặn quảng cáo chỉ là phụ thêm. Bạn muốn chặn quảng cáo cho router ở nhà thì cài AdGuard Home vô OpenWRT là nhanh gọn lẹ nhất. Dùng cái WireHole-UI này phải thiết lập răc rối, không hợp lý chút nào.

      1. uhm, vậy mình sẽ cài wirehole lên vps. Cài AGH lên router mình đã cài rồi nhưng nó phức tạp vụ unbound quá (do mình gà), mình cài theo hướng dẫn để unbound thì mất net vì phải disable dhcp của router và dùng của AGH, làm vài lần đều bị nên mình vẫn chưa thành công cài AGH + Unbound, hiện tại dùng AGH cũng ko hiệu quả mình bị DNS leak, phải kết hợp với adblock truyền thống để block ads.
        Vậy nên mình có thể cài Pihole+unbound lên armbian box để chặn ads và dnsleak cấp router được đúng không bạn? Nếu bạn có hướng dẫn cài AGH+unbound luôn thì chỉ giúp mình với nha.
        Cảm ơn bạn.

          1. Hic, thực sự là đọc rồi mà ko biết làm sao để làm theo vì không có hướng dẫn từng bước như của bạn.
            Mình có thể edit docker-compose của bài trong post này, bỏ đi mục wireguard có được không ta?

  2. Chào bạn, mình xem và làm theo bạn hướng dẫn: “WireHole-UI – Thiết lập VPN Server tích hợp tính năng chặn quảng cáo”. Đã chạy được WireGuard, nhưng khi mình sử dụng tính năng Split-Tunnel thì Pi-hole không chặn được quảng cáo. Bạn hướng dẫn mình khắc phục được không. Thanks Bạn

    1. Mình đã thử và thấy dùng Split-Tunnel vẫn chặn quảng cáo bình thường. Bạn nên xem lại có làm thiếu bước nào không?
      Và lần sau bạn vui lòng gửi câu hỏi ở đúng bài viết liên quan. (Câu hỏi đã được dời từ trang Mời bia qua đây)

  3. Tại sao mình làm đến bước kết nối vpn với IOS thì hoạt động được nhưng trên win thì không kết nối được thử với cả win 7 và win 10
    -Đổi AllowsIP thành 10.2.0.0/24 thì kết nối được với DNS để chặn quảng cáo để mặc định thì win không kết nối với VPN

    1. iOS hoạt động được nghĩa là WireHole-UI đã chạy thành công. Còn trên Win không được thì do cấu hình Win của bạn nó có gì lạ rồi. Cái này thì bạn phải tự mò thôi.

  4. mình làm theo các bươca nhưng không thể kết nối được. quét QR thì báo lỗi “i not the valid”. còn add trên win 10 thì báo noactive, khi active thì báo no such host is known
    bạn hướng dẫn mình cái nhé. thanks bạn

  5. Ở máy client mình không sử dụng wireguard để kết nối mà trỏ dns về ip của vps thì có sử dụng được tính năng chặn quảng cáo không bạn? Dĩ nhiên mình hiểu là sẽ không dùng được vpn.

  6. Bạn cho mình hoit, mình lấy file conf từ wg về để cài lên mikrotik thì báo lỗi sai chỗ gateway, vậy thì theo cách bạn hướng dẫn trên thì địa chỉ gateway để cài lên mikrotik sẽ như thế nào nhỉ. Cám ơn bạn!

  7. với image “image: “mvance/unbound-rpi:latest”
    em đang gặp lỗi “unbound The requested image’s platform (linux/arm/v7) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested”
    có lẽ unbound rpi chưa support cho arm64 chăng?

  8. Mình đang dựng trên raspberry pi và build trên docker, setting phần host sẽ là ddns của router nhà mình, tuy nhiên mình connected nhưng ko ra đc internet, cái UI cũng ko hiện được up down , router mình đang dùng là mikrotik, mình đã thử google 1 lúc nhưng chưa tìm ra nguyên nhân để mình config lại, hy vọng được anh đưa ra giải pháp

    1. Mình cũng đang dùng router Mikrotik. Bạn kiểm tra xem đã mở port 51820, Protocal 17 (udp) trên con Mik, trỏ vào IP con Raspberry Pi chưa: https://imgur.com/MsjhHLd . Và kiểm tra thử xem có truy cập được `1.1.1.1` sau khi kết nối vào WireGuard không? Nếu truy cập theo IP được, mà không truy cập bằng tên miền được thì có thể Unbound / Pi-Hole nó gặp lỗi gì đó không phân giải DNS được.

      1. cám ơn anh đã hỗ trợ em rất nhanh, đúng như cách anh đã hướng dẫn ở trên, sau khi thay Host từ ddns sang IP đã có thể ra được internet và hoạt động ngon lành. Vấn đề có lẽ ở vụ phân giải DNS , anh có solution nào để em có thể debug kĩ hơn về việc này không vì hiện tại em đang dùng IP động

          1. Hi anh, hiện tại DDNS em đang dùng free của NoIP và khi chuyển sang dùng Mik thì em đang tận dụng DDNS free ngay trên Mik (xxxxxx.sn.mynetname.net), tuy nhiên là ngay từ ban đầu em đã dùng DDNS của mik trên cấu hình rồi, và không ra được internet
            Em đang ko rõ lỗi đến từ đâu, tuy nhiên em đang trỏ DNS Name của Mik về NoIP theo dạng CNAME(DNS Alias) để có thể sử dụng song song cả 2 DDNS, em không chắc có phải vấn đề nằm ở đây không.

  9. Cho mình hỏi là mình đã cài theo như bạn hướng dẫn, hệ thống đã chạy 1 thời gian ok nhưng hôm nay thì bật vpn lên thì client không truy cập được vào web. Mình có kiểm tra DNS trong pi-hole thì nếu để Upstream DNS servers tới 10.2.0.200 (unbound) thì không vào được web. Nhưng nếu tích vào Upstream DNS Servers của Google thì web vào bình thường. Lỗi này xử lý thế nào vậy bạn?

    1. Theo bạn nói thì Unbound container bị lỗi gì đó rồi. Khởi độngg lại xem sao. Hoặc bạn có thể chỉnh lại fie docker-compose.yml, cho Pi-hole upstream thằng đến Googgle, không qua Unbound nữa.

        1. Unbound nó có nhiệm vụ xác thực và cache DNS nhằm tăng tính bảo mật thôi. Không dùng thì không ảnh hưởng gì đến tốc độ truy cập hết bạn nhé.

      1. Anh rảnh xem lại logs giúp mình xem lỗi ở đâu được không ạ ?
        wg-easy | 2024-01-21T15:30:13.837Z Server Listening on http://0.0.0.0:51821
        wg-easy | 2024-01-21T15:30:13.844Z WireGuard Loading configuration…
        wg-easy | $ wg genkey
        wg-easy | $ echo ***hidden*** | wg pubkey
        wg-easy | 2024-01-21T15:30:13.919Z WireGuard Configuration generated.
        wg-easy | 2024-01-21T15:30:13.920Z WireGuard Config saving…
        wg-easy | 2024-01-21T15:30:13.928Z WireGuard Config saved.
        wg-easy | $ wg-quick down wg0
        wg-easy | $ wg-quick up wg0
        wg-easy | 2024-01-21T15:30:14.451Z WireGuard Config syncing…
        wg-easy | $ wg syncconf wg0 <(wg-quick strip wg0)
        wg-easy | 2024-01-21T15:30:14.516Z WireGuard Config synced.
        wg-easy | 2024-01-21T15:30:54.073Z Server New Session: UaY8tg7Vr9E0QJyrdBjnUGLTtZlzpnkF
        wg-easy | $ wg genkey
        wg-easy | $ echo IJA+i0sPO3jR7MFGlo+PriN9GbkqV05lRSyilV4FVn0= | wg pubkey
        wg-easy | $ wg genpsk
        wg-easy | 2024-01-21T15:31:04.300Z WireGuard Config saving…
        wg-easy | 2024-01-21T15:31:04.303Z WireGuard Config saved.
        wg-easy | 2024-01-21T15:31:04.303Z WireGuard Config syncing…
        wg-easy | $ wg syncconf wg0 <(wg-quick strip wg0)
        wg-easy | 2024-01-21T15:31:04.362Z WireGuard Config synced.
        wg-easy | 2024-01-21T15:50:31.180Z WireGuard Config saving…
        wg-easy | 2024-01-21T15:50:31.183Z WireGuard Config saved.
        wg-easy | 2024-01-21T15:50:31.184Z WireGuard Config syncing…
        wg-easy | $ wg syncconf wg0 <(wg-quick strip wg0)
        wg-easy | 2024-01-21T15:50:31.308Z WireGuard Config synced.
        wg-easy | $ wg genkey
        wg-easy | $ echo INgb31Mn4m928eqs6PeXQWkivzN6dPL9chn36KtRRWQ= | wg pubkey
        wg-easy | $ wg genpsk
        wg-easy | 2024-01-21T15:50:36.891Z WireGuard Config saving…
        pihole | s6-rc: info: service s6rc-oneshot-runner: starting
        wg-easy | 2024-01-21T15:50:36.896Z WireGuard Config saved.
        wg-easy | 2024-01-21T15:50:36.896Z WireGuard Config syncing…
        pihole | s6-rc: info: service s6rc-oneshot-runner successfully started
        pihole | s6-rc: info: service fix-attrs: starting
        pihole | s6-rc: info: service fix-attrs successfully started
        pihole | s6-rc: info: service legacy-cont-init: starting
        pihole | s6-rc: info: service legacy-cont-init successfully started
        pihole | s6-rc: info: service cron: starting
        pihole | s6-rc: info: service cron successfully started
        pihole | s6-rc: info: service _uid-gid-changer: starting
        unbound | [1705851008] unbound[1:0] notice: init module 0: subnetcache
        unbound | [1705851008] unbound[1:0] warning: subnetcache: serve-expired is set but not working for data originating from the subnet module cache.
        unbound | [1705851008] unbound[1:0] warning: subnetcache: prefetch is set but not working for data originating from the subnet module cache.
        unbound | [1705851008] unbound[1:0] notice: init module 1: validator
        unbound | [1705851008] unbound[1:0] notice: init module 2: iterator
        unbound | [1705851008] unbound[1:0] info: start of service (unbound 1.19.0).
        unbound | [1705851008] unbound[1:0] info: generate keytag query _ta-4a5c-4f66. NULL IN
        unbound | [1705892369] unbound[1:0] info: generate keytag query _ta-4f66. NULL IN
        unbound | [1705932618] unbound[1:0] info: generate keytag query _ta-4f66. NULL IN
        wg-easy | $ wg syncconf wg0 <(wg-quick strip wg0)
        wg-easy | 2024-01-21T15:50:36.990Z WireGuard Config synced.
        wg-easy | 2024-01-22T15:08:27.929Z Server New Session: P6h2A9wNzQjLSEsbWsAmpuzoTjxHrZOW
        wg-easy | 2024-01-22T15:08:33.005Z WireGuard Config saving…
        wg-easy | 2024-01-22T15:08:33.013Z WireGuard Config saved.
        wg-easy | 2024-01-22T15:08:33.013Z WireGuard Config syncing…
        wg-easy | $ wg syncconf wg0 <(wg-quick strip wg0)
        wg-easy | 2024-01-22T15:08:33.101Z WireGuard Config synced.
        wg-easy | $ wg genkey
        wg-easy | $ echo kFaYzvbnpB+QzQZ/D8qNhebPUV3H2MZqgJKWogx191Y= | wg pubkey
        wg-easy | $ wg genpsk
        wg-easy | 2024-01-22T15:08:40.643Z WireGuard Config saving…
        wg-easy | 2024-01-22T15:08:40.646Z WireGuard Config saved.
        wg-easy | 2024-01-22T15:08:40.646Z WireGuard Config syncing…
        wg-easy | $ wg syncconf wg0 “Asia/Hong_Kong”,
        pihole | “PIHOLE_DOCKER_TAG” => “”,
        pihole | “PHP_ERROR_LOG” => “/var/log/lighttpd/error-pihole.log”,
        pihole | “CORS_HOSTS” => “”,
        pihole | “VIRTUAL_HOST” => “pihole”,
        pihole | [i] Using IPv4 and IPv6
        pihole |
        [✓] Installing latest Cron script
        pihole | [i] setup_blocklists now setting default blocklists up:
        pihole | [i] TIP: Use a docker volume for /etc/pihole/adlists.list if you want to customize for first boot
        pihole | [i] Blocklists (/etc/pihole/adlists.list) now set to:
        pihole | https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
        pihole | [i] Converting DNS1 to PIHOLE_DNS_
        pihole | [i] Converting DNS2 to PIHOLE_DNS_
        pihole | [i] Setting DNS servers based on PIHOLE_DNS_ variable
        pihole | [i] Applying pihole-FTL.conf setting LOCAL_IPV4=10.2.0.100
        pihole | [i] FTL binding to default interface: eth0
        pihole | [i] Enabling Query Logging
        pihole | [i] Testing lighttpd config: Syntax OK
        pihole | [i] All config checks passed, cleared for startup …
        pihole | [i] Docker start setup complete
        pihole |
        pihole | [i] pihole-FTL (no-daemon) will be started as pihole
        pihole |
        pihole | s6-rc: info: service _startup successfully started
        pihole | s6-rc: info: service pihole-FTL: starting
        pihole | s6-rc: info: service pihole-FTL successfully started
        pihole | s6-rc: info: service lighttpd: starting
        pihole | s6-rc: info: service lighttpd successfully started
        pihole | s6-rc: info: service _postFTL: starting
        pihole | s6-rc: info: service _postFTL successfully started
        pihole | s6-rc: info: service legacy-services: starting
        pihole | Checking if custom gravity.db is set in /etc/pihole/pihole-FTL.conf
        pihole | s6-rc: info: service legacy-services successfully started
        pihole | [i] Creating new gravity database
        pihole | [i] Migrating content of /etc/pihole/adlists.list into new database
        pihole | [i] Neutrino emissions detected…
        [✓] Pulling blocklist source list into range
        pihole |
        [✓] Preparing new gravity database
        [✓] Creating new gravity databases
        pihole | [i] Using libz compression
        pihole |
        pihole | [i] Target: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
        [✓] Status: Retrieval successful
        [✓] Parsed 153664 exact domains and 0 ABP-style domains (ignored 1 non-domain entries)
        pihole | Sample of non-domain entries:
        pihole | – “0.0.0.0”
        pihole |
        pihole |
        [✓] Building tree
        [✓] Swapping databases
        pihole | [✓] The old database remains available
        pihole | [i] Number of gravity domains: 153664 (153664 unique domains)
        pihole | [i] Number of exact blacklisted domains: 0
        pihole | [i] Number of regex blacklist filters: 0
        pihole | [i] Number of exact whitelisted domains: 0
        pihole | [i] Number of regex whitelist filters: 0
        [✓] Cleaning up stray matter
        pihole |
        pihole | [✓] FTL is listening on port 53
        pihole | [✓] UDP (IPv4)
        pihole | [✓] TCP (IPv4)
        pihole | [✓] UDP (IPv6)
        pihole | [✓] TCP (IPv6)
        pihole |
        pihole | [i] Pi-hole blocking will be enabled
        pihole | [i] Enabling blocking
        [✓] Pi-hole Enabled
        pihole |
        pihole | Pi-hole version is v5.17.3 (Latest: v5.17.3)
        pihole | web version is v5.21 (Latest: v5.21)
        pihole | FTL version is v5.24 (Latest: v5.24)
        pihole | Container tag is: 2024.01.0