synology NAS に pi-hole をインストールするも “Failed to set capabilities for pihole-FTL. Cannot run as non-root.” ではまった話

暑いあまりにも暑い。

それはともかく、 iPhone があまりに広告に対し脆弱なので pi-hole をインストールした。

クライアント側にアプリを入れる対策もあるが、正直毎回入れるのは面倒なので、dhcp で参照先 DNS として配布できる pi-hole を入れてみた。

ここまで来るまでには Adguardhome (Adgurad のサーバー版) も試したのだがちょっと自分には機能が豊富すぎる気がしたので pi-hole に一旦落ち着いたところだ。

以下の設定は、docker の動く synology なら動作する。もちろん単独のサーバーでもいい。

docker を bridge モードで動かすと アクセス元のクライアントがみんな一緒になってしまう問題があるが、 fetburner.core の情報を参考にして以下のようになった。

環境

LAN 側の状況

IP: 192.168.1.0/24
デフォルトゲートウェイ: 192.168.1.254

コンテナにも、LAN 側の IP を別個で割り当てる。

IP: 192.168.1.245
まあ、他とかぶらなければなんでもいい。
(当然だが、LAN 内の他のホストと衝突しないように調整する。必要ならルーター dhcp の除外範囲も調整する)

ブラウザでダッシュボードにアクセスするとセキュリテイ警告がでるが、インターネット側からアクセスする必要はないと判断して外部からアクセスするための設定は省略した。

必要なら synology のリバースプロキシとルータのポート開放を設定すること。

docker-compose.yml

実は、公式の docker-compose.yml をコピーしても起動時に ”Failed to set capabilities for pihole-FTL. Cannot run as non-root.” というメッセージを吐いてコケる問題があったが、DNSMASQ_USER を指定してやると回避できた。

# 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
    volumes:
      - /volume1/docker/pihole/conf:/etc/pihole
      - /volume1/docker/pihole/dnsmasq.d:/etc/dnsmasq.d
    environment:
      TZ: 'Asia/Tokyo'
      FTLCONF_webserver_api_password: 'なんかパスワードをしていすること'
      DNSMASQ_LISTENING: 'all'
      DNSMASQ_USER: 'root'
    networks:
        macvlan:
             ipv4_address: 192.168.1.245
    cap_add:
      - NET_ADMIN
    security_opt:
        - no-new-privileges:true
    restart: unless-stopped

networks:
    macvlan:
        name: macvlan
        driver: macvlan
        driver_opts:
            parent: ovs_eth0
        ipam:
            config:
                - subnet: 192.168.1.0/24
                   gateway: 192.168.1.254

起動後の設定

上記の設定ならブラウザで http://192.168.1.245/admin にアクセスするとダッシュボードが表示される。

左側の settings から DNS に進みお好みの上位 DNS を指定すれば設定は完了。
必要なら、Custom DNS にローカルのルーターを指定してやってもいい。なんにもしなくても動くようになっているので楽ちん。

dhcp から DNS を配布

DNS タイプの広告ブロッカーはインストールしただけでは、クライアントから使うことはできない。クライアントが今までとは別の新しい DNSサーバー を参照しないと意味がない。これは Pi-hole もAdguradhome も同様だ。

手順は割愛するが、iPhone だと手動で DNS を切り替えることができる。

Android12 以降では、手動での切り替えはできない。

何れにしても手動で設定するのは面倒なので、しばらく使ってみて問題がなさそうならルーターの dhcp から pi-hole の ip アドレスを DNS として配布するように設定するつもりだ。

多くの場合、ルーター自身の参照 DNS や dhcp の設定で配布する参照 DNS を決定をすればいい。

補足

実は synology で動かす前に、ROCK64 といラズベリーパイ3B 互換の SBC で試してみた。が明らかにインターネットの参照が遅くなったので、最終的に synology NAS で動かすことにした。

ROCK64 では dietpi という軽量 Linux に直接インストールしてみたがそれでも遅かったのでしかたない。PI4 か PI5 なら違った結果になったのかもしれない。

参考