TECHLOGICS

HYLOGICS分室。作業メモやガジェットのレビューなど、主に技術系のエントリを取り扱います。

【備忘録】dockerでbindを動かす

背景

インフラをKVMからDocker on KVMに移行しよう計画その1

<2018-05-18追記>

この記事ではCentOSのコンテナイメージを用いて構築していますが、その後Alpine Linuxに移行しました。詳しくは下記を参照してください。

tech.hylogics.com

docker install

sudo yum install docker

install bind-utils

#動作確認用。なくても良い。

sudo yum install bind-utils

enable docker

sudo systemctl enable docker
sudo systemctl start docker

check docker status

sudo systemctl status docker

add docker user

#毎回sudoするのも面倒なのでdocker用のユーザで作業する

sudo adduser docker
sudo su - docker

create Dockerfile

$ mkdir bind
$ vi bind/Dockerfile

$ cat bind/Dockerfile

#内容は以下の通り

FROM centos:centos7
RUN yum install -y bind bind-utils iproute && yum clean all
EXPOSE 53/udp
CMD ["/usr/sbin/named", "-c", "/etc/named/named.conf", "-u", "named", "-g"]

build docker image

$ docker build -t bind ./bind/

create bind config file

$ mkdir bind/conf/
$ vi bind/conf/named.conf
$ cat bind/conf/named.conf

#内容は以下の通り。主にlisten port, allow-query, zoneの設定

options {
        listen-on port 53 { any; };
        listen-on-v6 port 53 { ::1; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        allow-query     { localhost; 192.168.0.0/16; 172.17.0.1/16; };

        /*
         - If you are building an AUTHORITATIVE DNS server, do NOT enable recursion.
         - If you are building a RECURSIVE (caching) DNS server, you need to enable
           recursion.
         - If your recursive DNS server has a public IP address, you MUST enable access
           control to limit queries to your legitimate users. Failing to do so will
           cause your server to become part of large scale DNS amplification
           attacks. Implementing BCP38 within your network would greatly
           reduce such attack surface
        */
        recursion yes;

        dnssec-enable yes;
        dnssec-validation yes;

        /* Path to ISC DLV key */
        bindkeys-file "/etc/named.iscdlv.key";

        managed-keys-directory "/var/named/dynamic";

        pid-file "/run/named/named.pid";
        session-keyfile "/run/named/session.key";
};

logging {
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

zone "." IN {
        type hint;
        file "named.ca";
};

zone "hylogics.com" IN {
        type master;
        file "/etc/named/hylogics.zone";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
$ vi bind/conf/hylogics.zone
$ cat bind/conf/hylogics.zone

#zoneファイルは下記の通り

$TTL 3600
hylogics.com. IN SOA ns1.hylogics.com. (
        postmaster.hylogics.com.
        1       ; Serial
        3600    ; Refresh
        900     ; Retry
        3600    ; Expire
        600 ) ; Minimum

hylogics.com.   IN NS   ns1.hylogics.com.

ns1     IN      A       127.0.0.1
blog    IN      CNAME   hatenablog.com.
tech    IN      CNAME   hatenablog.com.

起動

$ docker run -d -e TZ='Asia/Tokyo' -p 53:53/udp -v /home/docker/bind/conf/:/etc/named:Z --restart always --name bind bind

/home/docker/bind/conf/etc/namedにマウントして設定ファイルを読み込んでいるが、SELinuxが有効だとPermission deniedになるので:Zのオプションが必要

動作確認

$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
be954f336d9c        bind                "/usr/sbin/named -..."   10 hours ago        Up 10 hours         0.0.0.0:53->53/udp   bind

STATUSが稼働中になっていること

$ dig blog.hylogics.com. @127.0.0.1 +short

IPアドレスallow-queryの設定に合わせて任意で動作確認をする。外部から見れなかったりすることがあるのでループバックのアドレス以外を使うこと推奨。

トラブルシューティング

ログの確認

$ docker logs bind

コンテナに入る

$ docker exec -it bind "/bin/bash"

課題

ログの扱いを検討する

参考にしたサイト

blog.kurokobo.com

qiita.com