自宅サーバコンテナ化対応として、今回はDNS機能であるUnboundのコンテナ化を行う。
- DockerでPostfixをコンテナ化してメールサーバを構築する
- DockerでUnboundをコンテナ化してDNSサーバを構築する ★本記事
- DockerでSquidをコンテナ化してプロキシサーバを構築する
- Docker Composeを作って複数のコンテナの作成・起動・停止・削除を制御する
環境
今回の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 件のコメント:
コメントを投稿