Ubuntu Weekly Recipe

第865回UbuntuでDHCPサーバーを構築する(Ubuntu 24.04 LTS対応版)

DHCPサーバーとは

DHCPサーバーとは、コンピューターがネットワークへ接続するための情報を配布し、自動的な設定を可能とするサーバーです。一般的なご家庭であれば、LANケーブルを繋ぐだけで、あるいはWi-Fiのアクセスポイントに繋ぐだけで、デバイスにIPアドレスが割り当てられ、インターネットへ接続できるようになるでしょう。これが可能なのは、LAN内にDHCPサーバーが存在するためです。

DHCPサーバーは、ネットワークにおいて必須というわけではありません。DHCPサーバーがなくとも、IPアドレスやDNSサーバー、デフォルトゲートウェイといった情報を手動で設定すれば、通信自体は可能だからです。ですが今どきのLANには、PCと比較してネットワークの設定が行いにくい、ゲーム機や液晶テレビのようなデバイスも繋がるのが一般的でしょう。こうした事情を考慮すると、DHCPサーバーは実質的に必須の存在だと言ってよいのではないでしょうか。

筆者にDHCPサーバーが必要になった理由

実は筆者は最近引越しをし、これを機に自宅の回線をフレッツ光クロス(10G)に変更しました。筆者はプロバイダ(光コラボ)の契約上、10Gに対応したルーターのレンタルが必須なのですが、このルーター(XG-100NE)にもDHCPサーバー機能が搭載されています。

図1 XG-100NEの設定画面

DHCPではIPアドレスだけでなく、DHCPオプションとして、使用するDNSサーバーやルーターといった情報を設定できます。ですが見ての通り、このルーターのDHCPサーバー機能では、リースするIPアドレスしか設定できません。というのも一般の家庭においては、LAN内のデバイスがインターネットに接続できればそれでよいというケースがほとんどです。DNSサーバーやゲートウェイはルーター自身が兼ねているため、わざわざ個別に設定する必要がない(できない)こともよくあるのです。実際このDHCPサーバーを有効にすると、使用するDNSサーバーとデフォルトゲートウェイには、このルーター自身のIPアドレス(192.168.1.1)が設定され、これは変更できません。

しかし筆者は第834回第864回で紹介したように、DNSサーバーにUnboundを利用しています。これが非常に快適なため、自由にDNSを指定できないDHCPサーバーは困ります[1]

やはり自分好みの環境を作るのであれば、自由にカスタムできるソフトウェアを使うのが一番です。それならDHCPサーバーもUbuntuで立ててしまおうではないか、というのが今回のお題となります。

Kea DHCPのインストール

それではUbuntu 24.04 LTSのサーバー版に、DHCPサーバーを構築していきましょう。

DHCPサーバーと言えば、従来はInternet Systems Consortium(ISC)が開発していたDHCPd(ISC DHCP)が定番でした。Ubuntuでも、isc-dhcp-serverパッケージとして提供されています。ですがISC DHCPは既に開発元によるサポートが終了しており、後継であるKea DHCPへの移行が推奨されています。isc-dhcp-serverパッケージ自体は現在でも存在しますが、こうした理由から今回はKea DHCPサーバーを使用します。

Ubuntuのリポジトリには、keaというパッケージが存在します。これはKeaのサーバーコンポーネント一式をインストールするためのメタパッケージで、具体的には、IPv4のDHCPサーバー本体である「kea-dhcp4-server⁠⁠、IPv6のDHCPサーバー本体である「kea-dhcp6-server⁠⁠、ダイナミックDNSを提供する「kea-dhcp-ddns-server⁠⁠、REST APIエージェントを提供する「kea-ctrl-agent⁠⁠、バックエンドデータベースの初期化と移行スクリプト、およびDHCPベンチマークツールである「kea-admin」の5つのパッケージがインストールされます。

今回は、IPv4のDHCPサーバーだけがあればいいため、以下のコマンドでkea-dhcp4-serverパッケージのみをインストールしました。

$ sudo apt install -U -y kea-dhcp4-server

なおネットワーク内に複数のDHCPサーバーが存在するのはトラブルの元です。既にDHCPサーバーが動作しているのであれば、このタイミングで停止しておいてください。

Kea DHCPの設定

Kea DHCPサーバー(IPv4)の設定ファイルは、/etc/kea/kea-dhcp4.confです。パッケージをインストールすると、デフォルトの設定ファイルが作成されていますので、これを自分のネットワークにあわせて書き換えましょう。なお見ての通り、フォーマットはJSONです。

筆者の設定は以下の通りです。これがおおむね、Kea DHCPサーバーの最小構成となるでしょう。

{
    "Dhcp4": {
        "interfaces-config": {
            "interfaces": [ "enp1s0" ]
        },

        "lease-database": {
            "type": "memfile",
            "persist": true,
            "name": "/var/lib/kea/kea-leases4.csv",
            "lfc-interval": 3600
        },

        "valid-lifetime": 3600,

        "option-data": [
            {
                "name": "domain-name-servers",
                "data": "192.168.1.4, 192.168.1.5"
            },
        ],

        "subnet4": [
            {
                "id": 1,
                "subnet": "192.168.1.0/24",
                "pools": [ { "pool": "192.168.1.50 - 192.168.1.99" } ],
                "option-data": [
                    {
                        "name": "routers",
                        "data": "192.168.1.1"
                    }
                ]
            }
        ],

        "loggers": [
            {
                "name": "kea-dhcp4",
                "output_options": [
                    {
                        "output": "syslog",
                        "pattern": "%-5p %m\n"
                    }
                ],
                "severity": "INFO",
                "debuglevel": 0
            }
        ]
    }
}

内容について詳しく説明します。

        "interfaces-config": {
            "interfaces": [ "enp1s0" ]
        },

interfacesには、DHCPのリクエストを受け取るインターフェイスを指定します。サーバーによって異なりますので、使用しているNICのデバイス名を指定してください。なおこのNICには、固定IPアドレスが割り当てられている必要があります。Ubuntu Serverの固定IPアドレスの設定方法は、第822回などを参考にしてください。

        "lease-database": {
            "type": "memfile",
            "persist": true,
            "name": "/var/lib/kea/kea-leases4.csv",
            "lfc-interval": 3600
        },

DHCPサーバーがリースしたIPアドレス等の情報は、すべてリースデータベースに記録されます。lease-databaseは、このリースデータベースに関する設定です。typeには情報を保存するストレージを指定します。ここでは小規模な家庭での利用を想定しているため、memfileを指定しました。大規模なネットワークでは、mysqlやpostgresqlといったデータベースも使えます。

persistは、リースに関する情報をファイルに書き込むかどうかを制御します。デフォルトはtrueです。これをfalseに変更してしまうと、サーバーが再起動した際に、払い出したIPアドレスがわからなくなってしまう問題が発生します。そのためtrueのまま変更しないことを推奨します。

nameはリースファイルのパスを指定します。lfc-intervalは、リースファイルのクリーンアップが行われるインターバルを指定します。

        "valid-lifetime": 3600,

valid-lifetimeは、リースされたIPアドレスが有効な期間です。ここでは1時間(3600秒)としました。

        "option-data": [
            {
                "name": "domain-name-servers",
                "data": "192.168.1.4, 192.168.1.5"
            },
        ],

option-dataでは、クライアントに提供する構成オプションを定義します。domain-name-serversは、使用するDNSサーバーの設定です。筆者の自宅には「192.168.1.4(プライマリ⁠⁠」と「192.168.1.5(セカンダリ⁠⁠」という2台のUnboundサーバーが稼動しているため、これを指定しました。

        "subnet4": [
            {
                "id": 1,
                "subnet": "192.168.1.0/24",
                "pools": [ { "pool": "192.168.1.50 - 192.168.1.99" } ],
                "option-data": [
                    {
                        "name": "routers",
                        "data": "192.168.1.1"
                    }
                ]
            }
        ],

subnet4は、IPv4サブネットに関する設定です。このDHCPサーバーに対し、DHCPリクエストを送信するサブネットを、すべて定義する必要があります(とはいえ、通常は1つでしょう⁠⁠。

idは、そのサブネット定義の識別子です。今回はサブネット定義が1つしかないため、1を指定しました。

サブネット定義には、subnetとpoolsの2つのパラメータが必要です。subnetには、そのサブネットのIPv4アドレスの範囲をCIDR表記で記述します。筆者の自宅のネットワークは「192.168.1.0/24」のため、これを設定しました。poolsには、払い出すIPアドレスの範囲を設定します。ここでは「192.168.1.50」「192.168.1.99」までの50個のIPアドレスを使用することにしました。

        "loggers": [
            {
                "name": "kea-dhcp4",
                "output_options": [
                    {
                        "output": "syslog",
                        "pattern": "%-5p %m\n"
                    }
                ],
                "severity": "INFO",
                "debuglevel": 0
            }
        ]

loggersには、ログに関する設定を記述します。nameには、Keaで定義されているログ対象を指定します。ここではIPv4のDHCPサーバー全般をロギングしたいため、⁠kea-dhcp4」を指定します。

output_optionsのoutputには、ログの出力タイプを指定します。今回はsyslogにログを出力したかったため、⁠syslog」を指定しました。patternには、ログメッセージのレイアウトパターンを指定します。詳しくはドキュメントを参照してください。

severityにはログレベルを、debuglevelには、ログレベルをDEBUGにした際の詳細さを指定します。

設定が完了したら、Kea DHCPサーバーを再起動してください。

$ sudo systemctl restart kea-dhcp4-server.service

その状態で、PCやスマホをネットワークに接続してみましょう。/var/log/syslogに、以下のようなログが出力されれば、DHCPサーバーは正しく動作しています。

2025-05-27T12:15:12.860665+00:00 dhcp kea-dhcp4[16772]: 2025-05-27 12:15:12.859 INFO  [kea-dhcp4.leases/16772.131385194116800] DHCP4_LEASE_ADVERT [hwtype=1 e8:6e:3a:9d:da:00], cid=[01:e8:6e:3a:9d:da:00], tid=0xed24c97f: lease 192.168.1.51 will be advertised

またクライアント側でも、設定したレンジのIPアドレスや、DNSサーバー、デフォルトゲートウェイが自動的に設定されていることを確認しましょう。


このようにIPアドレスを配るだけであれば、DHCPサーバーの構築はとても簡単です。もちろん、単にIPアドレスを配るだけであれば、ルーターの機能で十分という人も多いでしょう。ですがKea DHCPサーバーは非常に高いパフォーマンスを誇り、大規模なネットワークにも対応できるDHCPサーバーです。またREST APIでの制御や、再起動なしでの設定の反映など、実運用面でのメリットも多く存在します。Storkというグラフィカルなダッシュボードを導入すれば、Webブラウザからの管理も可能です。ルーターのDHCP機能では物足りない人や、いい加減にISC DHCPdからの移行を考えなければならない人は、Keaを試してみてはいかがでしょうか。

なお筆者はKea DHCP + Unboundで家庭内ネットワークを構築していますが、小規模なDHCP兼DNSサーバーとして、Dnsmasq単体を使うという選択肢もあります。こちらもUbuntuであれば簡単に導入できますので、興味があったら調べてみてください。

おすすめ記事

記事・ニュース一覧