J'ai essayé BIND avec Docker

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é.

Environnement d'exécution

L'environnement que j'ai essayé est le suivant.

Si Docker est installé, il devrait fonctionner à la fois sur Mac et Linux.

Tout d'abord, la configuration d'une unité

Préparation de Dockerfile

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.

Description du fichier préparé

--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.

Construire l'image

$ 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.

Démarrez le conteneur en utilisant l'image construite

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.

Contrôle de fonctionnement avec dig

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

Essayez de configurer le cache, DNS faisant autorité

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.

Démarrage du conteneur

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».

Paramètres DNS du cache

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.

Paramètres DNS autorisés

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]

Contrôle de fonctionnement avec dig

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

Impressions

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

J'ai essayé BIND avec Docker
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé de vérifier AdoptOpenJDK 11 (11.0.2) avec l'image Docker
J'ai essayé DI avec Ruby
J'ai essayé UPSERT avec PostgreSQL.
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé l'analyse morphologique avec MeCab
J'ai essayé d'interagir avec Java
J'ai essayé la communication UDP avec Java
J'ai essayé Flyway avec Spring Boot
J'ai essayé de personnaliser Slim avec Scaffold
J'ai essayé de créer un environnement de développement padrino avec Docker
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé de démarrer avec Web Assembly
J'ai essayé de créer un environnement de serveur UML Plant avec Docker
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
J'ai essayé Spring.
J'ai essayé l'apprentissage de la gestion qui fait gagner du temps avec Studyplus.
J'ai essayé l'initialisation paresseuse avec Spring Boot 2.2.0
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
Qu'est-ce que Docker? J'ai essayé de résumer
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
J'ai essayé de faire une authentification de base avec Java
J'ai essayé de gérer la configuration des jambes de force avec Coggle
J'ai essayé de gérer les informations de connexion avec JMX
J'ai aussi essayé Web Assembly avec Nim et C
Je n'ai pas pu installer docker avec raspberry pi2 b +.
J'ai essayé de toucher Docker pour la première fois
J'ai essayé Eclipse MicroProfile OpenAPI avec WildFly Swarm
J'ai essayé d'installer docker sur une instance EC2
Je ne peux pas faire docker-compose up -d avec docker
J'ai essayé de casser le bloc avec java (1)
J'ai essayé de démarrer avec Gradle sur Heroku
J'ai essayé de créer un portefeuille avec AWS, Docker, CircleCI, Laravel [avec lien de référence]
J'ai créé une application d'apprentissage automatique avec Dash (+ Docker) part3 ~ Practice ~
J'ai essayé d'exécuter Autoware
J'ai essayé d'utiliser Gson
Lancez MariaDB avec Docker
Exploser Docker avec WSL2
J'ai essayé QUARKUS immédiatement
Utiliser Puphpeteer avec Docker
J'ai essayé d'utiliser TestNG
Exploitez Emby avec Docker
J'ai essayé d'utiliser Galasa