Pihole + Unbound mit Docker auf dem Raspi

Ziel

pihole und unbound in jeweils einem eigenen Container, um mögliche Port Konflikte zu vermeinden.
Es wird macvlan verwendet

Quelle: https://forum.openmediavault.org/index.php?thread/50758-pihole-and-unbound-in-docker/
Was gegen diese Lösung mit den macvlan spricht: https://blog.oddbit.com/post/2018-03-12-using-docker-macvlan-networks/

Netzwerk einrichtung MACVLAN

Erstelle unter „Networks“ ein neues Netzwerk:

  • Name: mypiholevlan
  • Driver: macvlan
  • Parent network: eth0 (den richtigen Adapter auswählen, mit dem das VLan verknüpft sein soll)
  • Subnet: „192.168.130.0/24“
  • Gateway: „192.168.130.1“ (Im Regelfall der Router)
  • IP range: „192.168.130.12/30 # 192.168.130.12 and 192.168.130.13“ (Kann frei bleiben, sofern man die IP-Adressen selbst und ohne DHCP verteilet.
    Alternativ reserviert man ein paar IP-Adressen, die von Docker verwendet werden dürfen und nicht per DHCP genutzt werden.)
  • Der pihole

# Pihole
#
# https://github.com/pi-hole/docker-pi-hole?tab=readme-ov-file
#
version: "3"

services:
  pihole:
    container_name: pihole
    image: pihole/pihole:latest
    hostname: pihole #Choose your hostname
    dns:
     - "192.168.130.13" #DNS1: Should be the address of your unbound system
     - "9.9.9.9"        #DNS2: Quad9 as an example, optional
    networks:
      mypiholevlan:    #the network name you specified in the first step
        ipv4_address: 192.168.130.12    #The IP address you want to assign to your pihole. Make sure this address is available to be used in your network
    # 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
      - "80:80/tcp"
    # Volumes store your data between container upgrades
    volumes:
      - './etc-pihole:/etc/pihole'
      - './etc-dnsmasq.d:/etc/dnsmasq.d'
    environment:
      - TZ='Europe/Berlin'
      - WEBPASSWORD=${PIHOLE_WEBPASSWORD}
      - DHCP_ACTIVE=false
    labels:
      - com.centurylinklabs.watchtower.enable=false
    #   https://github.com/pi-hole/docker-pi-hole#note-on-capabilities
    restart: unless-stopped
    # Required if you are using Pi-hole as your DHCP server, else not needed
    # cap_add:
      # - NET_ADMIN

networks:
  mypiholevlan:  #network name
    external: true

Unbound-Container

version: "3"

services:
  unbound:
    container_name: unbound
    image: mvance/unbound:latest
    hostname: unbound
    networks:
      mypiholevlan: #the network name you specified in the first step
        ipv4_address: 192.168.130.13 #The IP address you want to assign to Unbound. Make sure this address is available to be used in your network
    ports:
      - "53:53/tcp"
      - "53:53/udp"
    #volumes:    #It's important to comment out these two lines if you don't want to use your own unbound configuration! An own configuration can be tricky as you have to provide several config files manually.
    #  - './etc-unbound:/opt/unbound/etc/unbound'
    restart: unless-stopped
networks:
  mypiholevlan:  #the network name you specified in the first step
    external: true

LXD-Container auf der Qnap

Installation

  1. In der Container Station auf Erstellen gehen
  2. Suchen Sie in der Suchleiste „ubuntu“ und klicke „Registerkarte LXD-Image-Server“.
  3. Wählen das Image aus der Liste, derzeit LTS-Support hat focal (20.04) und installiere
  4. Im Fenster „Container erstellen“ Namen eingeben und CPU- und Speicherressourcen zuweisen
  5. Netzwerkmodus auf Bridge stellen und „Adapter 2“ auswählen (statische IP erstellen wir später)
  6. Da die Option „Erweiterte Ordnerberechtigungen“ aktiviert ist, muss unter „Erweiterte Einstellungen/Gerät“ privilegierte Modus aktiviert werden!
  7. ggf. noch „Shared Folders“ und „Device“ erstellen
  8. Installieren …

Erstellen eines Benutzers in LXD-Containern

  1. Terminal mit „/bin/sh“ ausführen
  2. Benutzer mit adduser {Ihr_Benutzername} anlegen
  3. Sudo-Zugriff ermöglichen mit usermod -aG sudo {Ihr_Benutzername}
  4. Terminal schließen … fertig

statischen IP-Adresse und SSH

  1. In der Konsole Anmelden und sich mit sudo su zu root machen
  2. das obligatorischen apt-get update und apt-get upgrade
  3. Installiere Software apt-get install openssh-server nano
  4. Bearbeite nano /etc/netplan/10-lxd.yaml
    network:
      version: 2
      ethernets: 
        eth0:
          dhcp4: false
          addresses:
             - 192.168.130.20/23
          gateway4: 192.168.130.1
          nameservers:
            addresses: [192.168.130.1, 9.9.9.9]
  5. Befehl netplan apply ausführen

Airprint-Server

Basis dieser Anleitung ist hier zu finden: https://www.johnlose.de/2018/02/drucker-airprint-faehig-machen-auf-ubuntu-16-04-airprint-cups-ubuntu-xenial/

Wir erstellen uns auf der NAS einen LXC-Container (ubuntu-bionic:latest) und bringen den auf den aktuellen stand
sudo apt-get update && sudo apt-get upgrade
Anschließend installieren wir alles notwendige:
sudo apt-get install avahi-daemon cups python python-lxml python-cups wget nano

Update: 20.11.2021
LXC-Container werden demnächst nicht mehr unterstützt. Verwendung finden sollen jetzt LXD-Container. Infos dazu gibt es hier : https://www.qnap.com/de-de/how-to/tutorial/article/ausf%C3%BChren-von-lxd-container-instanzen-in-container-station

Anschließend configurieren wir CUPS
Zuerst erlauben wir die Administration über das Netzwerk. Später können wir den CUPS-Server von einem beliebigen Client im Netzwerk in einem Webbrowser administrieren.
sudo cupsctl --remote-admin
Die nächste Einstellung ermöglicht es, dass die lokal eingerichteten Drucker im Netzwerk geteilt werden (Drucker-Freigabe).
sudo cupsctl --share-printers
Die folgende Einstellung ermöglicht das Drucken von einem beliebigen Computer im Netzwerk.
sudo cupsctl --remote-any

sudo usermod -aG lpadmin pole
sudo systemctl restart cups

AVAHI konfigurieren

Jetzt möchten wir den Drucker noch in Bonjour (AVAHI) in meinem Netz auffindbar machen. Weil die Generierung eines Printerservices in AVAHI ziemlich heftig ist, gibt es dazu ein schickes Script von Timothy J Fontaine: „Airprint-Generate“. Das holen wir uns mal eben ab: wget https://raw.githubusercontent.com/tjfontaine/airprint-generate/master/airprint-generate.py

und machen es ausführbar, chmod +x airprint-generate.py

und führen es aus. ./airprint-generate.py

Das Ding generiert eine Datei in meinem Folder, welche ich Euch als Beispiel mal kurz zeige (und damit auch den Grund, warum das script von tjfontaine so cool ist):

<?xml version="1.0" ?>
<!DOCTYPE service-group SYSTEM 'avahi-service.dtd'>
<service-group>
<name replace-wildcards="yes">AirPrint Kyocera_FS-1370DN @ %h</name>
<service>
<type>_ipp._tcp</type>
<subtype>_universal._sub._ipp._tcp</subtype>
<port>631</port>
<txt-record>txtvers=1</txt-record>
<txt-record>qtotal=1</txt-record>
<txt-record>Transparent=T</txt-record>
<txt-record>URF=none</txt-record>
<txt-record>rp=printers/Kyocera_FS-1370DN</txt-record>
<txt-record>note=Kyocera FS-1370DN</txt-record>
<txt-record>product=(GPL Ghostscript)</txt-record>
<txt-record>printer-state=3</txt-record>
<txt-record>printer-type=0x809054</txt-record>
<txt-record>pdl=application/octet-stream,application/pdf,application/postscript,application/vnd.cups-raster,image/gif,image/jpeg,image/png,image/tiff,image/urf,text/html,text/plain,application/vnd.adobe-reader-postscript,application/vnd.cups-command</txt-record>
</service>
</service-group>

 

Die Datei (heißt bei Euch anders) schiebe ich nur noch in die Bonjour AVAHI-Services: mv AirPrint-Lexmark_MS310_Series.service /etc/avahi/services

und starte den AVAHI Dienst kurz durch: /etc/init.d/avahi-daemon restart

Das war’s dann auch.