Traefik Setup mit OPNsense, Pi-Hole & Cloudflare

1. Cloudflare Domain, A-Record, CNAME, Token:

Als erstes benötigen wir eine Domain, ich habe diese auf Cloudflare gehostet. Dazu erstellt Ihr euch einen kostenlosen Account auf cloudflare.com und bestellt dann eine kostenpflichtige Domain.

In diesen Beispiel verwende ich testspage.org

Sofern die Domain freigeschalten wurde muss ein A Record erstellt werden. Dazu klickt Ihr links auf DNS und dann auf Eintrag hinzufügen.

Dort wählt Ihr als Typ “A” , gebt bei Name @ und bei IPv4-Adresse 12.345.6.78 ein. Die IPv4 Adresse stehlt eure öffentliche IP Adresse dar, diese müsst Ihr hier nicht eintragen dazu erstellen wir gleich einen Docker Container der diese dann automatisch (DDNS) aktualisiert.

Nachdem der A-Record angelegt wurde könnt Ihr noch verschiedene Subdomains anlegen. Hier wähle ich traefik.testspage.org als Dashboard Website für Traefik.

Also nocheinmal auf Eintrag hinzufügen und als Typ “CNAME” auswählen.

Das ganze sollte dann so aussehen. Name traefik (Subdomain) Ziel @ (dort wird dann die Hauptdomain ausgewählt).

Jetzt benötigen wir noch einen API Token um die eingegeben öffentliche IP Adresse aktualisieren zu können.

Dazu geht Ihr oben rechts auf Mein Profil und klickt dann links auf API-Token.

Der neue Token wird dann wie folgt erstellt:

Nachdem Ihr Token erstellen angeklickt habt, scrollt Ihr ganz nach unten und wählt Benutzerdefiniertes Token erstellen aus. Dann gebt Ihr folgende Werte ein.

Nachdem Ihr den Token erstellt habt kopiert Ihr euch diesen in die Zwischenablage oder in den Notizen, diesen benötigen wir jetzt gleich.

2. DDNS Docker Container:

Nun benötigen wir einen Container bzw. ein Script das uns natürlich unsere öffentliche IP anpasst bzw. aktualisiert falls der Provider diese ändert. Dazu sollte der Server auf dem der Container läuft 24/7 im Einsatz sein. Da bietet sich natürlich ein Raspberry Pi an 😉

Dort erstellt Ihr dann diese docker-compose.yml

version: '2'
services:
  cloudflare-ddns:
    image: oznu/cloudflare-ddns:latest
    restart: always
    environment:
      - API_KEY=DDNS-token-aus-der-zwischenablage
      - ZONE=testspage.org
      - PROXIED=true
      - PUID=998
      - PGID=100

Nachdem Ihr den Container mit docker-compose up gestartet habt bekommt Ihr eine Rückmeldung das die DNS geupdatet wurde.

3. OPNsense Einstellungen:

Um später die Traefik Anfragen auf den entsprechenden Server umleiten zu können muss in OPNsense unter Firewall – NAT – Port Forward eine bzw. zwei neue Regeln angelegt werden. Hierbei öffnen wir Port 80 & 443.

Wie Ihr sehen könnt leite ich alle Anfragen auf Port 80 & 443 auf meinen Server mit der IP: 192.168.2.182 weiter.

4. Pi-Hole Setting:

In Pi-Hole muss eigentlich nur ein DNS Record für die dazugehörige Seite & Server angelegt werden. Dazu geht Ihr auf Local DNS – DNS Records und fügt hier einen neuen Record hinzu.

Somit wird der traffic nicht blockiert sondern weiter an euren Server geleitet.

5. Traefik Setup:

Nun zum eigentlichen Hauptteil, Traefik.

Hierzu benötigen wir wieder einen Server der 24/7 im Einsatz ist. Am besten der selbe auf dem auch schon der DDNS Container läuft.

Dort sieht bei mir die Ordnerstruktur so aus.

mkdir traefik && cd traefik
mkdir data

In die docker-compose.yml Datei fügt Ihr folgendes ein.

nano docker-compose.yml
version: '3.5'

services:
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
       proxy:
    ports:
      - 80:80
      - 443:443
    environment:
      - CF_API_EMAIL=die-email-adresse-eures-cloudflare-accounts
      - CF_DNS_API_TOKEN=erstellter-DNS-Token-für-eureDomain

    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
      - ./data/config.yml:/config.yml:ro
      - ./data/logs:/var/log/traefik
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`traefik.testspage.org`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=user:passwdwelcheserstelltwurde"
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`traefik.testspage.org`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=cloudflare"
      - "traefik.http.routers.traefik-secure.tls.domains[0].main=traefik.testspage.org"

      - "traefik.http.routers.traefik-secure.service=api@internal"


networks:
  proxy:
    name: proxy
    external: true

Hier gibt es nun einige Besonderheiten.

Ihr benötigt die email Adresse eures Cloudflare Accounts und einen API Token für eure Domain, hier als Bsp. testspage.org

Diesen bekommen wir wieder auf Cloudflare – Mein Profil – API-Token.

Nachdem der Token so erstellt wurde kopiert Ihr euch diesen und fügt Ihn anschließend in die docker-compose.yml Datei ein.

Bei dem Punkt: traefik.http.middlewares.traefik-auth.basicauth.users müsst Ihr einen User und ein htpasswd erstellen und zwar mit diesem Befehl:

htpasswd -c /home/zimaboard/docker/traefik/.htpasswd Test

Wobei Ihr hier die Dateistruktur an eure anpassen müsst und Test als User verwendet wird. Nachdem der Befehl in der Konsole ausgeführt wurde werdet Ihr nach einem Password gefragt. Wenn dieser Vorgang abgeschlossen ist könnt Ihr mit diesem Befehl das generierte Passwort anzeigen:

cat /home/zimaboard/docker/traefik/.htpasswd

Das kopiert Ihr euch raus und fügt es in die docker-compose.yml Datei ein. Diese Combination aus User & Passwort wird dann verwendet um sich auf dem Traefik Dashboard anzumelden.

Im Unterordner data müssen dann noch 3 Dateien angelegt werden.

cd data

Die acme.json welche lehr bleibt:

touch acme.json
chmod 600 acme.json

Die config.yml welche ebenfalls lehr bleibt:

touch config.yml

Und die traefik.yml mit diesen Zeilen

api:
  dashboard: true
  debug: true
entryPoints:
  http:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: https
          scheme: https
  https:
    address: ":443"
serversTransport:
  insecureSkipVerify: true
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
  file:
    filename: /config.yml
certificatesResolvers:
  cloudflare:
    acme:
      email: eurecloudflareemailadresse
      storage: acme.json
      dnsChallenge:
        provider: cloudflare
        #disablePropagationCheck: true # uncomment this if you have issues pulling certificates through cloudflare, By setting this flag to true disables the need to wait for the propagation of the TXT record to all authoritative name servers.
        resolvers:
          - "1.1.1.1:53"
          - "1.0.0.1:53"

6. Starten des Traefik Containers:

Nachdem alle vorherigen Schritte vorgenommen wurden muss noch das Netzwerk proxy erstellt werden:

docker network create proxy

dann kann der Traefik Container mit docker-compose up gestartet werden.

Falls Ihr in der Konsole keine Fehlermeldungen bekommt gebt Ihr nun einfach in der Browserzeile: traefik.testspage.org ein und Ihr landet auf dieser Seite:

Dort müsst Ihr euch dann mit den vorher angelegten User & Passwort anmelden.

7. Weitere Container mit Traefik:

Der Sinn von Traefik liegt natürlich darin das wir interne Netzwerk Container öffentlich freigeben wollen.

Um dies zu erreichen müsst Ihr eure bisherigen Container einfach mit Traefik Labels versehen. Das ganze sieht dann so aus.

version: "3.3"
services:
  homepage1:
    image: ghcr.io/gethomepage/homepage:latest
    container_name: homepage1
#    ports:
 #     - 3005:3000
    restart: always
    volumes:
      - ./config:/app/config 
      - /var/run/docker.sock:/var/run/docker.sock:ro 
    networks:
      proxy:

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.homepage.entrypoints=http"
      - "traefik.http.routers.homepage.rule=Host(`homepage.testspage.org`)"
      - "traefik.http.middlewares.homepage-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.homepage.middlewares=homepage-https-redirect"
      - "traefik.http.routers.homepage-secure.entrypoints=https"
      - "traefik.http.routers.homepage-secure.rule=Host(`homepage.testspage.org`)"
      - "traefik.http.routers.homepage-secure.tls=true"
      - "traefik.http.routers.homepage-secure.service=homepage"
      - "traefik.http.services.homepage.loadbalancer.server.port=3000"
networks:
  proxy:
    external: true

Hier ist es natürlich wichtig erst wieder eine Subdomain (homepage.testspage.org) mit dazugehörigen CNAME Record auf cloudflare.com anzulegen. Ebenso muss auf unserem Pi-Hole die Domain homepage.testpage.org mit der jeweiligen IP Adresse eures Server verknüpft werden.

Nachdem der Container gestartet wurden könnt Ihr nun das Homepage Dashboard auf https://homepage.testspage.org finden.

Ein Gedanke zu “Traefik Setup mit OPNsense, Pi-Hole & Cloudflare

Schreibe einen Kommentar

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