Pi-Hole als DNS-Server für lokale IP-Adressen

Die Tage kam wieder mal der Wunsch, einen eigenen DNS-Server im lokalen und privaten Netzwerk zu haben. Zufällig bin ich auf eine sehr nützliche Funktion von Pi-Hole Version 5.0 gestoßen. Bin mir nicht sicher ob die Funktion schon in den vorherigen Versionen vorhanden war. Sie ist mir jetzt erst aufgefallen. Die Funktion heißt “Local DNS Record” welches erlaubt lokale IP-Adressen einen eigenen DNS-Namen zu vergeben. Die Fritzbox hat hier leider nicht die ausreichenden Funktionen, das man das was ich möchte abbilden kann.

Die Aufgabenstellung ist wie folgt:

  1. Individuelle DNS-Namen im lokalen Netz
  2. DNS Namen die mit *.local aufrufbar sind
  3. DNS-Server für alle Geräte im Netzwerk verfügbar machen
  4. DNS-Server für VPN OpenVPN/WireGuard verfügbar machen
  5. IP-Adressen zu blocken wegen Werbung und Tracking
  6. Unabhängigkeit von Zeroconf / Avahi mit *.local Gerätenamen
  7. Virtuelle Webserver mit verschiedenen Pseudo-FQDN ansprechen.

Nun die Installation von Pi-Hole kann auf einem Raspberry Pi oder einer virtuellen Maschine mit Rasperry Pi OS erfolgen.  Wichtig ist nur dass eine feste IP-Adresse benutzt wird, damit die IP dann in Fritzbox, Router, WireGuard und lokale Rechner eingetragen werden kann.

Die Installation von Pi-Hole kann hier nachgelesen werden :
https://blog.unixweb.de/ad-blocker-mit-dem-raspberry-pi/

Der nachfolgende Screenshot zeigt das Menü wo der “Local DNS Record” zu finden ist. Die Einträge sind relativ einfach wie in dem Beispiel “gateway1.local” hat die IP-Adresse 192.168.10.90. Die IP-Adresse ist auch noch über “http://iotloragateway.local/” erreichbar, welches für mich ein langer und etwas schwer zu merkender Hostname ist. Nun ist der LoraWAN Gateway über einen einfacheren DNS-Namen erreichbar. 

Somit sind schon viele Punkte der Aufgabenstellung bereits erfüllt.

Pi-Hole DNS Local
Pi-Hole DNS Local

Nun kommt eine nicht alltägliche Anforderung. Apache Webserver ist schon eine wirklich tolle Software. Es lassen sich sehr viele Funktionen abbilden. Eine für mich wichtige Funktion sind “virtuelle Webserver”. Dh. ich möchte einen lokalen Webserver haben, der über mehrere FQDN erreichbar ist.

Beispiel:

  • server1.com
  • server2.com
  • ubuntu1.com
  • webcam.server1.com
  • smarthome.server1.com
  • smartmeter.server1.com

Könnte noch mehr virtuelle Domains hinzufügen, nur das soll erst mal exemplarisch darstellen was gewünscht ist. Die Domains sollen nicht über das Internet aufrufbar sein, sonst müsste ich diese ja registrieren. Nein ich möchte FQDN Domains haben die nur im “lokalen Netzwerk” erreichbar sind.

Die Lösung ist einfach wie simple. In Pi-Hole wird folgender “Local DNS Record” gemacht:

ubuntu1.com -> 192.168.10.44

Im Apache Webserver sind folgende Einträge als VirtualHost vorhanden:

<VirtualHost *:80>
ServerName ubuntu1.com
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/vhosts/ubuntu1.com/htdocs

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf



</VirtualHost>

Mit diesen Eintrag ist der lokale Webserver über den Browser mit “http://ubuntu1.com” erreichbar.
Dort sind eine Vielzahl von Dokumentationen per Markdown Sprache abgelegt.
Weitere Infos : https://www.mkdocs.org/

Somit sind weitere Punkte der Aufgabenstellung erledigt.

Nun kommt eine größere Herausforderung und zwar dass alle DNS-Namen per VPN mit WireGuard erreichbar sind. Auf die Installation von WireGuard möchte ich jetzt nicht weiter eingehen da diese auf einem Raspberry Pi über einen einfachen Aufruf in der Shell ausgeführt wird.

curl -L https://install.pivpn.io | bash

Auf dem WireGuard Server müssen soweit keine Änderungen gemacht werden. Beim erstellen der privaten Schlüssel für ein Android Smartphone mit “pivpn add” wird eine CONF-Datei erzeugt die wie folgt aussieht:

[Interface]
PrivateKey = WIWQvX723443243443453453453453453435353534534
Address = 10.6.0.2/24
DNS = 208.67.222.222, 208.67.220.220

[Peer]
PublicKey = yJKK97vQJ353535353535351353535235354t543t6444t4
PresharedKey = euc43534543534543647575757575757567575775756
Endpoint = wireguard.dnsfor.me:51820
AllowedIPs = 0.0.0.0/0, ::0/0

Die Datei kann mit jedem normalen UNIX-Text Editor bearbeitet werden, da diese nicht Binär vorliegt. Geändert wird die Zeile mit dem DNS Eintrag:

[Interface]
PrivateKey = …….
Address = 10.6.0.2/24
DNS = 192.168.10.92, 208.67.220.220

Die 192.168.10.2 ist  die IP-Adresse des Pi-Hole, der ja für uns als eigener lokaler DNS-Server arbeitet. Wenn das CONF-File auf den Smartphone hochgeladen und in WireGuard eingebunden wurde, kann der DNS-Eintrag nochmal überprüft werden.

Nun bauen wir eine VPN-Verbindung mit dem Smartphone zum WireGuard Server auf. Wenn die Verbindung erfolgreich ist, können nun lokale Webserver aufrufen werden, wie gewünscht mit “http://ubuntu1.com” . Die erfolgreiche VPN-Verbindung wird rechts oben durch das Schlüsselsymbol angezeigt.

Jetzt ist es fertig aufgebaut und alles kann wie in der Aufgabenstellung beschrieben genutzt werden. Das ist mal so eine richtige Rundumlösung, für verschiedene Anforderungen, die natürlich beliebig erweitert werden kann.

Bei Fragen, bitte Kommentarfunktion nutzen.

Wünsche viel Spaß beim basteln und konfigurieren.

Grüße Joachim

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.