2021年1月23日土曜日

DockerでUnboundをコンテナ化してDNSサーバを構築する

自宅サーバコンテナ化対応として、今回はDNS機能であるUnboundのコンテナ化を行う

環境

今回のDocker環境構築時のソフトウエアバージョンを以下に記載する。

  • DockerホストOS : CentOS 8.2
  • Docer : 19.03.14
  • コンテナ用OSイメージ : centos:latest

Dockerホストとコンテナ間では、サービス提供に必要なポートの紐づけと、ログファイルを出力させるディレクトリの紐づけを行う。以下に簡単に図示しておく。

Unboundコンテナ化手順

1. Dockerのインストール

Dockerのインストールは別記事を参照。CentOS 7にDockerをインストールする内容となっているが、CentOS 8も同様の手順でインストールできる。

Dockerインストール後、Dockerfile等を配置するディレクトリを作成し、以後はそのディレクトリ内にすべてのファイルを配置する。

2. Unbound用の設定ファイルを準備

Unboundの設定手順は、過去記事にて記載しているので、そちらを参照いただきたい。

コンテナにする場合も同様の設定を行えばよい。あらかじめ、以下の通り設定ファイルを作成しておく。

unbound.conf

※★箇所は各環境に合わせて変更すること。

server:
        verbosity: 2
        statistics-interval: 0
        statistics-cumulative: no
        extended-statistics: yes
        num-threads: 4
        interface: 0.0.0.0
        interface-automatic: yes
        outgoing-port-permit: 32768-60999
        outgoing-port-avoid: 0-32767
        so-reuseport: yes
        ip-transparent: yes
        max-udp-size: 3072
        access-control: 0.0.0.0/0 refuse
        access-control: 127.0.0.0/8 allow
        access-control: 192.168.33.0/24 allow #★DNS問い合わせ可能なIPアドレスを指定
        access-control: 192.168.11.0/24 allow #★DNS問い合わせ可能なIPアドレスを指定
        access-control: ::0/0 refuse
        access-control: ::1 allow
        access-control: ::ffff:127.0.0.1 allow
        chroot: ""
        username: "unbound"
        directory: "/etc/unbound"

        logfile: "/var/log/unbound/unbound.log"
        use-syslog: no
        log-time-ascii: yes
        pidfile: "/var/run/unbound/unbound.pid"
        harden-glue: yes
        harden-dnssec-stripped: yes
        harden-below-nxdomain: yes
        harden-referral-path: yes
        qname-minimisation: yes
        aggressive-nsec: yes
        unwanted-reply-threshold: 10000000
        prefetch: yes
        prefetch-key: yes
        rrset-roundrobin: yes
        minimal-responses: yes
        module-config: "ipsecmod validator iterator"
        trust-anchor-signaling: yes
        root-key-sentinel: yes
        trusted-keys-file: /etc/unbound/keys.d/*.key
        auto-trust-anchor-file: "/var/lib/unbound/root.key"
        val-clean-additional: yes
        val-permissive-mode: no
        serve-expired: yes
        val-log-level: 1
        include: /etc/unbound/local.d/*.conf
        ipsecmod-enabled: no
        ipsecmod-hook:/usr/libexec/ipsec/_unbound-hook
include: /etc/unbound/conf.d/*.conf
forward-zone:
        name: "."
        forward-addr: 8.8.8.8 #★上位DNSサーバを指定
        forward-addr: 8.8.4.4 #★上位DNSサーバを指定
auth-zone:
        name: "."
        for-downstream: no
        for-upstream: yes
        fallback-enabled: yes
        master: b.root-servers.net
        master: c.root-servers.net
        master: e.root-servers.net
        master: f.root-servers.net
        master: g.root-servers.net
        master: k.root-servers.net

3. Dockerホストにログ出力先を作成

今回はコンテナのUnboundが出力したunbound.logをDockerホストのディレクトリ出力するよう構成するため、以下の通りあらかじめログ出力先のディレクトリを作成しておく。

mkdir -p /var/log/docker/centos-unbound
chmod 777 /var/log/docker/*

4. Dockerfileを作成

コンテナの構成情報はDockerfileに記述する。いくつか記述内容にポイントがあるので以下表にまとめる。

命令 記述内容 説明
FROM centos コンテナのベースとなるイメージはCentOSを使用する。
ENV TZ タイムゾーンを日本標準時 (Asia/Tokyo) にする。
ENV http_proxy, https_proxy プロキシ環境の場合は、プロキシサーバを指定する。
RUN dnf, mkdir, chown 必要なパッケージのインストールを行う。Unboundのみインストールすれば問題ない。また、Dockerホストのボリュームのマウントポイントとなるため、ログ出力先ディレクトリの作成と権限設定を実施しておく。
COPY - 事前に作成したunbound.confの設定ファイルを /etc/unbound/にコピーする。
EXPOSE 53 53/udp DNSの53番ポートを記述する。DNSはTCPとUDP両方にてサービス提供するため、TCPとUDPの両方を記載する。
CMD ["/usr/sbin/unbound", "-d"] /usr/sbin/unbound -dにてUnboundを実行する。フォアグラウンドで起動させるため、-dオプションを付与している。[]で囲まずに記述すると/bin/sh -cが付与されてプロセスが実行されてしまうので、通常は必ず[]にてコマンドを囲むこと。

実際のDockerfileは以下の通りとなった。

FROM centos

ENV TZ=Asia/Tokyo \
    http_proxy=http://192.168.33.23:8080 \
    https_proxy=http://192.168.33.23:8080
RUN dnf install unbound -y && \
    mkdir /var/log/unbound && \
    chown unbound:unbound /var/log/unbound
COPY unbound.conf /etc/unbound/

EXPOSE 53 53/udp
CMD ["/usr/sbin/unbound", "-d"]

5. コンテナイメージを作成

作成したDockerfileを使って、docker buildコマンドにてコンテナイメージを作成する。

# docker build -t centos-unbound:1 .

# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos-unbound      1                   c86b12252ec1        4 days ago          255MB

6. コンテナを起動

コンテナ起動時には、以下オプションの設定を行う。

設定内容 説明
--name コンテナの名称を設定。今回は「centos-unbound」という名前にする。
-p Dockerホストの通信ポートとコンテナの通信ポートを紐づけを行う。<ホストポート>:<コンテナポート>の書式で記載する。今回はコンテナ側でDNSの53番ポートを使用するが、ホスト側を53番ポートに指定するとlisten udp 0.0.0.0:53: bind: address already in useというエラーが発生したことから、意図的に10053番ポートに設定することとし、10053:53で指定する。なお、TCPだけでなくUDPも指定するため、-pオプションは2つ指定している。
-v Dockerホストのディレクトリ/ファイルとコンテナのディレクトリ/ファイルの紐づけを行う。<ホストディレクトリ/ファイル>:<コンテナディレクトリ/ファイル>の書式で記載する。今回はホストの/var/log/docker/centos-unbound/ディレクトリにコンテナの/var/log/unboundを紐づけることで、ログを出力させる。

上記をふまえ、以下の通りdocker runコマンドでコンテナの起動を行う。

# docker run -d -p 10053:53 -p 10053:53/udp --name "centos-unbound" -v /var/log/docker/centos-unbound:/var/log/unbound centos-unbound:1

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES
af2136d296aa        centos-unbound:1    "/bin/sh -c '/usr/sb…"   3 seconds ago       Up 2 seconds        0.0.0.0:10053->53/tcp, 0.0.0.0:10053->53/udp   centos-unbound

7. logrotate設定

ホストに出力させたログをローテーションさせるため、logrotateの設定を行う。logrotateは/etc/logrotate.d/に以下のような設定ファイルを置けば自動でローテーションが実行されるようになる。

# cat /etc/logrotate.d/docker-log
/var/log/docker/*/maillog
/var/log/docker/*/*.log
{
    rotate 7
    daily
    copytruncate
    dateext
    su root root
}

詳細な説明は、以前の記事を参照いただきたい。

以上でUnboundのコンテナ化が完了となる。

0 件のコメント:

コメントを投稿

人気の投稿