DHCPサーバーをローカルで立ち上げる場合、Linux上にISC DHCPやKea DHCPをインストールして運用することが多いかと思います。
今回はDHCPサーバーをコンテナ化してDocker上で動かし、ローカルネットワークにIPアドレスを配布できるようにします。
コンテナ化することで、使用するOSや環境ごとに微妙に異なる手順を統一して展開できたり、バックアップを取るのも設定ファイルだけで済んだり、あるいはマシンを変える場合も設定のみをtarで固めて、移行先のマシンで展開・起動するだけで済むなど、何かとメリットがあります。
今回使用するファイルはすべてgithubに置いてありますので、こちらを使用して進めていきます。
https://github.com/ytsurui/kea-dhcp4-docker-simple
前提条件
今回の記事は、下記のソフトウェアが事前にホスト上にインストールされていることを前提としています。
また、コマンドを実行する場合、必要に応じてsudoコマンドを併用してroot権限で行ってください。
docker、docker-composeコマンドの実行には、インストール後に権限を触ってない場合は、root権限で実行しないとエラーが出るかと思います。
動作確認は、ubuntu server 20.04 x64で取っていますが、arm版のubuntuや、CentOSなど他の環境にdockerをインストールした環境でも動くと思います。
ファイルの準備
最初に、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