Pi-hole mit Docker Compose auf dem Raspberry Pi

Aus Laub-Home Wiki

Möchte man in einem kompletten Netzwerk einen Adblocker ausrollen, kommt man um das kleine Tool Pi-hole nicht herum. Konzipiert wurde es um in einem Heimnetzwerk auf einem Raspberry Pi zu laufen. Da es sich aber auch um einen Docker Container handelt, kann es überall in einem Container laufen, oder unter jedem der unterstützen Betriebssystemen. Die Integration ins Netzwerk ist ebenso einfach wie die Installation, es integriert sich via DNS Server ins Netzwerk und blockt genau auf dieser Namensauflösungsebene unerwünschte Inhalte. Man muss nur dem Client sagen, nutze das Pi-hole als DNS. Ein schönes grafisches Interface erlaubt eine Basic Konfiguration wie auch eine schöne Statistik über die geblockten Inhalte. Ich gehe hier auf die Installation auf einem Raspberry Pi als Docker Container mittels Docker-Compose ein.


Hardware

Ich habe Pi-hole bei mir auf folgender Hardware am laufen:

Installation Docker / Docker Compose

Hierfür der Verweis auf den Bereits bestehenden Artikel:

Wichtig ist nun, das der Raspberry Pi eine feste IP Adresse bekommt. Dies kann entweder durch die Vergabe einer statischen IP Adresse in Raspbian, oder via DHCP Reservierung zum Beispiel am Router.

Möchte man eine statische IP Adresse unter Raspbian vergeben, kann man dies durch das Anlegen von Interface Konfigurationsdateien machen:

Beispiel Netzwerkinterface eth0:

/etc/network/interfaces.d/eth0

# Beispiel Konfiguration static eth0
auto eth0
allow-hotplug eth0
iface eth0 inet static
    address 192.168.101.10
    netmask 255.255.255.0
    network 192.168.101.0
    broadcast 192.168.101.255
    gateway 192.168.101.1

Beispiel WLan Adapter wlan0: /etc/network/interfaces.d/wlan0

# Beispiel Konfiguration static wlan0
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
        address 192.168.101.10
        netmask 255.255.255.0
        network 192.168.101.0
        broadcast 192.168.101.255
        gateway 192.168.101.1
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

Docker Compose Projekt

Als erstes legen wir den Docker Compose Projekt Ordner an:

mkdir -p /opt/pihole/

Nun erstellen wir das Compose Konfigurationsfile .env:

/opt/pihole/.env

# Config File for Pi-hole Application
WEBPASSWORD=YOURPASSWORD

# DNS Server
DNSSERVER1=1.1.1.1
DNSSERVER2=1.0.0.1

# Exposed Port Configuration
HTTPPORT=80
HTTPSPORT=443

# Timezone
TZ=Europe/Berlin

/opt/pihole/docker-compose.yml

version: "3.7"

# https://github.com/pi-hole/docker-pi-hole/blob/master/README.md

services:
  pihole:
    image: pihole/pihole:latest
    container_name: pihole
    # For DHCP it is recommended to remove these ports and instead add: network_mode: "host"
    restart: always
    ports:
      - "53:53/tcp"
      - "53:53/udp"
      # DHCP Server Usage
      #- "67:67/udp"
      - "${HTTPPORT}:80/tcp"
      - "${HTTPSPORT}:443/tcp"
    environment:
      TZ: ${TZ}
      WEBPASSWORD: ${WEBPASSWORD}
      DNS1: ${DNSSERVER1}
      DNS2: ${DNSSERVER2}
    # Volumes store your data between container upgrades
    volumes:
      - ./data/pihole/conf/:/etc/pihole/
      - ./data/dnsmasq.d/conf/:/etc/dnsmasq.d/
      # run `touch ./var-log/pihole.log` first unless you like errors
      # - './var-log/pihole.log:/var/log/pihole.log'
    dns:
      - 127.0.0.1
      - 1.1.1.1
    labels:
        com.centurylinklabs.watchtower.enable: "true"
    # Recommended but not required (DHCP needs NET_ADMIN)
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    #cap_add:
    #  - NET_ADMIN
    networks:
      - app-nw

networks:
  app-nw:
    internal: false
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-pihole

und nun starten wir das Ganze:

cd /opt/pihole
docker-compose up -d

Wenn alles hochgefahren ist, ist Pi-hole via Browser unter HTTP erreichbar. Dafür entweder die IP Adresse (oben haben wir die IP auf 192.168.101.10 festgelegt) oder den DNS Namen des Raspberry Pi verwenden.

  • http://192.168.101.10

Router / Gateway Konfiguration im Heim Netzwerk

Damit nun der Pi-hole auch alle DNS Anfragen des Netzwerkes bekommt um so ungewünschte Werbung oder Seiten zu blocken, muss noch der DNS Server auf die IP des Raspberry Pi geändert werden. Ich habe dies direkt beim WAN Interface gemacht, das heißt, aller outgoing Traffic wird DNS Seitig durch den Pi gejagt. Nachteil dieser Lösung ist, man sieht bei der Statistik nur die Firewall / Router als Client.

Normal sollte man dem DHCP Server sagen, das als DNS die Pi Hole IP verteilt wird. Dann gehen aber die Internen Namensauflösungen nicht, es sei denn, man biegt dann wieder beim Pi-hole den Upstream DNS auf den Router um. Dafür bringt der Pi-hole direkt eine Option in den Einstellungen bei DNS mit:

Diese Einstellung kann auch via docker-compose.yml beim deployen als Environmentvariablen direkt übergeben werden:

      CONDITIONAL_FORWARDING: ${CONDITIONAL_FORWARDING}
      CONDITIONAL_FORWARDING_IP: ${CONDITIONAL_FORWARDING_IP}
      CONDITIONAL_FORWARDING_DOMAIN: ${CONDITIONAL_FORWARDING_DOMAIN}
      CONDITIONAL_FORWARDING_REVERSE: ${CONDITIONAL_FORWARDING_REVERSE}

im .env definieren wir dann die Variablen:

# Forwarding to Local DNS / Router
# true/false
CONDITIONAL_FORWARDING=true
CONDITIONAL_FORWARDING_IP=192.168.101.1
CONDITIONAL_FORWARDING_DOMAIN=domain.local
# covers all 192.168.101.0/24
CONDITIONAL_FORWARDING_REVERSE=192.168.101.0/24

Passwort ändern

möchte man das Web Admin Passwort von Pi-Hole ändern, muss man folgenden Befehl als root ausführen:

pihole -a -p
# via Docker Container:
docker exec -ti pihole pihole -a -p

Quellen