2021年2月7日日曜日

Kea DHCPv4 ServerをDocker上で動作させる

DHCPサーバーをローカルで立ち上げる場合、Linux上にISC DHCPやKea DHCPをインストールして運用することが多いかと思います。

今回はDHCPサーバーをコンテナ化してDocker上で動かし、ローカルネットワークにIPアドレスを配布できるようにします。

コンテナ化することで、使用するOSや環境ごとに微妙に異なる手順を統一して展開できたり、バックアップを取るのも設定ファイルだけで済んだり、あるいはマシンを変える場合も設定のみをtarで固めて、移行先のマシンで展開・起動するだけで済むなど、何かとメリットがあります。

今回使用するファイルはすべてgithubに置いてありますので、こちらを使用して進めていきます。

https://github.com/ytsurui/kea-dhcp4-docker-simple

前提条件

今回の記事は、下記のソフトウェアが事前にホスト上にインストールされていることを前提としています。

  • docker-ce
  • docker-compose
また、コマンドを実行する場合、必要に応じてsudoコマンドを併用してroot権限で行ってください。
docker、docker-composeコマンドの実行には、インストール後に権限を触ってない場合は、root権限で実行しないとエラーが出るかと思います。

動作確認は、ubuntu server 20.04 x64で取っていますが、arm版のubuntuや、CentOSなど他の環境にdockerをインストールした環境でも動くと思います。

ファイルの準備

最初に、gitコマンドで上記リポジトリの内容をすべてローカルにクローンするか、あるいは下記に示すファイルのみをテキストレベルでコピーします。

  • gitコマンドを使用する場合
git clone https://github.com/ytsurui/kea-dhcp4-docker-simple

  • ファイルをコピーする場合
    • Dockerfile
    • docker-compose.yaml
    • conf/kea-dhcp4.conf

設定の修正

ファイルの準備ができたら、conf/kea-dhcp4.confを自身の環境に適合するように、必要に応じて書き換えます。
初期状態では、下記に示す設定となっています。
  • DHCPリクエストを受け付けるネットワークインターフェイス名:
      ens192
  • IPアドレスの配布対象とするネットワーク: 192.168.4.0/24
  • プール範囲: 192.168.4.11 - 192.168.4.200
  • デフォルトゲートウェイ: 192.168.4.1
  • DNSサーバー: 192.168.4.1
  • ドメイン名: your-domain.local
それぞれ、下図で示す箇所に対応しています。


特に明言はされていませんが、設定ファイルの書式はJSON形式になっていますので、JSONの取り扱い経験がある場合はすんなりと触れると思います。

配布対象のネットワークを増やす場合は、31行目から始まるsubnet4の配列に含まれている配布対象とするネットワーク、IPアドレス配布プール、デフォルトゲートウェイの固まりを増やしていけば幾らでも追加できます。

また、ローカルドメイン名などが不要な場合は、その項目を中括弧ごと消し込むことで配布されなくなります。

ネットワークインターフェイス名の確認

ネットワークインターフェイス名は、DHCPコンテナを動作させるホストマシンのネットワークインターフェイス名を指定します。

最近のLinux環境では、ip addr showで入れるとマシン上で使用可能なネットワークインターフェイス一覧が出てきます。


環境によって、上図のようにens192と出てきたり、eth0と出てきたりしますので、必要に応じて書き換えます。

コンテナの起動

設定の変更が完了したら、DHCPコンテナを起動します。
今回は、docker-composeを利用してお手軽にコンテナを起動していきます。

下記の順番でコマンドを実行し、DHCPコンテナイメージのビルド、DHCPコンテナの起動を行います。

docker-compose build
docker-compose up -d

正しく起動できているかは、「ss -anu」を実行し、DHCPポート(UDP 67)が待ち受けを開始しているか見ることで確認が取れます。


赤枠で囲んだ箇所のように、UDP 67番ポートが待ち受けを開始していれば起動には成功しています。

コンテナ内部で動いているkea-dhcpの動作ログを見たい場合は、「docker-compose logs」で確認できます。
エラーで起動しない場合は、何か変なメッセージが出ているかと思います。

ファイアウォールの開放

dockerホスト上にファイアウォールがインストールされている場合、UDP 67番への着信を許可する必要があります。
firewalldで構成されている場合は、下記のコマンドを実行し、ポート開放を行います。

firewall-cmd --add-port 67/udp --permanent && firewall-cmd --reload