Pihole Docker, network_mode=host und Binding auf einzelne IPs

Hi,

pihole läuft aktuell schon mal gut unter Docker. Jetzt würde ich nur gerne network_mode von bridge auf host umstellen. Da ich aber parallel noch ein powerdns für mein internes DNS laufen habe kollidiert mir das jedes mal mit dem Port Binding 0.0.0.0:53 des Pihole.

Gibt es hier die Möglichkeit dem Pihole zu sagen, er soll nur auf bestimmte IPs binden? Immerhin habe ich mehr als eine IPv4/v6 auf dem Raspberry konfiguriert.

Danke schon mal.

That's something you have to configure with the docker container. Any changes to Pi-hole would only happen inside the container and interface binding is handled by docker.

You might be able to use listen-address:

Um zunächst Dans Anmerkungen übersetzt zusammenzufassen:

Es ist zuerst Docker, der auf 0.0.0.0 bindet und DNS/Port 53 zum Pi-hole-Container weiterleitet.
Pi-holes eigenes Verhalten kommt erst in zweiter Linie zum Zug und liesse sich ggf. durch eine geeignete Kombination der dnsmasq-Optionen listen-address, interface und bind-interfaces beinflussen.

Ob das funktioniert, hängt allerdings auch vom verwendeten BS ab.
Außerdem würde eine solche Konfiguration u.U. von Pi-hole bei Updates überschrieben, da zumindest interface von Pi-hole selbst verwendet wird.
Zusätzlich würden die Einstellungen auch berücksichtigen müssen, ob PowerDNS lokal installiert ist oder ebenfalls als Docker-Container läuft.

Bevor Du mit den Docker-Einstellungen und diesen Optionen experimentierst:
Ist Dein Netzwerk zwingend darauf angewiesen, PowerDNS direkt über Port 53 zu erreichen?
Oder lassen sich die Port-Konflikte mit PowerDNS vermeiden?

Z.B. könnte Pi-hole als lokaler DNS-Server entweder alle Anfragen upstream oder lokale Anfragen gezielt per Conditional Forwarding an PowerDNS auf einem anderen Port weiterleiten.

Hier mal meine docker-compose.yml

version: "3"
services:
  pihole:
    container_name: pihole
    hostname: pihole-1
    image: pihole/pihole:latest
    network_mode: host
    ports:
      - "10.1.1.10:53:53/tcp"
      - "10.1.1.10:53:53/udp"
      - "80:80/tcp"
      - "fd00:cafe:1337::10:53:53/tcp"
      - "fd00:cafe:1337::10:53:53/udp"
    environment:
      VIRTUAL_HOST: 'pihole.example.com'
      TZ: 'Europe/Berlin'
      WEBPASSWORD: '*****'
      DNS1: 10.1.1.11
      DNS2: 10.1.1.12
      IPAddress: 10.1.1.10
      IPv6Address: "fd00:cafe:1337::10"
    volumes:
       - "./etc-pihole/:/etc/pihole/"
       - "./etc-dnsmasq.d/:/etc/dnsmasq.d/"
       - "./log-pihole/pihole.log:/var/log/pihole.log"
    dns:
      - 127.0.0.1
      - 10.1.1.11
    restart: unless-stopped

Eigentlich sollte Docker damit doch den Container nur an 10.1.1.10 binden. An non-local-bind hatte ich gedacht, damit der container auch startet, falls die VIP gerade nicht verfügbar ist. OS ist Raspbian 10 lite. docker-ce 20.10.
Nur Pihole läuft als Container, PowerDNS nicht.

PowerDNS läuft auf Port 53, einfach weil Pihole bei der angabe 10.1.1.11:5301 den start verweigert mit der Meldung "IP (10.1.1.12:5301) is invalid!" Host:Port akzeptiert er nicht. Darum auch der Gedanke Pihole und PDNS auf getrennten IPs zu binden.

Ok, richtige Syntax ist host#port. Aber das bringt dann nur das nächste Problem. Die settings für dns im docker-compose.yml
Hier will er dann DNS Server die beim starten von Docker auch erreichbar sind. Da ich aber weder in der resolv.conf noch /etc/network/interfaces einen alternativen Port für DNS angeben kann, müsste ich hier wieder auf google, cloudflare oder andere DNS Server eintragen und für die interne Domain wieder Conditional Forwarding erstellen. Genau das sollte vermieden werden und einfach bereits exisitierende interne DNS Server für den Upstream verwendet werden.

Hier der Auszug aus dem Log, wenn PowerDNS auf Port 5301 läuft

Using IPv4 and IPv6
::: Preexisting ad list /etc/pihole/adlists.list detected ((exiting setup_blocklists early))
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
sudo: unable to resolve host pihole: Temporary failure in name resolution
::: Testing pihole-FTL DNS: FTL started!
::: Testing lighttpd config: Syntax OK
::: All config checks passed, cleared for startup ...
::: Enabling Query Logging
  [i] Enabling logging...
  [✓] Logging has been enabled!
 ::: Docker start setup complete
  [✗] DNS service is not running
  [✗] DNS resolution is not available

Da die zugrundeliegende Problemstellung weniger mit Pi-hole und mehr mit Dockers Netzwerkkonfiguration zu tun hat, würde ich nochmals zu einem eingehenden Blick in Dockers Dokumentation zu Netzwerken raten.

Die Publizierung von Ports (über ports) entfällt im Host-Netzwerkmodus:
Ein Container in diesem Modus wird beim Start versuchen, seine exponierten Ports unmittelbar an das Host-Netzwerkinterface zu binden.

Ist 10.1.1.10 denn die IP-Adresse des Docker-Hosts?

Dockers Host-Netzwerkmodus bedeutet, dass ein Container direkt die Netzwerkkonfiguration des Docker-Hosts verwendet und exponierte Ports somit direkt verwendet werden können. Unabhängig vom gewählten Netzwerkmodus bindet Docker selbst auf 0.0.0.0; im Unterschied zur Standard-Bridge richtet Docker im Hostmodus die jeweiligen Port-Proxys sowie die zugehörigen Firewallregeln für NAT und Portweiterleitung nicht ein.

Wenn zwei Container im Host-Modus dieselben Ports zu binden versuchen, wird das zu denselben Port-Konflikten führen wie bei zwei normalen Prozessen auch, oder wie in Deinem Fall zwischen Docker und dem separat installierten PowerDNS.

Das sollte mit der Angabe von 10.1.1.11#5301 in Pi-holes Konfiguration funktionieren.

Bei Konfiguration von PowerDNS mit Port 5301 müsste natürlich auch docker-compose entsprechend angepasst werden.

Inwieweit Docker selbst eine Portangabe für DNS akzeptiert oder zwingend Port 53 verwendet, müsste bei Docker hinterfragt werden.
Im letzteren Fall liesse sich ein öffentlicher DNS-Server statt 10.1.1.11 für den Container angeben.
Für die Funktion von Pi-hole ist diese Angabe nicht erheblich: Pi-hole wird erlaubte DNS-Anfragen auschliesslich an seine konfigurierten Upstream-DNS-Server weiterleiten.

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.