Einen eigenen DNS Server auf Hashicorp Nomad mit Bind9 ausrollen

3 min zu lesen.

Willkommen zu meinem neuesten Blogbeitrag, in dem ich dir einen tiefen Einblick in die Welt der DNS-Server gebe und zeige, wie du mithilfe von Nomad und Bind9 deinen eigenen DNS-Server auf einem Ubuntu-System einrichten kannst. Diese Anleitung ermöglicht es dir, eine individuelle Domain zu hosten und die Kontrolle über deine Netzwerkkommunikation zu übernehmen.

Warum einen eigenen DNS-Server?

Das Domain Name System (DNS) ist ein essentieller Bestandteil jedes Netzwerks, da es die Zuordnung von Domainnamen zu IP-Adressen ermöglicht. Die Einrichtung eines eigenen DNS-Servers bietet nicht nur mehr Kontrolle, sondern ermöglicht auch die Anpassung nach individuellen Bedürfnissen.

Nomad Job und Task erstellen

Um loszulegen, erstellen wir einen Nomad Job mit einer Gruppe und einem Task. Du kannst die Namen nach deinen Bedürfnissen anpassen. Hier ist der grundlegende Code, den du als Ausgangspunkt verwenden kannst:

ini
# Benutzerdefinierte Parameter
variable "domain_name" {
  description = "Deine eigene Domain, die gehostet werden soll"
}

variable "network_ip_range" {
  description = "IP-Bereich deines Heimnetzwerks"
}

variable "dns_ip" {
  description = "IP-Adresse des DNS-Servers"
}

variable "email_address" {
  description = "Deine Kontakt-E-Mail-Adresse ohne @-Zeichen, stattdessen ein '.'"
}

job "dns" {
  group "dns-server" {

    network {
      port "dns" {
        static = 53
        to     = 53
      }
    }

    service {
      name = "bind9"
    }

    task "bind9" {
      driver = "docker"

      config {
        image = "ubuntu/bind9"

        ports = ["dns"]

        mounts {
          type   = "bind"
          target = "/etc/bind"
          source = "etc/bind"

          readonly = false
          bind_options {
            propagation = "rshared"
          }
        }
      }

      env {
        TZ         = "UTC"
        BIND9_USER = "root"
      }

      template {
        data          = <<EFF
acl internal {
    ${var.network_ip_range}/24;
    127.0.0.1;
    localhost;
};

options {
  forwarders {
    8.8.8.8;
    1.1.1.1;
  };
  allow-query { internal; };
  recursion yes;
  
  dnssec-validation auto;
};

include "/etc/bind/${var.domain_name}.conf";
        EFF
        destination   = "/etc/bind/named.conf"
        change_mode   = "signal"
        change_signal = "SIGINT"
      }

      template {
        data          = <<EFF
zone "${var.domain_name}" IN {
  type master;
  file "/etc/bind/${var.domain_name}.zone";
};
              EFF
        destination   = "/etc/bind/${var.domain_name}.conf"
        change_mode   = "signal"
        change_signal = "SIGINT"
      }

      template {
        data        = <<EFF
$TTL 2d

$ORIGIN ${var.domain_name}.

@               IN      SOA     ns.${var.domain_name}.   ${var.email_address}. (
                                1691399727
                                12h
                                15m
                                3w
                                2h
                                )

                IN      NS      ns.${var.domain_name}.

ns              IN      A       ${var.dns_ip}
              EFF
        destination = "/etc/bind/${var.domain_name}.zone"
        change_mode = "script"
        change_script {
          command = "service"
          args = [
            "named",
            "reload",
            "${var.domain_name}"
          ]
          timeout       = "5s"
          fail_on_error = false
        }
      }
    }
  }
}

Speichere diese Datei ab als dein-dns-job.nomad.
Du kannst nun die Parameter wie domain_name, network_ip_range, dns_ip und email_address bei email_address ist es wichtig, dass das @ durch einen Punkt ersetzt wird, nach Belieben anpassen, um deine eigene Domain erfolgreich zu hosten. Folge einfach den Kommentaren und passe die Werte entsprechend deiner Konfiguration an.

Beschreibung des Skripts:

Dieses Skript nutzt Nomad und Bind9, um die Einrichtung eines DNS-Servers auf einem Ubuntu-System zu automatisieren. Hier sind die Schritte, die das Skript durchführt:

  1. Netzwerkkonfiguration:
  • Legt einen statischen Port (53) für DNS-Kommunikation fest.
  • Du kannst den Netzwerkmodus nach Bedarf anpassen (z.B., "bridge").
  1. Bind9 Docker-Container:
  • Verwendet den offiziellen ubuntu/bind9 Docker-Container.
  • Bindet erforderliche Ports, und mountet das Bind-Verzeichnis für Konfigurationen.
  1. Umgebungsvariablen:
  • Setzt verschiedene Umgebungsvariablen, wie die Zeitzone (TZ) und den Benutzer (BIND9_USER).
  1. Bind9-Konfiguration:
  • Erstellt die Hauptkonfigurationsdatei (named.conf) unter Berücksichtigung deiner individuellen Domain.
  1. Zone-Konfiguration:
  • Definiert die Zone deiner Domain und verweist auf die zugehörige Zone-Datei.
  1. Zone-Datei:
  • Erzeugt eine Zone-Datei mit grundlegenden DNS-Einträgen, darunter den Nameserver (ns) und die IP-Adresse deines DNS-Servers.
  1. Service Reload:
  • Aktualisiert den DNS-Server-Dienst, um die neuen Konfigurationen zu übernehmen.

Erstellung der Parameterdatei und ausrollen auf Nomad

Erstelle als nächstes eine Parameterdatei (zum Beispiel dns_params.hcl), in der du die spezifischen Werte für deine Konfiguration festlegst. Hier ist ein Beispiel:

ini
domain_name      = "deine-domain.de"
network_ip_range = "192.168.1.0"
dns_ip           = "192.168.1.2"
email_address    = "admin@deine-domain.de"

Führe den Nomad-Job mit der Parameterdatei aus:

bash
nomad job run -var-file=dns_params.hcl dein-dns-job.nomad

Erlaube eingehenden DNS-Verkehr auf Port 53:

bash
sudo ufw allow 53

Bearbeite die Datei /etc/resolv.conf und füge die IP-Adresse deines DNS-Servers hinzu:

ini
nameserver 192.168.1.2

Überprüfe die DNS-Konfiguration, indem du einen Test durchführst:

bash
nslookup deine-domain.de 192.168.1.2

Du solltest eine erfolgreiche DNS-Auflösung erhalten.

Mit diesen Schritten sollte dein DNS-Server auf Ubuntu korrekt konfiguriert und einsatzbereit sein. Beachte, dass du die genannten IP-Adressen und Domain-Namen entsprechend deiner tatsächlichen Konfiguration anpassen musst. Viel Erfolg beim Hosten deiner eigenen Domain!