目錄表

安裝 Pi-hole+Unbound 的 DNS (Docker)

安裝設定

開始使用

驗證成效

FAQ

  1. unbound 預設阻擋上游 DNS 回復私有網路保留 IP 網段 Exp. 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 169.254.0.0/16 , 如果要開放這限制, 需要
    1. 複製 unbound 內的 /opt/unbound/etc/unbound 目錄出來成為 etc-ubound

      docker cp unbound:/opt/unbound/etc/unbound .
      mv unbound etc-unbound

    2. 修改 docker-compose.yml 將 volumes 註記取消, 讓 etc-ubound 可掛載起來
      :
        unbound:
          container_name: unbound
          image: mvance/unbound:latest
          networks:
            dns_net:
              ipv4_address: 172.22.0.7
          volumes:
          - ./etc-unbound:/opt/unbound/etc/unbound
          ports:
      :
    3. 修改 ./etc-unbound/unbound.conf 將 private-address 設定註記掉 Exp.
      :
          # These private network addresses are not allowed to be returned for public
      #    private-address: 10.0.0.0/8
      #    private-address: 172.16.0.0/12
      #    private-address: 192.168.0.0/16
      #    private-address: 169.254.0.0/16
          # private-address: fd00::/8
          # private-address: fe80::/10
          # private-address: ::ffff:0:0/96
      :
    4. 重新啟動 docker compose

      docker compose up -d

  2. 如何調整自動更新週期
    1. 先確認可以在 host 執行更新

      docker exec pihole pihole updateGravity

    2. 在 host 建立 crontab 定義更新週期
  3. 如何增加一筆 wildcard 的 DNS 紀錄 Exp. *.lab.ichiayi.com → 192.168.11.30
    • 其實是可以設定, 只是無法直接透過 GUI 來處理
      • 在 pi-hole v6 之後, 需要再 GUI 勾選 misc.etc_dnsmasq_d
        • Settings→All settings→Miscellaneous→[√]misc.etc_dnsmasq_d
      • 手動處理程序如下:
      1. 在 /etc/dnsmasq.d/ 目錄, 也就是對應出來的 /etc-dnsmasq.d 目錄內建立一個檔案 Exp. 02-lab-wildcard-dns.conf
      2. 在檔案內加入 address=/lab.ichiayi.com/192.168.11.30
      3. 重啟 pihole-FTL 服務

        docker compose restart pihole

      4. 透過 nslookup abc.lab.ichiayi.com 就可以看到回應的 IP 是 192.168.11.30
  4. 如何增加一筆 MX 的 DNS 紀錄 Exp. mail.ichiayi.com → mail.ichiayi.com , 50
    • 其實是可以設定, 只是無法透過 GUI 來處理. 手動處理程序如下:
      1. 在 /etc/dnsmasq.d/ 目錄, 也就是對應出來的 /etc-dnsmasq.d 目錄內建立一個檔案 Exp. 03-mail.conf
      2. 在檔案內加入 mx-host=mail.ichiayi.com,mail.ichiayi.com,50
      3. 重啟 pihole-FTL 服務

        docker compose restart pihole

      4. 透過 nslookup set type=mx mail.ichiayi.com 就可以看到回應
  5. 當發現 pi-hole 內的 nslookup 查詢速度很緩慢(/etc/resolv.conf → nameserver 127.0.0.11)
    1. 將 docker-compose.yml 內的

        :
        ports: 
          - 53:53/udp
          - 53:53/tcp
        :

      前面加上 host ip Exp. 172.16.0.245

        :
        ports: 
          - 172.16.0.245:53:53/udp
          - 172.16.0.245:53:53/tcp
        :

    2. 重啟 docker compse 即可解決
  6. 當大量查詢 pi-hole DNS 服務, 結果出現 FTL is not running 異常狀況
    • docker compose logs -f 持續出現 Stopping pihole-FTL 的訊息
    • docker exec pihole df -h | grep shm 出現 100% 表示 Share Memory 已經被大量 query 的紀錄塞爆
    • 可以透過修改 docker-compose.yml 內將 shm_size(預設是 64MB)加大來解決, 但注意要確認不能超過主機記憶體大小
    1. 將 docker-compose.yml 內 #shm_size='2gb' 的 # 移除, 後面 2gb 可以改成實體主機記憶體大小的 70% 左右
    2. 重新啟動 docker compose

      docker compose up -d

    3. 確認修改是否成功

      pve-dns:~# docker exec pihole df -h | grep shm
      shm               2.0G   65M  2.0G   4% /dev/shm

  7. 當設定 LocalDNS 後查詢還會取用到外部 DNS 回傳的 IPv6 的 IP 問題的解法
  8. 當 pi-hole diagnosis 出現 Maximum number of concurrent DNS queries reached (max: 150) 這警告訊息
    • 先查看發生時間時段 /var/log/pihole/pihole.log 的紀錄內容
    • 如果確認有 Client 會正常大量查詢 DNS Exp. 監控系統 可以先將 Rate-limiting 調大
      • 在 Settings→DNS→Advanced DNS settings→Rate-limiting 修改 Exp.
    • 如果是出現大量內部 IP 反查紀錄 Exp. query[PTR] 51.173.43.10.in-addr.arpa from 10.20.2.218 可試著設定不要回覆私有 IP 的反查
      • 在 Settings→DNS→Advanced DNS settings→Never forward reverse lookups for private IP ranges 打勾

參考網址