Je suis généralement impliqué dans le développement et l'exploitation de serveurs DNS, mais j'étudie Docker tout en travaillant. J'ai essayé BIND avec Docker, je vais donc le partager sous forme de mémorandum.
J'essaie également de configurer le cache et le DNS faisant autorité.
L'environnement que j'ai essayé est le suivant.
Si Docker est installé, il devrait fonctionner à la fois sur Mac et Linux.
La structure du répertoire est la suivante.
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
Les paramètres de named.conf sont presque minimes.
--BIND package
Cette fois, BIND est installé avec yum. C'est une ancienne version, mais ça va parce que vous venez de l'essayer.
--EXPOSE dans Dockerfile
Spécifiez le port pour lequel la communication est attendue. DNS utilise le port 53.
--Copie de fichiers tels que named.conf, example.com
Ajoutez les fichiers nécessaires pour configurer BIND à l'image. Pour le fichier à copier, spécifiez le fichier dans le répertoire où le Dockerfile est placé.
--Démarrer BIND
Normalement, il est démarré en utilisant systemctl, mais malheureusement il semble qu'il ne puisse pas être démarré avec un conteneur, alors spécifiez directement named
et démarrez-le.
$ docker build -t bind .
Vous pouvez recevoir un avertissement en chemin, mais vous n'avez pas à vous en soucier.
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bind latest b634adb26126 About an hour ago 412MB
Confirmez que l'image est créée.
docker run -dit -p 53:53 -p 53:53/udp --name bind bind:latest
Ici, le mappage de port est défini avec -p
.
$ 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
Si vous pouvez confirmer que le conteneur peut être démarré, cela réussit.
La commande dig est une commande qui demande au serveur DNS le domaine et vous indique l'adresse IP. Je voudrais vérifier le fonctionnement en utilisant cette commande.
Essayez de taper la commande suivante du côté hôte
$ 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
Vous pouvez voir que l'adresse IP «1.2.3.4» définie dans «exemple.com» est affichée. D'ailleurs, même si vous vous renseignez sur «www.example.com», l'adresse définie «5.6.7.8» s'affiche.
$ 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
Auparavant, il n'y avait qu'un seul serveur DNS, mais en fonctionnement réel, un DNS qui a deux rôles: un DNS cache qui reçoit les demandes du client et effectue des demandes au nom du client, et un DNS faisant autorité qui gère les informations de zone. Utilisez le serveur.
J'aimerais également essayer cette configuration avec Docker.
Tout d'abord, supprimons le conteneur créé précédemment
$ docker rm bind
Créez maintenant deux conteneurs.
$ docker run -dit -p 53:53 -p 53:53/udp --name bind_cache bind:latest
$ docker run -dit --name bind_auth bind:latest
Étant donné que seul le DNS du cache reçoit la réponse du client, placez le paramètre de mappage de port dans le DNS du cache. Le DNS faisant autorité n'est pas défini car il ne communique pas directement avec le client.
Vérifiez une fois les adresses IP de bind_cache
et bind_auth
.
$ 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",
Il s'avère que «bind_cache» a une adresse IP de «172.17.0.2» et «bind_auth» a une adresse IP de «172.17.0.3».
Entrez la commande suivante pour entrer dans le conteneur afin de modifier le named.conf
du cache DNS.
$ docker exec -it bind_cache /bin/bash
Modifiez la partie view internal
avec vi etc. comme suit
/etc/bind/named.conf
・
・
・
view "internal" {
recursion yes;
zone "." {
type forward;
forwarders { 172.17.0.3; };
forward only;
};
};
Entrez l'adresse IP du DNS faisant autorité que vous avez confirmé précédemment dans redirecteurs
.
Jetons maintenant un coup d'œil au DNS faisant autorité named.conf
.
$ docker exec -it bind_auth /bin/bash
De même, éditez named.conf
avec vi etc.
Notez la liste d'accès acl
.
/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
spécifie les adresses IP autorisées à communiquer.
L'adresse IP du cache DNS que j'ai vérifié plus tôt était «172.17.0.2». Cette fois, 172.17.0.0 / 16
est autorisé par défaut, donc il n'y a pas de problème tel quel, mais spécifions l'adresse IP du DNS cache.
/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.Changer en 2
};
・
・
Ceci termine les réglages.
Redémarons pour que les paramètres prennent effet. Si vous pouvez confirmer que deux conteneurs sont en cours d'exécution, l'opération réussit.
$ 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
S'il n'est pas en cours d'exécution, il est probable que les paramètres named.conf
ne fonctionnent pas correctement. (Si vous utilisez docker logs
, par exemple en oubliant d'ajouter ;, vous pouvez voir le contenu de l'erreur.)
Dans ce cas, il peut être plus facile de supprimer le conteneur qui n'a pas pu être démarré avec la commande suivante et de créer le conteneur.
$ docker logs bind_XXX
$ docker rm bind_XXX ou docker rm[ID du conteneur]
Vérifiez l'opération à l'aide de la commande dig comme précédemment.
$ 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
Vous pouvez voir que l'adresse IP définie dans exemple.com
est affichée.
En passant, vous pouvez également extraire des domaines qui ne sont pas définis dans le DNS faisant autorité.
$ 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
C'était plus facile que prévu. Je ne sais pas s'il peut être utilisé en fonctionnement réel, mais j'aimerais essayer différentes choses. Ensuite, j'essaierai d'utiliser Unbound pour le cache DNS.
Recommended Posts