<!--{"title": "Der eigene DNS-Server im Homelab", "date": "2024-04-22", "slug": "der-eigene-dns-server-im-homelab", "cover": "/static/img/der-eigene-dns-server-im-homelab.png"}-->
**Wer ein eigenes Homelab betrieben möchte, kommt oft an einen Punkt, an der die Verwendung von IP-Adressen zur Abgrenzung von Diensten nicht mehr ausreichend ist. Insbesondere, um im Homelab Dienste bereitzustellen, welche mit TLS-Verbindungen arbeiten, ist eine Namensauflösung gefragt.
Ich zeige euch heute eine einfache Möglichkeit, euren eigenen DNS-Server im Homelab bereitzustellen.**

## Was ist ein DNS-Server

Ein DSN-Server, oder Domain Name System Server, ist ein grundlegendes Element der Internetinfrastruktur, das eine entscheidende Rolle bei der Auflösung von Domainnamen in IP-Adressen spielt. Kurz gesagt, ein DNS-Server fungiert als eine Art "Telefonbuch" des Internets, das Domainnamen wie z. B. "example.com" in die entsprechenden IP-Adressen wie "192.0.2.1" übersetzt.

Der DNS-Server erfüllt folgende Hauptaufgaben:

* **Auflösung von Domainnamen:** Wenn ein Benutzer im Internet eine Website aufruft, sendet sein Browser eine Anfrage an den DNS-Server, um die IP-Adresse der Website zu finden, die mit dem eingegebenen Domainnamen verknüpft ist.
* **Verteilung von Anfragen:** DNS-Server sind hierarchisch organisiert und können in verschiedene Kategorien wie Root-Server, Toplevel-Domain-Server und Authoritative-Server unterteilt sein. Sie arbeiten zusammen, um DNS-Anfragen effizient zu verarbeiten und die entsprechenden IP-Adressen zurückzugeben.
* **Caching:** DNS-Server können die Ergebnisse von vorherigen Anfragen zwischenspeichern, um die Antwortzeit zu verkürzen und die Netzwerkbelastung zu reduzieren. Dieser Prozess wird als Caching bezeichnet.

Insgesamt spielt der DNS-Server eine entscheidende Rolle bei der Navigation im Internet, indem er Domainnamen in die entsprechenden IP-Adressen auflöst und somit eine nahtlose Kommunikation zwischen den verschiedenen Computern und Servern im Netzwerk ermöglicht.

## Verwendung von DNS-Namen im Homelab

In einem Homelab, das für private oder Testzwecke betrieben wird, können Sie im Allgemeinen beliebige Domainnamen verwenden, solange sie nicht bereits von einem öffentlichen Domainnamen registriert wurden. Ein Homelab bietet Ihnen die Freiheit, eine Domänennamenstruktur zu verwenden, die Ihren Bedürfnissen und Vorlieben entspricht. Hier sind einige allgemeine Richtlinien und Beispiele für Domainnamen, die in einem Homelab verwendet werden können:

* .local: Dies ist eine der häufigsten TLDs für interne Netzwerke und wird von vielen Organisationen verwendet.
* .lan: Eine weitere beliebte Wahl für interne Netzwerke, die als Alternative zu ".local" verwendet werden kann.
* .home: Obwohl ".home" in einigen Fällen öffentlich registriert ist, wird es oft für private Netzwerke verwendet, solange es keine Konflikte gibt.
* .internal: Diese TLD wird oft für interne Netzwerke verwendet, um sie von öffentlichen Domains zu unterscheiden.
* .intra: Diese TLD wird oft für interne Netzwerke verwendet, um sie von öffentlichen Domains zu unterscheiden.
* .corp: Ähnlich wie ".internal" wird ".corp" oft für private Netzwerke verwendet.
* Subdomains eines öffentlichen Domainnamens: Wenn Sie bereits über eine registrierte Domain verfügen, können Sie Subdomains für Ihr Homelab verwenden, z. B. "homelab.meinefirma.com".

Es ist wichtig sicherzustellen, dass die von Ihnen verwendeten Domainnamen eindeutig sind und nicht mit echten Domains im Internet kollidieren, um Konflikte und Probleme mit der Namensauflösung zu vermeiden.

## Einrichtung eines DNS-Servers im Homelab unter Docker

Ich gehe davon aus, das Sie bereit Docker in Ihrem Netzwerk konfiguriert haben. Ebenso sollten Sie einen Reverse-Proxy wie Traefik konfiguriert haben.

Sehen Sie sich gerne mein Tutorial an:
[Traefik richtig im Homelab oder Unternehmen mit eigenen Zertifikaten einrichten](/post/traefik-richtig-im-homelab-oder-unternehmen-mit-eigenen-zertifikaten-einrichten)

Dies ist insbesondere dann erforderlich, wenn Sie die verschlüsselten Protokolle (z.B.: DNS-over-HTTPS) nutzen wollen.
Ich nutze die offizielle docker-compose.yml um die Nutzung im vorbereiteten Umfeld zu zeigen:

```
version: "3"
services:
  dns-server:
    container_name: dns-server
    hostname: dns-server
    image: technitium/dns-server:latest
    # For DHCP deployments, use "host" network mode and remove all the port mappings, including the ports array by commenting them
    # network_mode: "host"
    ports:
      - "5380:5380/tcp" #DNS web console (HTTP)
      # - "53443:53443/tcp" #DNS web console (HTTPS)
      - "53:53/udp" #DNS service
      - "53:53/tcp" #DNS service
      # - "853:853/udp" #DNS-over-QUIC service
      # - "853:853/tcp" #DNS-over-TLS service
      # - "443:443/udp" #DNS-over-HTTPS service (HTTP/3)
      # - "443:443/tcp" #DNS-over-HTTPS service (HTTP/1.1, HTTP/2)
      # - "80:80/tcp" #DNS-over-HTTP service (use with reverse proxy or certbot certificate renewal)
      # - "8053:8053/tcp" #DNS-over-HTTP service (use with reverse proxy)
      # - "67:67/udp" #DHCP service      
    environment:
      - DNS_SERVER_DOMAIN=dns-server #The primary domain name used by this DNS Server to identify itself.
      # - DNS_SERVER_ADMIN_PASSWORD=password #DNS web console admin user password.
      # - DNS_SERVER_ADMIN_PASSWORD_FILE=password.txt #The path to a file that contains a plain text password for the DNS web console admin user.
      # - DNS_SERVER_PREFER_IPV6=false #DNS Server will use IPv6 for querying whenever possible with this option enabled.
      # - DNS_SERVER_WEB_SERVICE_HTTP_PORT=5380 #The TCP port number for the DNS web console over HTTP protocol.
      # - DNS_SERVER_WEB_SERVICE_HTTPS_PORT=53443 #The TCP port number for the DNS web console over HTTPS protocol.
      # - DNS_SERVER_WEB_SERVICE_ENABLE_HTTPS=false #Enables HTTPS for the DNS web console.
      # - DNS_SERVER_WEB_SERVICE_USE_SELF_SIGNED_CERT=false #Enables self signed TLS certificate for the DNS web console.
      # - DNS_SERVER_OPTIONAL_PROTOCOL_DNS_OVER_HTTP=false #Enables DNS server optional protocol DNS-over-HTTP on TCP port 8053 to be used with a TLS terminating reverse proxy like nginx.
      # - DNS_SERVER_RECURSION=AllowOnlyForPrivateNetworks #Recursion options: Allow, Deny, AllowOnlyForPrivateNetworks, UseSpecifiedNetworks.
      # - DNS_SERVER_RECURSION_DENIED_NETWORKS=1.1.1.0/24 #Comma separated list of IP addresses or network addresses to deny recursion. Valid only for `UseSpecifiedNetworks` recursion option.
      # - DNS_SERVER_RECURSION_ALLOWED_NETWORKS=127.0.0.1, 192.168.1.0/24 #Comma separated list of IP addresses or network addresses to allow recursion. Valid only for `UseSpecifiedNetworks` recursion option.
      # - DNS_SERVER_ENABLE_BLOCKING=false #Sets the DNS server to block domain names using Blocked Zone and Block List Zone.
      # - DNS_SERVER_ALLOW_TXT_BLOCKING_REPORT=false #Specifies if the DNS Server should respond with TXT records containing a blocked domain report for TXT type requests.
      # - DNS_SERVER_BLOCK_LIST_URLS= #A comma separated list of block list URLs.
      # - DNS_SERVER_FORWARDERS=1.1.1.1, 8.8.8.8 #Comma separated list of forwarder addresses.
      # - DNS_SERVER_FORWARDER_PROTOCOL=Tcp #Forwarder protocol options: Udp, Tcp, Tls, Https, HttpsJson.
      # - DNS_SERVER_LOG_USING_LOCAL_TIME=true #Enable this option to use local time instead of UTC for logging.
    volumes:
      - config:/etc/dns
    restart: unless-stopped
    sysctls:
      - net.ipv4.ip_local_port_range=1024 65000
 
volumes:
    config:
```

