Erweitert: Traefik mit interner Namensauflösung

Änderungsstand: 2020-12-23

2020-12-23: Am Ende wurde eine Info eingefügt (bin selbst reingefallen 🙂 .

2020-12-19: Eine Info am Ende des Guides wurde hinzugefügt.

2020-12-13: Ich änderte die Domain von home.net auf home.lan, da home.net eine öffentliche Domain ist.

Ich verwende diese Konfiguration schon ’ne ganze Weile, hatte aber bisher noch nicht die Zeit bzw. die Lust, das niederzuschreiben. Da ich die Tage zufällig auf eine ähnliche Konfiguration bei Christian von teqqy.de gestoßen bin, ich dann aber doch eine etwas andere Traefik-Konfiguration verwende, entschloss ich mich, das endlich mal zu dokumentieren 🙂

Der Link zu Christian von teqqy.de:

https://teqqy.de/interne-namensaufloesung-bei-docker-mit-traefik/

Ich verwende Traefik, als Reverse-Proxy mit integriertem Letsencrypt, um über das Internet auf meine internen Dienste, gesichert, zugreifen zu können. Jetzt möchte ich allerdings, dass zusätzlich meine internen Dienste, die nicht von Außen erreichbar sein sollen, mittels Namen angesprochen werden und nicht per IP-Adresse.

Als Voraussetzung dient hierbei ein eigens eingerichteter DNS-Server, welchen ich auf einen Raspi3 installierte und der nur für diesen einen Zweck sein Dasein bekundet. Hier geht’s zum Guide. Wer einen Server mit VM’s betreibt, könnte auch eine minimale Buster-Server-Lite-Version als VM installieren und dort den DNS aufsetzen. Ich wollte es allerdings gezielt separat.

Nachträgliche Konfiguration des eigenen DNS-Servers:

Zuerst editiere/erweitere ich, für mein folgendes Vorhaben, eine Datei auf dem Raspi, meinem eigenen DNS-Server:

sudo nano /etc/bind/db.home.lan

Dort füge ich folgende Zeile am Ende ein und ändere die serial-Nummer in Zeile 2:

 *            IN A 192.168.1.128

STRG-x, y, Enter

Dieser Eintrag bedeutet, dass es sich um ein A-Record handelt, der als Wildcard auf meiner Traefik-VM (192.168.1.128) zeigt. Somit kann ich mit Traefik beliebig viele Zuweisungen, wie z.B. in meinem folgenden Beispiel mit whoami (whoami.home.lan), für den internen Gebrauch, anlegen.

Unbedingt die „serial“-Nummer in Zeile 2 ändern, da es sonst zu Problemen bei der Erkennung kommen kann! Die „serial“ sollte übrigens bei jeder Änderung in der jeweiligen Datei, wo die „serial“ aufgeführt wird, geändert werden!

Man kann auch die Sache etwas komplizierter machen (oder einfacher, je nach dem, von welchem Standpunkt man ausgeht), indem man später in der whoami-docker-compose.yml nicht „whoami.home.lan“ verwendet, sondern „whoami.debian-traefik.home.lan“. debian-traefik ist in diesem Fall der Hostname meiner traefik-VM. Aber das sei nur am Rande erwähnt.

sudo service bind9 restart

Das Terminal des DNS-Servers kann wieder geschlossen werden.

VM Konfiguration:

Wurde das DNS eingerichtet, konfiguriere ich nun meine VM, auf welcher Traefik betrieben wird. Natürlich basiert auch hier alles auf meiner eigenen DNS-Config und muss unter Umständen angepasst werden.

sudo nano /etc/hosts
127.0.0.1        localhost
#127.0.1.1       debian-traefik
192.168.1.128    debian-traefik.home.lan debian-traefik

# The following lines are desirable for IPv6 capable hosts
#::1     localhost ip6-localhost ip6-loopback
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters

STRG-x, y, Enter

Das IPv6-Gedöns deaktivierte ich und legte in Zeile 3 einen Host-und Domainnamen an. Die IP meines traefik-Servers ist die 192.168.1.128.

Dann setze ich noch die IP des Raspi als Namensauflösung (dns-nameservers) in der Traefik-VM:

nano /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug enp2s0
iface enp2s0 inet static
  address 192.168.1.128
  netmask 255.255.255.0
  gateway 192.168.1.1
  dns-nameservers 192.168.1.49

STRG-x, y, Enter

  • adress: Feste IP-Vergabe meiner VM
  • gateway: Mein Edge-Router (bei einer FritzBox mit der Standardkonfiguration sollte dort 192.168.178.1 stehen)
  • dns-nameserver: Mein Raspi mit dem eingerichteten DNS-Server
nano /etc/resolv.conf
domain home.lan
nameserver 192.168.1.49

STRG-x, y, Enter

Hier ist es wichtig, dass als Nameserver nur die IP des Raspi, auf dem der DNS-Server eingerichtet wurde, eingetragen wird.

sudo reboot

Zum Testen gebe ich folgende 2 Befehle ein:

dnsdomainname

Als Ausgabe bekomme ich:

home.lan

Und noch:

hostname --fqdn

Als Ausgabe bekomme ich:

debian.traefik.home.lan

Wird jetzt bei einem apt update alles Fehlerfrei abgearbeitet, ist auch der DNS-Server am Laufen. Wer immer noch zweifelt, ob nun auch der richtige DNS-Server verwendet wird, kann das am einfachsten testen, indem man entweder folgenden Befehl am DNS-Server absetzt

sudo service bind9 stop

oder den Raspi vom Netz nimmt und nochmals apt update verwendet. Jetzt müssen dort Fehlermeldungen, wie im folgendem Beispiel erscheinen.

root@debian-traefik:~# apt update
Fehl:1 http://security.debian.org/debian-security buster/updates InRelease
  Temporärer Fehlschlag beim Auflösen von »security.debian.org«
Fehl:2 http://ftp.tu-chemnitz.de/debian buster InRelease
  Temporärer Fehlschlag beim Auflösen von »ftp.tu-chemnitz.de«

Falls bind9 gestoppt wurde, das Einschalten nicht vergessen:

sudo service bind9 start

Ein weiterer Test wäre z.B nslookup. Dafür muss folgendes installiert werden:

apt install dnsutils -y
nslookup google.de

Mit folgender Ausgabe wird bestätigt, dass mein eigener DNS-Server angesprochen wird.

Server:         192.168.1.49
Address:        192.168.1.49#53

Non-authoritative answer:
Name:   google.de
Address: 172.217.169.67
Name:   google.de

Das war soweit die Konfiguration der Buster-VM, auf welcher Traefik läuft. Nicht vergessen, den Raspi wieder einzuschalten 🙂

Traefik – Nachträgliche Konfiguration:

Nun konfiguriere ich Traefik mit einigen Kleinigkeiten nach. Wie immer, basiert alles auf meiner eigenen Traefik-Konfiguration, wie sie in den vorherigen Guides beschrieben wurde, wie z.B. hier oder hier beschrieben.

Als Erstes erweitere bzw. ersetze ich meine docker-compose.yml von Traefik. Diese sieht jetzt so aus:

sudo nano /home/dockervolumes/traefik/docker-compose.yml
version: '3'

services:
  traefik:
    image: "traefik:v2.2"
    container_name: "traefik"
    hostname: "traefik"
    restart: unless-stopped

    security_opt:
      - no-new-privileges:true

    networks:
      - traefik-net
      - default

    ports:
      - 80:80
      - 443:443
      - 8080:8080

    volumes:
      - "/etc/localtime:/etc/localtime:ro"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "/var/log/traefik.log:/traefik.log"
      - "./traefik.yml:/traefik.yml:ro"
      - "./acme.json:/acme.json"
      - "./dynamic_conf.yml:/dynamic_conf.yml:ro"
      - "./.htpasswd:/.htpasswd:ro"
      - "./.htpasswd1:/.htpasswd1:ro"
      - "./.htpasswd2:/.htpasswd2:ro"

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.knilix.duckdns.org`)"
#
# folgende Zeile gehört zur Passwortabfrage
      - "traefik.http.middlewares.traefik-auth.basicauth.usersfile=.htpasswd"
#
      - "traefik.http.routers.traefik.middlewares=https-redirect@file"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.knilix.myhome-server.de`)"
#
# folgende Zeile gehört zur Passwortabfrage
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
#
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=lets-encr"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  traefik-net:
    external:
      name: traefik-net
  default:
    driver: bridge

STRG-x, y, Enter

cd /home/dockervolumes/traefik && sudo docker-compose up -d

Die traefik.yml bedarf keiner Änderung.

Des Weiteren benötige ich einen internen DNS-Server. Dieser wird bei mir mittels bind9 auf einem Raspi 3 betrieben. Am Anfang des Guides habe ich es erwähnt.

Whoami – Einrichtung:

Jetzt möchte ich, dass als Beispiel, der Dienst Whoami mittels Adresse whoami.home.net angesprochen wird. Andere Dienste/Docker können dafür auch eingesetzt werden und verwenden ebenfalls den angelegten Namen und nicht die IP-Adresse. Dafür erstelle ich die Docker-Compose für whoami:

sudo mkdir /home/dockervolumes/whoami
sudo nano /home/dockervolumes/whoami/docker-compose.yml
version: "3.3"

services:
   whoami:
    image: "containous/whoami"
    container_name: "whoami"
    hostname: "whoami"
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.entrypoints=http"
      - "traefik.http.routers.whoami.rule=Host(`whoami.home.lan`)"
      - "traefik.http.services.whoami.loadbalancer.server.port=80"

    networks:
      - traefik-net
      - default

networks:
  traefik-net:
    external:
      name: traefik-net
  default:
    driver: bridge

STRG-x, y, Enter

cd /home/dockervolumes/whoami && sudo docker-compose up -d

Aufruf des Whoami ist jetzt, intern, mit folgender Adresse möglich:

http://whoami.home.lan

Info: Das funktioniert aber nur, wenn am Rechner, von dem aus „whoami“ aufgerufen wird, der eigene DNS-Server auch eingetragen und verwendet wird.

Erstelle eine Website wie diese mit WordPress.com
Jetzt starten