手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 isc-dhcp-server – PXE ブートを見据えた DHCP サーバー構築

PXE ブートでは、DHCP サーバーが IP アドレスだけでなく、TFTP サーバーのアドレスや bootloader のファイル名も通知します。Ubuntu 22.04 で PXE 検証を行う場合、isc-dhcp-server を使うと DHCP の挙動を明示的に確認できます。

この記事では、Ubuntu 22.04 に isc-dhcp-server を導入し、PXE を見据えた subnet、range、next-server、filename、待ち受けインターフェイス、設定検査、ログ確認までを扱います。Ubuntu 22.04 は既存手順の保守対象として扱います。

関連する記事
この記事で確認すること
  • PXE 用 DHCP サーバーの役割
  • isc-dhcp-server の導入
  • dhcpd.conf と待ち受けインターフェイスの設定
  • next-server と filename の指定
  • 設定検査、ログ、lease の確認
参考
書籍
参考書籍

ストーリーで覚える Linux CLI 入門

Linux のコマンドライン操作を基礎から確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

DHCP サーバーの役割

DHCP はクライアントへ IP アドレス、default gateway、DNS、lease time などを渡します。PXE ではさらに、TFTP サーバーと bootloader のファイル名を通知します。

項目役割
subnet配布対象ネットワークを定義する
range動的に配布するアドレス範囲を定義する
option routersdefault gateway を通知する
next-serverTFTP サーバーのアドレスを通知する
filenamePXE で取得する boot file を通知する

パッケージをインストールする

isc-dhcp-server を導入します。既存ネットワークに DHCP サーバーがある環境では、誤って同じセグメントで起動しないように注意します。

sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y isc-dhcp-server
systemctl status isc-dhcp-server --no-pager || true

待ち受けインターフェイスを確認する

DHCP サーバーを待ち受けるインターフェイスを決めます。PXE 用の検証ネットワークだけで待ち受けるのが基本です。

ip -br addr
ip route
networkctl status --no-pager || true

待ち受けインターフェイスを指定する

/etc/default/isc-dhcp-server に IPv4 側の待ち受けインターフェイスを指定します。ここでは例として ens33 を使います。

sudo cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.orig
sudo tee /etc/default/isc-dhcp-server >/dev/null <<'EOF'
INTERFACESv4="ens33"
INTERFACESv6=""
EOF
cat /etc/default/isc-dhcp-server

基本の dhcpd.conf を作成する

まず PXE なしの基本 DHCP 設定を作成します。アドレス範囲、gateway、DNS は実際の検証ネットワークに合わせます。

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
sudo tee /etc/dhcp/dhcpd.conf >/dev/null <<'EOF'
option domain-name-servers 192.0.2.1;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
subnet 192.0.2.0 netmask 255.255.255.0 {
  option routers 192.0.2.1;
  range 192.0.2.100 192.0.2.150;
}
EOF
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

PXE 用の指定を追加する

PXE 用には next-serverfilename を追加します。next-server は TFTP サーバーのアドレス、filename は TFTP root から見た bootloader 名です。

sudo tee /etc/dhcp/dhcpd.conf >/dev/null <<'EOF'
option domain-name-servers 192.0.2.1;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
next-server 192.0.2.10;
filename "grubx64.efi";
subnet 192.0.2.0 netmask 255.255.255.0 {
  option routers 192.0.2.1;
  range 192.0.2.100 192.0.2.150;
}
EOF
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

UEFI と BIOS を分ける場合

UEFI と Legacy BIOS で boot file を分ける場合は、architecture option を見て条件分岐します。検証ではまず単一の boot file で動作確認してから分岐を追加します。

sudo tee /etc/dhcp/dhcpd.conf >/dev/null <<'EOF'
option domain-name-servers 192.0.2.1;
option arch code 93 = unsigned integer 16;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
subnet 192.0.2.0 netmask 255.255.255.0 {
  option routers 192.0.2.1;
  range 192.0.2.100 192.0.2.150;
  next-server 192.0.2.10;
  if option arch = 00:07 {
    filename "grubx64.efi";
  } else {
    filename "pxelinux.0";
  }
}
EOF
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

サービスを起動する

設定検査が通ったらサービスを起動します。既存ネットワークで誤配布しないよう、待ち受けインターフェイスを再確認してから起動します。

sudo systemctl restart isc-dhcp-server
systemctl status isc-dhcp-server --no-pager
sudo ss -lunp | grep ':67' || true

lease を確認する

クライアントにアドレスが配布されると lease ファイルに記録されます。PXE 端末が DHCP まで到達しているかを見る入口になります。

sudo tail -n 80 /var/lib/dhcp/dhcpd.leases
journalctl -u isc-dhcp-server -n 100 --no-pager

パケットを確認する

クライアントが DHCP Discover を出しているか、サーバーが Offer を返しているかを確認します。

sudo tcpdump -ni ens33 port 67 or port 68

TFTP 側との対応を見る

DHCP が返す next-serverfilename は、TFTP サーバー側の実ファイルと対応している必要があります。

grep -E 'next-server|filename' /etc/dhcp/dhcpd.conf
ls -l /srv/tftp/grubx64.efi 2>/dev/null || true
tftp 192.0.2.10 -m binary -c get grubx64.efi

firewall を確認する

DHCP は UDP 67/68 を使います。PXE 検証ネットワークの中で DHCP と TFTP が通ることを確認します。

sudo ufw status verbose
sudo iptables -S | grep -E '67|68|69' || true
sudo nft list ruleset | grep -E '67|68|69' || true

不要になった場合は停止する

検証が終わった DHCP サーバーを残すと、意図しないアドレス配布の原因になります。使わない場合は停止して無効化します。

sudo systemctl disable --now isc-dhcp-server
systemctl status isc-dhcp-server --no-pager || true

よくある失敗

PXE 用 DHCP では、待ち受けインターフェイス、subnet、next-server、filename、TFTP 側ファイル名のずれで止まりやすいです。

  • 既存 LAN 側で DHCP サーバーを起動してしまう
  • INTERFACESv4 が空のままになっている
  • subnet 定義がインターフェイスのアドレスと合っていない
  • filename と TFTP root のファイル名が違う
  • DHCP は通るが TFTP の UDP 69 番が通らない

まとめ

Ubuntu 22.04 の isc-dhcp-server は、PXE 検証用に DHCP 配布内容を明示したい場合に使えます。INTERFACESv4dhcpd.confnext-serverfilename、lease、ログを順番に確認すると切り分けしやすくなります。

PXE / Autoinstall では、DHCP、TFTP、HTTP の役割を分けて確認することが重要です。DHCP で boot file の場所を通知し、TFTP で bootloader を取得できることを確認してから Autoinstall の HTTP 配布へ進みます。

関連する記事
Ubuntu 22.04 isc-dhcp-server – PXE ブートを見据えた DHCP サーバー構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る