Blog

BIND als DNS-Server für ein privates Netzwerk, der mit Docker und Ansible bereitgestellt wird

Bild von Iveta Paneva
Iveta Paneva
DevOps- und Cloud-Ingenieur
13.04.2023
Lesezeit: 11 Minuten.
Zuletzt aktualisiert am: 28.02.2025

Inhaltsübersicht

Da die Nachfrage in der IT-Branche weltweit zunimmt, wird Open-Source-Software zu einem immer wichtigeren Bestandteil der täglichen Praxis.

Als Ingenieure sind wir uns bewusst, dass wir immer auf der Suche nach Softwarelösungen sind, um unsere Arbeit zu verbessern, Zeit zu sparen und gleichzeitig sicher und produktiv zu sein.

Daher werden wir uns auf flexible und anpassbare Software wie den DNS-Dienst BIND9, das Automatisierungswerkzeug Ansible und die Plattform als Service mit minimalem Ressourcenverbrauch wie Docker-Container konzentrieren. Und nun werden wir erforschen, wie wir unsere tägliche Arbeit mithilfe dieser Schlüsselprinzipien optimieren können, um den Ausführungsfluss zukünftiger Aufgaben zu verringern.

Wir führen Sie durch den Prozess der Einrichtung eines Docker-Containers für BIND9, der Konfiguration und der Verwendung von Ansible zur Bereitstellung und Verwaltung des Servers. Am Ende dieses Artikels werden Sie besser verstehen, wie Sie einen DNS-Server mit BIND9, Docker und Ansible bereitstellen und wie Sie ihn an die spezifischen Anforderungen Ihres Unternehmens anpassen können.

Vorteile der Verwendung von BIND9 auf Docker mit einer Ansible-Rolle

Wir werden mehrere Gründe aufzeigen, warum die Verwendung von BIND9 auf Docker mit einer Ansible-Rolle für die Verwaltung von DNS-Diensten von Vorteil sein kann. Einige dieser Vorteile sind unten aufgeführt.

  • Portabilität: Docker bietet eine leichtgewichtige und portable Containerisierungsplattform, die es uns ermöglicht, BIND9 auf jedem Server auszuführen, der Docker unterstützt, unabhängig vom zugrunde liegenden Betriebssystem. Diese Funktion macht es einfach, DNS-Dienste zwischen verschiedenen Umgebungen zu verschieben, z. B. Entwicklung, Test und Produktion.
  • Skalierbarkeit: Mit Docker können Sie Ihre BIND9-Infrastruktur durch Hinzufügen oder Entfernen von Containern problemlos vergrößern oder verkleinern. Dies kann Ihnen beispielsweise helfen, Schwankungen im DNS-Verkehr zu bewältigen.
  • Konsistenz: Das Ansible-Tool gewährleistet eine konsistente Konfiguration von BIND9 über mehrere Server hinweg. Durch die Verwendung von Ansible-Rollen können Sie die gesamte Konfiguration von BIND9 als Code definieren und Fehler auf DNS-Servern beheben. Es garantiert Konsistenz in der gesamten Infrastruktur.
  • Automatisierung: Mit Ansible können Sie die Bereitstellung und Konfiguration von BIND9 auf zahlreichen Servern automatisieren, was die Möglichkeit von Konfigurationsfehlern verringert und gleichzeitig Zeit und Aufwand spart.
  • Versionierung: Indem Sie die gesamte Konfiguration von BIND9 als Code beschreiben, können Sie Ihre DNS-Infrastruktur versionskontrollieren. Dies macht es einfacher, Änderungen nachzuvollziehen und zu früheren Konfigurationen zurückzukehren.

Konzentrieren Sie sich darauf, produktiv statt beschäftigt zu sein

Einführung in BIND9: Einrichten eines DNS-Servers 

Zunächst werden wir BIND9 definieren, Ihnen die grundlegenden Konfigurationsdateien zeigen, die wir verwenden werden, und erklären, wie Sie das BIND9-Netzwerk erstellen. BIND9, kurz für Berkeley Internet Name Domain Version 9, ist eine Software, die DNS-Dienste (Domain Name System) bereitstellt. DNS kann als eine Art Telefonbuch für das Internet beschrieben werden, das von Menschen lesbare Domänennamen wie itgix.com in für Computer verständliche IP-Adressen wie 208.65.153.238 übersetzt. BIND9 ist für die Verwaltung und Auflösung dieser Domänennamen zuständig und ermöglicht Computern und anderen Geräten den Zugriff auf Websites und Online-Dienste, indem es die Domänennamen in ihre entsprechenden IP-Adressen übersetzt.

Und jetzt sehen wir uns die Konfigurationsdateien an:

Die wichtigsten Komponenten von Bind9, die wir verwenden werden, sind:

  • named.conf - ist die Hauptkonfigurationsdatei für named (der primäre Haupt-Daemon/Dienst, der die DNS-Namensauflösung bereitstellt). Sie legt die globalen Optionen für named fest und definiert die Zonen, für die named autoritativ ist.

Unsere named.conf-Datei - Beispiel:

zone "{{ domain.internal }}" {
             type master;
             file "/etc/bind/db.itgix";

Dabei ist "domain.internal" eine Variable, die in /etc/ansible/group_vars/bind-vars.yml platziert werden kann, und Ansible wird den Wert aus dieser Datei lesen.

Der Inhalt der Datei /etc/ansible/group_vars/bind-vars.yml ist:

domain:
    internal: "stage.itgix"

Um es uns einfacher zu machen, verwenden wir Variablen, die es uns ermöglichen, die Konfigurationsdateien von BIND9 nicht jedes Mal zu bearbeiten. Wir erstellen eine separate Datei, in der unsere Variablen definiert sind. Wenn wir also etwas hinzufügen oder entfernen wollen, ist das weniger zeitaufwändig und mühelos.

Als nächstes werden wir uns die Datei named.conf.options ansehen:

  • Named.conf.options - es handelt sich um eine Konfigurationsdatei in BIND9, die globale Optionen für den DNS-Server festlegt. Sie speichert Parameter wie die IP-Adressen des Servers und die Portnummer, an der der Server auf DNS-Anfragen wartet.

Unser Beispiel für die Datei named.conf.options lautet:

options {
        directory "/var/cache/bind";
        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable 
        // nameservers, you probably want to use them as forwarders.  
        // Uncomment the following block, and insert the addresses replacing 
        // the all-0's placeholder.

        // forwarders {
              8.8.8.8;
        // };      //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys       //========================================================================
        dnssec-validation false;
        #listen-on-v6 { any; };
};

Die Option "dnssec-validation" ist auf false gesetzt. Das bedeutet, dass wir diese Erweiterungen nicht verwenden würden. DNSSEC steht für "Domain Name System Security Extensions". Es handelt sich um eine Reihe von Spezifikationen/Protokollen und Standards für Sicherheitserweiterungen, die einen sicheren Mechanismus für die Auflösung von Domänennamen in IP-Adressen bieten. 

Die "Forwarder" werden verwendet, um Domains außerhalb der definierten Zone aufzulösen.

Die Option "listen-on-v6" wird verwendet, um vers.6-IP-Adressen anzugeben, die der BIND9-Server bei eingehenden DNS-Anfragen abhören soll. In dieser Datei haben wir die Zeile "listen-on-v6" auskommentiert, da wir eine solche IP-Adressversion nicht verwenden würden.

Die nächste Datei ist:

  • Zonendateien: - Die Zone/DB-Datei enthält die Zuordnung zwischen Domänennamen und IP-Adressen oder anderen Ressourceneinträgen. Sie werden verwendet, um die DNS-Hierarchie zu definieren und Namensauflösungen für bestimmte Domänen bereitzustellen.

Diese Dateien werden nach dem Domänennamen benannt und haben normalerweise Erweiterungen wie .db oder .zone. Einige dieser Dateitypen sind db.local für die Zone localhost, db.root für die Root-Zone und db.example.com für die Domäne example.com. Die db-Dateien werden mit der Anweisung zone in die Konfigurationsdatei named.conf aufgenommen.

Unsere Datei ist "db.itgix":

$TTL    604800
@	IN      SOA    ns.{{ domain.internal }}. {{ domain.internal }}. (
                     2022080501         ; Serial
                           7200         ; Refresh
                           3600         ; Retry
                         604800         ; Expire
                           7200 )       ; Negative Cache TTL; 
@       IN      NS    ns.{{ domain.internal }}.
ns 	IN 	A	{{ ansible_ssh_host }}

{% for record in records %}
{{ record.subname }}  IN  {{ record.type }}  {{ record.dest }}
{% endfor %}

Da wir auch in dieser Datei Variablen verwenden, haben wir die folgenden Einträge in der Datei /etc/ansible/group_vars/bind-vars.yml hinzugefügt.

records:
  - { subname: "jenkins", type: "A", dest: "IPv4" } - place your desired IP in the quotes
  - { subname: "prometheus", type: "A", dest: "IPv4" } - place your desired IP address in the quotes

Zusammenfassend lässt sich sagen, dass named.conf.options eine globale Konfigurationsdatei ist, die Optionen für den BIND9-Server festlegt, während db-Dateien zum Speichern von Zonendaten für bestimmte Domänen verwendet werden.

Konfigurieren des Docker-Containers für die Verwendung von BIND9

Da wir gesehen haben, wie man DNS-Einträge setzt und die BIND9-Hauptkonfigurationsdateien konfiguriert, können wir nun mit dem nächsten Schritt fortfahren - der Konfiguration des Docker-Containers für die Verwendung von BIND9.

Zunächst wollen wir uns ansehen, was ein Docker-Container ist:

Docker ist eine Softwaretechnologie, die es Entwicklern ermöglicht, Anwendungen in einer containerisierten Umgebung zu erstellen, bereitzustellen und auszuführen. Ein Container ist ein eigenständiges ausführbares Paket, das alles enthält, was eine Anwendung zum Ausführen benötigt, einschließlich Code, Bibliotheken und Systemtools.

Stellen Sie sich einen Container als eine kleine virtuelle Maschine vor, die nur die notwendigen Ressourcen für die Ausführung einer bestimmten Anwendung enthält. Das bedeutet, dass mehrere Container auf einem einzigen Host-Rechner ausgeführt werden können, ohne sich gegenseitig zu behindern, was den Entwicklern mehr Effizienz und Flexibilität bietet.

Beginnen wir mit der Erstellung des Dockerfiles.

Ein Dockerfile ist eine Textdatei, die eine Reihe von Befehlen für die Erstellung eines Docker-Images enthält. Welche Datei wird im Docker-Erstellungsprozess verwendet, um ein Container-Image zu erstellen, das zur Ausführung einer Anwendung oder eines Dienstes verwendet werden kann?

Wir müssen eine Dockerdatei erstellen, die unseren Bind9 DNS-Dienst in einem Container installiert: 

FROM ubuntu/bind9:9.16-20.04_edge
RUN mkdir /var/cache/bind -p
RUN chown bind:bind /var/cache/bind
RUN chmod 775 /var/cache/bind
RUN rm -rf /etc/bind/*
COPY named.conf /etc/bind/named.conf
COPY db.itgix /etc/bind/db.itgix
COPY named.conf.options /etc/bind/named.conf.options
RUN ls -l /etc/bind/
EXPOSE 53

Erläuterung der obigen Dateikonfiguration:

FROM ubuntu/bind9:9.16-20.04_edge: - Gibt das Basis-Image an, das wir für den Build-Prozess verwenden. Wir verwenden das Ubuntu-Image mit installiertem BIND9.

RUN mkdir /var/cache/bind -p: Erstellt ein Verzeichnis namens /var/cache/bind mit dem Flag -p, das alle notwendigen übergeordneten Verzeichnisse erstellt.

RUN chown bind:bind /var/cache/bind: Wir müssen bind für Besitzer und Gruppe einstellen, da BIND9 als bind-Benutzer läuft.

RUN chmod 775 /var/cache/bind: Hier setzen wir die Berechtigungen des Verzeichnisses /var/cache/bind auf 775 (rwx-rwx-r-x), was dem Benutzer bind das Lesen, Schreiben und Ausführen von Dateien in diesem Verzeichnis erlaubt.

RUN rm -rf /etc/bind/*: Mit diesem Schritt entfernen wir die Dateien aus /etc/bind/, da die nächsten Befehle unsere benutzerdefinierten Dateien in dieses Verzeichnis kopieren werden, aus dem BIND dann lesen wird.

Mit den folgenden Befehlen werden die Dateien in das Verzeichnis /etc/bind im Container kopiert:

COPY named.conf /etc/bind/named.conf: 

COPY db.itgix /etc/bind/db.itgix

COPY named.conf.options /etc/bind/named.conf.options

RUN ls -l /etc/bind/: Hier listen wir die kopierten Dateien in /etc/bind im Container auf, um zu überprüfen, ob sie erfolgreich kopiert wurden.

EXPOSE 53: Dieser Befehl gibt Port 53 frei, den Standardport des BIND9 DNS-Servers.

Wie wir sehen können, ist die Datei sehr einfach und benutzerfreundlich eingerichtet, indem eine benutzerdefinierte Konfiguration verwendet wird. 

Erstellen einer Ansible-Rolle für BIND9

Jetzt können wir mit dem letzten Schritt fortfahren - der Erstellung einer Ansible-Rolle für BIND9.

Lassen Sie uns zunächst erklären, was Ansible ist und die Module definieren, die wir in unserer Rolle verwenden.

Ansible ist ein benutzerfreundliches Tool zur Automatisierung und Verwaltung der IT-Infrastruktur. Es ermöglicht uns die einfache Verwaltung mehrerer Server und Anwendungen durch eine einfache, leicht verständliche Sprache ohne fortgeschrittene Programmierkenntnisse. Durch seine Einfachheit und die leichte Bedienbarkeit der Sprache hilft es uns, Zeit zu sparen und die Produktivität zu steigern.

Die Ansible-Rollen enthalten ein paar Aufgaben: 

Wir haben eine Datei in /etc/ansible/playbooks/bind9.yml erstellt, in der wir Anweisungen für die auszuführende Rolle und den Host festlegen, wie im folgenden Beispiel:

---
- hosts: localhost
  roles:
- { role: "bind9" }

Sehen wir uns nun die gesamte Rolle an, und dann werden wir beschreiben, wofür die Module verwendet werden.

Die Rolle wird erstellt in /etc/ansible/roles/bind9/tasks/bind9-container.yml

---
- name: Creates directory
  ansible.builtin.file:
    path: /opt/bind9
    state: directory
    owner: root
    group: root
    mode: 0775
  become: true
  tags:
    - bind_deploy

- name: Copy Dockerfile, named.conf, named.conf.options, db.itgix to container.
  template:
    src: "{{ item }}"
    dest: /opt/bind9
    owner: root
    group: root
    mode: 0775
  with_items:
    - named.conf
    - Dockerfile
    - named.conf.options
    - db.itgix
  become: true
  tags:
    - bind_deploy

- name: Create a network
  docker_network:
    name: "{{ domain.internal }}"
    ipam_options:
      subnet: 172.24.0.0/24
      iprange: 172.24.0.0/24
    state: present
  become: true
  tags:
    - bind_deploy

- name: Build the image
  docker_image: 
    name: bind9
    tag: "{{ build_tag }}"
    path: /opt/bind9
    source: build
  become: true
  tags:
    - bind_deploy

- name: Running the container
  docker_container:
    name: bind9
    image: bind9:{{ build_tag }}
    state: started
    restart: true
    exposed_ports:
      - 53:53/tcp
      - 53:53/udp
    networks:
      - name: "{{ domain.internal }}"
    recreate: true
  become: true
  tags:
    - bind_deploy

Wir stellen Ihnen vor, wofür Module verwendet werden, und erläutern die Syntax der Ansible-Rolle. 

In Ansible werden Module verwendet, um bestimmte Aufgaben auf verwalteten Knoten durchzuführen, die auf entfernten Hosts ausgeführt werden, um die gewünschte Aufgabe zu automatisieren, z. B. die Installation eines Pakets, den Start eines Dienstes oder die Konfiguration einer Netzwerkschnittstelle.

Obwohl Module in jeder beliebigen Programmiersprache geschrieben werden können, ist Python die gängigste Sprache zum Schreiben von Ansible-Modulen. Ansible wird mit einer großen Anzahl von integrierten Modulen ausgeliefert, und es gibt auch viele Module von Drittanbietern, die heruntergeladen und verwendet werden können.

Die von uns verwendeten Module innerhalb der Ansible-Rolle sind:

  • ansible.builtin.file: Dieses Modul wird verwendet, um ein Verzeichnis unter dem angegebenen Pfad mit dem angegebenen Eigentümer, der Gruppe und dem Modus zu erstellen.
  • Vorlage: Dieses Modul wird verwendet, um die Dateien named.conf, Dockerfile, named.conf.options und db.itgix in das Verzeichnis /opt/bind9 zu kopieren. Die Quelldateien sind Vorlagen, die mit spezifischen Variablen für die Zielumgebung angepasst werden.
  • docker_network: This module is used to create a new Docker network named “{{ domain.internal }}” with the IP address range 172.24.0.0/24.
  • docker_image: Dieses Modul wird verwendet, um ein Docker-Image mit dem Namen "bind9" mit dem angegebenen Build-Tag zu erstellen, unter Verwendung der Dockerdatei, die sich unter /opt/bind9 befindet.
  • docker_container: This module is used to run a Docker container named “bind9” with the specified image and restart policy, exposing TCP and UDP ports 53, and attaching it to the “{{ domain.internal }}” Docker network. If the container already exists, it will be recreated.

Welche Aufgaben hat die Ansible-Rolle?

Die erste Aufgabe erstellt ein Verzeichnis "/opt/bind9", in dem BIND9 installiert werden soll. Wir geben 0755 (drwx-r-x-r-x) Berechtigungen für das Verzeichnis für die Gruppe root und den Eigentümer root.

Die zweite Aufgabe verwendet das Vorlagenmodul, um unsere vier Dateien, die von unseren eigenen Dateien erstellt wurden, in den Container in "/opt/bind" zu kopieren, so dass bei der Installation von BIND9 aus diesen Dateien gelesen werden kann.

Der dritte Teil besteht darin, ein Netzwerk zu erstellen, um den DNS-Container mit statischen IP-Adressen betreiben zu können. Der folgende Befehl erstellt ein Netzwerk mit der Variable {{ domain.internal }}, die in /etc/ansible/group_vars/bind-vars.yml mit dem Bereich 172.24.0.0/16 eingetragen ist.

The fourth task builds a Docker image named bind9:{{ build_tag }} from the /opt/bind9 directory.

Finally, the fifth task runs a Docker container named bind9 from the bind9:{{ build_tag }} image with the “recreate” flag set to true so the container can be recreated always, and “exposed_ports” set to 53 to expose the DNS port to the outside world. It also connects the container to the {{ domain.internal }} network.

Für alle Aufgaben wird ein Tag angezeigt, den wir verwenden:

tags:
- bind_deploy

Tags: Wenn Sie ausgewählten Modulen Tags zuweisen und dann die Ansible-Rolle ausführen, die dieses Tag aufruft, gilt dies nur für die Module, in denen das Tag vorhanden ist.

Führen Sie das Spielbuch aus:

ansible-playbook bind9.yml --tags bind_deploy

Abschließend lässt sich sagen, dass die Verwendung von BIND9 auf Docker mit der Ansible-Rolle uns zahlreiche Vorteile für die Verwaltung von DNS-Servern bietet. Diese Kombination bietet eine flexible und automatisierte Möglichkeit, DNS-Dienste zu verwalten, Konfigurationsfehler zu reduzieren und Konsistenz in der gesamten Infrastruktur zu gewährleisten. Darüber hinaus erleichtert die Möglichkeit, die gesamte Konfiguration von BIND9 als Code über Ansible-Rollen zu definieren und zu versionieren, die Wartung und Fehlerbehebung bei DNS-Servern und ermöglicht gleichzeitig die schnelle Bereitstellung und das Rollback von Änderungen. Insgesamt bietet die Verwendung von BIND9 auf Docker mit Ansible-Rollen eine flexible, automatisierte und konsistente Möglichkeit zur Verwaltung von DNS-Diensten und ermöglicht gleichzeitig Portabilität, Skalierbarkeit und Versionierung der gesamten Infrastruktur.

Schlussfolgerung

Zusammenfassend lässt sich sagen, dass die Verwendung von BIND9 auf Docker mit der Ansible-Rolle eine leistungsstarke und effiziente Möglichkeit ist, DNS-Dienste in modernen IT-Umgebungen zu verwalten.

Wir freuen uns, dass Sie an diesem Artikel mitgewirkt haben und hoffen, dass er für Sie hilfreich war. Danke, dass Sie Ihre Zeit investiert haben.

Wenn Sie Hilfe bei der Verwendung von BIND9 auf Docker mit einer Ansible-Rolle benötigen und die Vorteile der Verwaltung von DNS-Servern nutzen möchten, können Sie sich an unser Expertenteam aus erfahrenen DevOps-Ingenieuren wenden.

Mehr Beiträge

Kontakt aufnehmen
ITGix bietet Ihnen fachkundige Beratung und maßgeschneiderte DevOps-Services, um Ihr Unternehmenswachstum zu beschleunigen.
Newsletter für
Technik-Experten
Schließen Sie sich 12.000+ Geschäftsführern und Ingenieuren an, die Blogs, e-Books und Fallstudien Fallstudien über neue Technologie erhalten.