Ich habe BIND mit Docker ausprobiert

Ich bin normalerweise an der Entwicklung und dem Betrieb von DNS-Servern beteiligt, studiere aber Docker während der Arbeit. Ich habe BIND mit Docker ausprobiert, daher werde ich es als Memorandum weitergeben.

Ich versuche auch, den Cache und das autorisierende DNS zu konfigurieren.

Ausführungsumgebung

Die Umgebung, die ich ausprobiert habe, ist wie folgt.

Wenn Sie Docker installiert haben, sollte es sowohl auf Mac als auch auf Linux funktionieren.

Zunächst die Konfiguration einer Einheit

Vorbereitung der Docker-Datei

Die Struktur des Verzeichnisses ist wie folgt.

bind/
  ├ Dockerfile
  ├ named.conf 
  └ example.com 

Dockerfile


FROM centos:7

RUN yum -y update
RUN yum install -y bind
RUN /usr/sbin/rndc-confgen -a -b 512 -k rndc-key
RUN chmod 755 /etc/rndc.key

EXPOSE 53/UDP
EXPOSE 53/TCP

COPY named.conf /etc/bind/
COPY example.com /etc/bind/master/

CMD ["/usr/sbin/named", "-c", "/etc/bind/named.conf", "-g", "-u", "named"]

named.conf


include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.0/16;
};

options {
    directory "/etc/named/";
    pid-file "/run/named/";
    dump-file "/var/named/named_dump.db";
    statistics-file "/var/named/named.stats.log";

    zone-statistics yes;
    version "";
    masterfile-format text;
    recursive-clients 10000;
    tcp-clients 10000;

    allow-recursion { access-list; };
    allow-query { access-list; };
    allow-query-cache { access-list; };
};

view "internal" {
    recursion yes;

    zone "example.com" IN {
        type master;
        file "/etc/bind/master/example.com";
    };
};

example.com


$TTL 900
@     IN  SOA example.com. postmaster.example.com. (
        2020062101      ; Serial Number
        1800            ; Refresh
        900             ; Retry
        1209600         ; expire
        900             ; minimum
        )
;
      IN    NS  example.com.
      IN    A   1.2.3.4
www   IN    A   5.6.7.8

Die Einstellungen in named.conf sind fast minimal.

Beschreibung der vorbereiteten Datei

--BIND-Paket

Dieses Mal wird BIND mit yum installiert. Es ist eine alte Version, aber es ist okay, weil Sie es einfach versuchen.

--EXPOSE in Dockerfile

Geben Sie den Port an, für den Kommunikation erwartet wird. DNS verwendet Port 53.

--Kopie von Dateien wie named.conf, example.com

Fügen Sie dem Image die Dateien hinzu, die zum Konfigurieren von BIND erforderlich sind. Geben Sie für die zu kopierende Datei die Datei in dem Verzeichnis an, in dem sich die Docker-Datei befindet.

Normalerweise wird es mit systemctl gestartet, aber leider scheint es, dass es nicht mit einem Container gestartet werden kann. Geben Sie also direkt "named" an und starten Sie es.

Image erstellen

$ docker build -t bind .

Unterwegs erhalten Sie möglicherweise eine Warnung, müssen sich aber keine Sorgen machen.

$ docker images
REPOSITORY              TAG             IMAGE ID            CREATED             SIZE
bind                    latest          b634adb26126        About an hour ago   412MB

Bestätigen Sie, dass das Bild erstellt wurde.

Starten Sie den Container mit dem erstellten Image

docker run -dit -p 53:53 -p 53:53/udp --name bind bind:latest

Hier wird die Portzuordnung mit -p eingestellt.

$ docker ps 
b81999d14571        bind:latest         "/usr/sbin/named -c …"   About an hour ago   Up About an hour         0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp   bind

Wenn Sie bestätigen können, dass der Container gestartet werden kann, ist er erfolgreich.

Funktionsprüfung mit dig

Der Befehl dig ist ein Befehl, der den DNS-Server nach der Domäne fragt und Ihnen die IP-Adresse mitteilt. Ich möchte den Vorgang mit diesem Befehl überprüfen.

Geben Sie den folgenden Befehl auf der Hostseite ein

$ dig @localhost example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58542
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 95bb6b3867347d2a659e18f05fa40fa7705d1af930ac0b3b (good)
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            900     IN      A       1.2.3.4

;; AUTHORITY SECTION:
example.com.            900     IN      NS      example.com.

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:43:51 JST 2020
;; MSG SIZE  rcvd: 98

Sie können sehen, dass die in "example.com" festgelegte IP-Adresse "1.2.3.4" angezeigt wird. Übrigens, auch wenn Sie sich nach "www.example.com" erkundigen, wird die eingestellte Adresse "5.6.7.8" angezeigt.

$ dig @localhost www.example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost www.example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17044
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: fc8594f5fe0fda2a5b28b3f65fa41035d0243f359a253da7 (good)
;; QUESTION SECTION:
;www.example.com.               IN      A

;; ANSWER SECTION:
www.example.com.        900     IN      A       5.6.7.8

;; AUTHORITY SECTION:
example.com.            758     IN      NS      example.com.

;; ADDITIONAL SECTION:
example.com.            758     IN      A       1.2.3.4

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:46:13 JST 2020
;; MSG SIZE  rcvd: 118

Versuchen Sie, den autorisierenden DNS-Cache zu konfigurieren

Bisher gab es nur einen DNS-Server, aber im tatsächlichen Betrieb einen DNS mit zwei Rollen: einen Cache-DNS, der Anfragen vom Client empfängt und Anfragen im Namen des Clients stellt, und einen autorisierenden DNS, der Zoneninformationen verwaltet. Verwenden Sie den Server.

Ich möchte diese Konfiguration auch mit Docker ausprobieren.

Container-Start

Löschen wir zunächst den zuvor erstellten Container

$ docker rm bind

Erstellen Sie nun zwei Container.

$ docker run -dit -p 53:53 -p 53:53/udp --name bind_cache bind:latest
$ docker run -dit --name bind_auth bind:latest

Da nur der Cache-DNS die Antwort vom Client empfängt, fügen Sie die Portzuordnungseinstellung in den Cache-DNS ein. Autorisierendes DNS ist nicht festgelegt, da es nicht direkt mit dem Client kommuniziert.

Überprüfen Sie die IP-Adressen von bind_cache und bind_auth einmal.

$ docker inspect bind_cache | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",

$ docker inspect bind_auth | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.3",
                    "IPAddress": "172.17.0.3",

Es stellt sich heraus, dass bind_cache eine IP-Adresse von 172.17.0.2 und bind_auth eine IP-Adresse von 172.17.0.3 hat.

DNS-Einstellungen zwischenspeichern

Geben Sie den folgenden Befehl ein, um den Container zum Bearbeiten der named.conf des Cache-DNS einzugeben.

$ docker exec -it bind_cache /bin/bash

Bearbeiten Sie den Teil "Ansicht intern" mit vi usw. wie folgt

/etc/bind/named.conf


・
・
・
view "internal" {
    recursion yes;

    zone "." {
        type forward;
        forwarders { 172.17.0.3; };
        forward only;
    };
};

Geben Sie die IP-Adresse des autorisierenden DNS ein, den Sie zuvor unter "Weiterleitungen" bestätigt haben.

Autorisierte DNS-Einstellungen

Schauen wir uns nun das maßgebliche DNS named.conf an.

$ docker exec -it bind_auth /bin/bash

In ähnlicher Weise bearbeiten Sie named.conf mit vi usw. Beachten Sie die acl access-list.

/etc/bind/named.conf


include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.0/16;
};
・
・

acl access-list gibt die IP-Adressen an, die kommunizieren dürfen. Die IP-Adresse des zuvor überprüften Cache-DNS war "172.17.0.2". Dieses Mal ist "172.17.0.0 / 16" standardmäßig zulässig, daher gibt es kein Problem, aber geben Sie die IP-Adresse des Cache-DNS an.

/etc/bind/named.conf


include "/etc/rndc.key";
controls {
    inet 127.0.0.1 allow { 127.0.0.1; } keys { "rndc-key"; };
};

acl "access-list" {
    127.0.0.1;
    172.17.0.2; // 172.17.0.Wechseln Sie zu 2
};
・
・

Damit sind die Einstellungen abgeschlossen.

Lassen Sie uns neu starten, damit die Einstellungen wirksam werden. Wenn Sie bestätigen können, dass zwei Container ausgeführt werden, ist dies erfolgreich.

$ docker restart bind_auth
$ docker restart bind_cache 

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS
                          NAMES
f0b2f14e26f2        bind:latest         "/usr/sbin/named -c …"   About an hour ago   Up 6 minutes        53/tcp, 53/udp                           bind_auth
b81999d14571        bind:latest         "/usr/sbin/named -c …"   2 days ago          Up 6 minutes        0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp   bind_cache

Wenn es nicht ausgeführt wird, funktionieren die Einstellungen für "named.conf" wahrscheinlich nicht ordnungsgemäß. (Wenn Sie Docker-Protokolle verwenden, z. B. das Hinzufügen vergessen;, können Sie den Inhalt des Fehlers sehen.) In diesem Fall ist es möglicherweise einfacher, den Container zu löschen, der mit dem folgenden Befehl nicht gestartet werden konnte, und den Container zu erstellen.

$ docker logs bind_XXX
$ docker rm bind_XXX oder Docker rm[Container ID]

Funktionsprüfung mit dig

Überprüfen Sie den Vorgang wie zuvor mit dem Befehl dig.

$ dig @localhost example.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58542
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 95bb6b3867347d2a659e18f05fa40fa7705d1af930ac0b3b (good)
;; QUESTION SECTION:
;example.com.                   IN      A

;; ANSWER SECTION:
example.com.            900     IN      A       1.2.3.4

;; AUTHORITY SECTION:
example.com.            900     IN      NS      example.com.

;; Query time: 10 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Nov 05 23:43:51 JST 2020
;; MSG SIZE  rcvd: 98

Sie können sehen, dass die in "example.com" festgelegte IP-Adresse angezeigt wird.

Übrigens können Sie auch Domänen abrufen, die nicht im autorisierenden DNS definiert sind.

$ dig @localhost www.google.com

; <<>> DiG 9.16.1-Ubuntu <<>> @localhost www.google.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53253
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 9

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 3181d4115c9c0426b42bd02e5fa6a8a6a04cb4d481be1221 (good)
;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         300     IN      A       172.217.26.36

;; AUTHORITY SECTION:
google.com.             171777  IN      NS      ns1.google.com.
google.com.             171777  IN      NS      ns4.google.com.
google.com.             171777  IN      NS      ns3.google.com.
google.com.             171777  IN      NS      ns2.google.com.

;; ADDITIONAL SECTION:
ns4.google.com.         171777  IN      A       216.239.38.10
ns2.google.com.         171777  IN      A       216.239.34.10
ns1.google.com.         171777  IN      A       216.239.32.10
ns3.google.com.         171777  IN      A       216.239.36.10
ns4.google.com.         171777  IN      AAAA    2001:4860:4802:38::a
ns2.google.com.         171777  IN      AAAA    2001:4860:4802:34::a
ns1.google.com.         171777  IN      AAAA    2001:4860:4802:32::a
ns3.google.com.         171777  IN      AAAA    2001:4860:4802:36::a

;; Query time: 120 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Nov 07 23:01:10 JST 2020
;; MSG SIZE  rcvd: 335

Impressionen

Es war einfacher als ich erwartet hatte. Ich weiß nicht, ob es im tatsächlichen Betrieb verwendet werden kann, aber ich möchte verschiedene Dinge ausprobieren. Als nächstes werde ich versuchen, Unbound für Cache-DNS zu verwenden.

Recommended Posts

Ich habe BIND mit Docker ausprobiert
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe DI mit Ruby versucht
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe versucht, JOOQ mit Gradle zu verwenden
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe Flyway mit Spring Boot ausprobiert
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, mit Docker eine Padrino-Entwicklungsumgebung zu erstellen
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe es mit Spring versucht.
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Was ist Docker? Ich habe versucht zusammenzufassen
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Ich habe auch Web Assembly mit Nim und C ausprobiert
Ich konnte Docker nicht mit Himbeer pi2 b + installieren.
Ich habe zum ersten Mal versucht, Docker zu berühren
Ich habe Eclipse MicroProfile OpenAPI mit WildFly Swarm ausprobiert
Ich habe versucht, Docker auf einer EC2-Instanz zu installieren
Ich kann Docker-Compose -d nicht mit Docker machen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe versucht, mit Gradle auf Heroku zu beginnen
Ich habe versucht, ein Portfolio mit AWS, Docker, CircleCI, Laravel [mit Referenzlink] zu erstellen.
Ich habe eine App für maschinelles Lernen mit Dash (+ Docker) Teil 3 ~ Übung ~ erstellt
Ich habe versucht, Autoware auszuführen
Ich habe versucht, Gson zu benutzen
Starten Sie MariaDB mit Docker
Explodiere Docker mit WSL2
Ich habe sofort QUARKUS ausprobiert
Verwenden Sie Puphpeteer mit Docker
Ich habe versucht, TestNG zu verwenden
Bedienen Sie Emby mit Docker
Ich habe versucht, Galasa zu benutzen