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.
Die Umgebung, die ich ausprobiert habe, ist wie folgt.
Wenn Sie Docker installiert haben, sollte es sowohl auf Mac als auch auf Linux funktionieren.
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.
--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.
$ 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.
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.
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
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.
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.
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.
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]
Ü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
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.