自宅サーバコンテナ化対応として、今回は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 件のコメント:
コメントを投稿