LinuxでDHCPサーバーを構築する方法:実運用で検証済みガイド

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

クイックスタート — 5分でDHCPサーバーを動かす

6ヶ月前、古くなったルーターをUbuntu 22.04専用マシンに置き換えました。そのルーターはDHCPホストを兼用していて不安定になってきていたんです。3つのサブネットで6ヶ月間の本番運用を経た今、Linuxのセットアップは一度も問題を起こしていません。これまで使ってきたどの家庭用ファームウェアよりも安定していて、柔軟性も高いです。

LinuxでDHCPサーバーを素早く動かすにはdnsmasqが最短ルートです。DHCPとDNSを1つの軽量パッケージで処理できるため、エンタープライズ級の機能がまだ不要な場合に最適です。

# dnsmasqをインストール
sudo apt update && sudo apt install -y dnsmasq

# ポート53を占有しているsystemd-resolvedを停止
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

メイン設定ファイルを編集します:

sudo nano /etc/dnsmasq.conf

以下の行を追加します(インターフェースとIPレンジはネットワークに合わせて調整してください):

interface=eth1
bind-interfaces
dhcp-range=192.168.10.100,192.168.10.200,24h
dhcp-option=option:router,192.168.10.1
dhcp-option=option:dns-server,8.8.8.8,1.1.1.1

起動します:

sudo systemctl restart dnsmasq
sudo systemctl enable dnsmasq

ローカルネットワークでIPを配布するための最小限の設定はこれだけです。スタティックリース、複数サブネット、PXEブートなど、より細かい制御が必要な場合は読み進めてください。

詳細解説 — 完全制御のためのISC DHCPサーバー

3つのVLANとPXEブート環境を扱うようになると、dnsmasqの限界が見えてきました。そこでクラシックなdhcpdであるisc-dhcp-serverに乗り換えました。アドレス割り当てのあらゆる側面を細かく制御できます。

インストール

sudo apt install -y isc-dhcp-server

リッスンインターフェースの設定

/etc/default/isc-dhcp-serverを編集して、dhcpdがリッスンするインターフェースを指定します:

INTERFACESv4="eth1"

メイン設定ファイルの作成

実際の設定は/etc/dhcp/dhcpd.confにあります。スタティック予約と適切なリース時間を設定した本番環境対応の例を示します:

# グローバル設定
default-lease-time 86400;     # 24時間
max-lease-time 604800;        # 7日間
authoritative;

# サブネット宣言
subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.100 192.168.10.200;
  option routers 192.168.10.1;
  option subnet-mask 255.255.255.0;
  option domain-name-servers 8.8.8.8, 1.1.1.1;
  option broadcast-address 192.168.10.255;
}

# サーバー用スタティックリース
host fileserver {
  hardware ethernet aa:bb:cc:dd:ee:ff;
  fixed-address 192.168.10.50;
}

起動と確認

sudo systemctl restart isc-dhcp-server
sudo systemctl enable isc-dhcp-server

# ステータス確認
sudo systemctl status isc-dhcp-server

# リアルタイムでリースを監視
sudo tail -f /var/lib/dhcp/dhcpd.leases

サービスが起動しない場合、設定パーサーは通常明確なエラーメッセージを表示します。sudo dhcpd -t -cf /etc/dhcp/dhcpd.confを実行すると、サービスを再起動せずに設定を検証できます。

リースファイルの理解

/var/lib/dhcp/dhcpd.leasesのリースデータベースにはすべての割り当てが記録されます。エントリは次のようになります:

lease 192.168.10.105 {
  starts 5 2024/01/12 02:30:00;
  ends 6 2024/01/13 02:30:00;
  binding state active;
  hardware ethernet 11:22:33:44:55:66;
  client-hostname "laptop-dev";
}

このファイルは追記専用で、期限切れのエントリが時間とともに蓄積されます。これは正常な動作です。dhcpdは定期的にファイルを書き直して無限に増え続けないようにしています。

応用的な使い方

複数サブネットとVLAN

2ヶ月目にはマルチサブネットのサポートが必要になりました。アプローチとしては、LinuxホストでVLANごとに仮想インターフェースを作成するか、マネージドスイッチのトランクポートを使う方法があります。VLANインターフェースの作成方法を示します:

# VLANインターフェースを作成(vlanパッケージが必要)
sudo ip link add link eth1 name eth1.20 type vlan id 20
sudo ip addr add 192.168.20.1/24 dev eth1.20
sudo ip link set eth1.20 up

dhcpd.confに別のサブネットブロックを追加します:

subnet 192.168.20.0 netmask 255.255.255.0 {
  range 192.168.20.50 192.168.20.150;
  option routers 192.168.20.1;
  option domain-name-servers 8.8.8.8;
}

/etc/default/isc-dhcp-serverのインターフェース行を更新します:

INTERFACESv4="eth1 eth1.20"

PXEブートのサポート

ネットワークブートでマシンをデプロイする場合は、サブネットブロックに以下のオプションを追加します:

subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.100 192.168.10.200;
  option routers 192.168.10.1;
  option domain-name-servers 8.8.8.8;

  # PXEブートオプション
  filename "pxelinux.0";
  next-server 192.168.10.10;   # TFTPサーバーのIPアドレス
}

アクティブなリースの監視

素早く確認するために、リースファイルを読みやすいテーブル形式に変換する小さなエイリアスを作りました:

alias dhcp-leases='grep -E "lease|hardware|client-hostname" /var/lib/dhcp/dhcpd.leases | paste - - -'

より構造化された情報が必要な場合、dhcpd-poolsでプール使用率の統計を確認できます:

sudo apt install dhcpd-pools
dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases

6ヶ月の本番運用から得た実践的なヒント

再起動前に必ずdhcpd -tを実行する

設定の構文エラーがあると、DHCPサービスが静かに停止してしまいます。これを習慣にしましょう:

sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf && sudo systemctl restart isc-dhcp-server

フェイルオーバーペアの構築

このステップは省略しないでください。DHCPサーバーがダウンすると、ネットワーク上のすべての新規デバイスがIPを取得できなくなります。デバイスは接続を試み、60秒のタイムアウトを待って諦めます。ISC DHCPにはネイティブのフェイルオーバープロトコルが組み込まれています。2台のサーバーがリース状態を共有するため、クライアントはどちらのサーバーからでも更新できます:

# プライマリサーバーのサブネットブロック内に追加:
failover peer "dhcp-failover" {
  primary;
  address 192.168.10.1;
  port 647;
  peer address 192.168.10.2;
  peer port 647;
  max-response-delay 60;
  max-unacked-updates 10;
  load balance max seconds 3;
  mclt 3600;
  split 128;
}

セカンダリはprimary;の代わりにsecondary;を使って同じ設定をミラーリングします。

ファイアウォールルール

ファイアウォールでDHCPトラフィックを許可することを忘れないでください。DHCPはUDPポート67(サーバー)と68(クライアント)を使用します:

sudo ufw allow 67/udp
sudo ufw allow 68/udp

有用なログをすべて記録する

dhcpdはデフォルトでsyslogにログを記録します。DHCPアクティビティだけをフィルタリングするには:

sudo journalctl -u isc-dhcp-server -f

永続的なログファイルを使いたい場合は、/etc/dhcp/dhcpd.confでリダイレクトします:

log-facility local7;

次にrsyslogを設定してlocal7.*/var/log/dhcpd.logに書き込むようにします。

dnsmasq対isc-dhcp-server — どちらを使うべきか

  • dnsmasq:ホームラボ、小規模オフィス、1台でDNS+DHCPを兼用する場合、設定の手間を最小限に抑えたい場合。
  • isc-dhcp-server:複数サブネット、フェイルオーバー、PXEブート、複雑なオプション設定、細かいリース制御が必要な場合。

どちらも本番環境で十分機能します。評判ではなく、実際に管理する必要がある複雑さに基づいて選びましょう。

Share: