paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

pi-holeもwslのdockerに移植する(が使えませんでした)

前回のFireflyの移設に味を占めたのでpi-holeも移植することにしました。
ブラウザにも広告ブロックを有効にしているので困ってはいませんが、やはり根元から広告は減らしておきたいです。

移植は上手くいったものの、ホスト側からリゾルバが効かなくて実用には至りませんでした。

環境

もともとのクライアントであったWindows10のwsl上のdockerの中に作ります。
やはり作成が簡単ですからね。

Windowsは自身に問い合わせるという形になります。

デプロイ

ymlファイル

公式サイトにdockerでのインストール方法も乗っていますのでdocker-composeファイルをほぼコピーです。
一部マスクしますが、こんな感じ。
ポート80はFireflyで使ってますので81にしました。

  • WEBPASSWORD,
  • FTLCONF_LOCAL_IPV4
  • PIHOLE_DNS_

は自分の環境用に追加しました。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/pi-hole$ cat docker-compose.yml
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
    # For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      # - "67:67/udp" # Only required if you are using Pi-hole as your DHCP server
      - "81:80/tcp"
    environment:
      TZ: 'Asia/Tokyo'
      # WEBPASSWORD: 'set a secure password here or it will be random'
    # Volumes store your data between container upgrades
      WEBPASSWORD: 'xxxxxxxxxxxxxx'
      FTLCONF_LOCAL_IPV4: 192.168.xx.xx
      PIHOLE_DNS_: xx.xx.xx.xx;xx.xxx.xx.xx      
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    cap_add:
      - NET_ADMIN # Required if you are using Pi-hole as your DHCP server, else not needed
    restart: unless-stopped

up

とりあえずフォアグラウンドで動かします。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/pi-hole$ sudo docker-compose -f docker-compose.yml up
Recreating pihole ... done
Attaching to pihole
pihole    | s6-rc: info: service s6rc-oneshot-runner: starting
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
pihole    | s6-rc: info: service _uid-gid-changer successfully started
pihole    | s6-rc: info: service _startup: starting
pihole    |   [i] Starting docker specific checks & setup for docker pihole/pihole
()
pihole    |
pihole    |   [?] FTL is listening on port 53
pihole    |      [?] UDP (IPv4)
pihole    |      [?] TCP (IPv4)
pihole    |      [?] UDP (IPv6)
pihole    |      [?] TCP (IPv6)
pihole    |
pihole    |   [?] Pi-hole blocking is enabled
pihole    |
pihole    |   Pi-hole version is v5.16.2 (Latest: v5.16.2)
pihole    |   AdminLTE version is v5.19 (Latest: v5.19)
pihole    |   FTL version is v5.22 (Latest: v5.22)
pihole    |   Container tag is: 2023.03.1
pihole    |

上がったっぽい。

管理Webアクセス

見えてますね。OKそう。

問題: ホスト側から名前解決できない

管理画面は見えたものの肝心の名前解決ができません。
なぜだ。

PS C:\Users\masashi> nslookup www.google.com
サーバー:  UnKnown
Address:  127.0.0.1

*** UnKnown が www.google.com を見つけられません: No response from server

ちなみにwsl上ではOK。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi/tools/docker/pi-hole$ dig www.google.com @127.0.0.1

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.com @127.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39335
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         209     IN      A       142.251.222.4

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Apr 09 13:22:33 JST 2023
;; MSG SIZE  rcvd: 59

Listen状態を確認

コンテナを落として実は競合とかしてないか確認します。

PS C:\Users\masashi> netstat -ano | findstr 53
  TCP         0.0.0.0:5357           0.0.0.0:0              LISTENING       4
  TCP         127.0.0.1:5354         0.0.0.0:0              LISTENING       4040
  TCP         [::]:5357              [::]:0                 LISTENING       4
  UDP         0.0.0.0:53             *:*                                    4852
  UDP         0.0.0.0:5353           *:*                                    11104
  UDP        
()

53番がListenしている。なんだこれは。

PS C:\Users\masashi> tasklist -svc -fi "pid eq 4852"

イメージ名                     PID サービス
========================= ======== ============================================
svchost.exe                   4852 SharedAccess

pidで絞ったらShardAccessというサービスが使っているようです。
なんかWindows経由で同じLAN内のコンピュータをインターネットに接続できるようにできるサービスらしいです。

learn.microsoft.com

コンテナ起動時にポート競合のエラー等は出ていなかったのですが、ポート競合していると正常な動作はしなさそうなので、ICSサービスを停止しました。
が、直ぐ上がってきてしまいました。
サービス管理のウィザード等試しましたがOS再起動すると戻ってしまうしどうやら無効にはできないみたい。

結論: WindowsでのDNSサーバはやめよう

これがWindows Serverとかなら何かやりようがあると思いますが、使っている10はもともとクライアント用途のOSですし、レジストリをいじってまで自身のDNSサーバを使うものでもないと思うので今回のケースはあきらめました。
今回の構成は文献、記事も無く試す人もいないほど効果的なものではないのでしょうか。
dockerでのデプロイまでは成功しているのでまた別筐体に移せるときにDNS周りは変更したいと思います。