手当たり次第に書くんだ

飽きっぽいのは本能

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

この記事の位置づけ

isc-dhcp-server で LAN 向けにアドレスを配布し、必要に応じて PXE ブートに必要な TFTP サーバーとブートローダー情報を渡す記事です。通常の DHCP 配布と PXE 用の追加情報を分けて考えます。

Ubuntu 22.04 サーバー構築・運用メモへ戻る

DHCP が PXE で担当する範囲

DHCP は単に IP アドレスを配布するだけではなく、PXE ブートでは「次にどのサーバーから、どのファイルを取得するか」をクライアントへ伝えます。通常の DHCP 設定と PXE 用の設定を混ぜて理解すると切り分けが難しくなるため、役割を分けて見る方が扱いやすいです。

項目意味
rangeクライアントに配布する IPv4 アドレス範囲
option routersデフォルトゲートウェイ
option domain-name-serversDNS サーバー
next-serverPXE クライアントが参照する TFTP サーバー
filenamePXE クライアントが最初に取得するブートローダー

PXE と組み合わせる場合の注意

  • 同一セグメントに意図しない DHCP サーバーを置かない。
  • PXE 対象のネットワークと通常端末向けネットワークを分けるか、設定範囲を明確にする。
  • UEFI / BIOS で必要なブートローダーが異なるため、対象環境を固定して検証する。
  • TFTP サーバー側のファイル配置と DHCP の filename を必ず対応させる。

PXE 全体の流れは Ubuntu 22.04 PXE と Autoinstall を使用したインストールの自動化、TFTP 側の構成は Ubuntu 22.04 tftpd-hpa TFTP サーバー構築 で確認します。

DHCP サーバーの役割

isc-dhcp-server を使用して DHCP サーバーを構築します。

DHCP (Dynamic Host Configuration Protocol) サーバーは、ネットワーク内のデバイスに自動的に IP アドレスやその他のネットワーク設定を割り当てる機能を提供します。RFC 2131 で定義されています。

ネットワークプロトコル

DHCP は UDP (User Datagram Protocol) を使用します。ポート番号はサーバー側が 67 (dhcps) 、クライアント側は 68 (dhcpc) を使用します。

主な機能

DHCP の主な機能は次のとおりです。

  1. IP アドレスの割り当て
  2. サブネットマスク、デフォルトゲートウェイ、DNS サーバーなどのネットワーク設定の提供
  3. アドレスの再利用
  4. IP アドレスの管理
  5. PXE boot における ブートローダーの情報提供

注意事項

DHCP を使用する際に注意すべき点は次のとおりです。

  1. DHCP サーバーの適切な設定とセキュリティ確保が重要です。不正な DHCP サーバーがネットワークに接続されると、ネットワークのセキュリティに影響を与える可能性があります。
  2. 原則として同一セグメント内に複数の DHCP サーバーを設置することはできないとされていますが、冗長化の目的で、DHCP サーバーが割り当てるレンジを分けて複数の DHCP サーバーを設置するケースもあります。専用アプライアンスによっては HA 機能を持つ場合もあります。
  3. DHCP は IPv4 限定のプロトコルです。IPv6 で使用するには、DHCPv6 が必要となりますが、DHCPv6 はデフォルトゲートウェイの割り当て機能がありません。なお、IPv6 でのIPアドレスの自動割り当て機能は RA (Router Advertisement) が使われるケースが多く、デフォルトゲートウェイを割り当てる機能がないことからも、DHCPv6 はあまり積極的に使われないと思います。

前提条件

  • こちらを参考に基本設定が完了していること。

インストール

isc-dhcp-server をインストールします。

sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install isc-dhcp-server

/etc/dhcp/dhcpd.conf

isc-dhcp-server の設定ファイルは /etc/dhcp/dhcpd.conf です。

デフォルト値

デフォルト値は下記の通りです。

grep -v -e '^\s*#' -e '^\s*$' /etc/dhcp/dhcpd.conf | expand | tr -s [:space:] | sed 's/^ /    /g'
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;

設定値

設定例は下記の通りです。一般的な環境では十分な設定内容となっています。domain-name はホスト名を FQDN に補完するための設定ですが、これは便利なようであまり効果的ではない設定だと思っています。つまり、FQDN でなくてもホスト名のみでアクセス可能となる点が便利なのですが、運用的には同一ホストに対して複数のアクセス先が存在すると無用な混乱を招きますし、情報量もそれに応じて増えます。このため、個人的にはあえて設定しないことを推奨していますが、もちろん、それを必要とする環境であれば設定してください。本稿の環境では不要なため削除しています。

sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.orig
sudo tee /etc/dhcp/dhcpd.conf <<"EOF"
option domain-name-servers 10.0.51.71;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
subnet 10.0.33.0 netmask 255.255.255.0 {
    option routers 10.0.33.1;
    range dynamic-bootp 10.0.33.128 10.0.33.159;
}
EOF

/etc/default/isc-dhcp-server

IP アドレスが有効な複数のインターフェイスが存在している場合、dhcpd.conf にそれに対応する設定が無いと起動時にエラーが出力されます。以下の設定で DHCP サーバーが有効となるインターフェイスを限定することでこのエラーを回避できます。この設定は環境により不要です。

デフォルト値

デフォルト値は下記の通りです。

grep -v -e '^\s*#' -e '^\s*$' /etc/default/isc-dhcp-server | expand | tr -s [:space:] | sed 's/^ /    /g'
INTERFACESv4=""
INTERFACESv6=""

設定値

設定例は下記の通りです。

sudo cp /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.orig
sudo tee /etc/default/isc-dhcp-server <<"EOF"
INTERFACESv4="ens33"
INTERFACESv6=""
EOF

設定の有効化

設定を有効化します。

sudo systemctl restart isc-dhcp-server.service && systemctl status isc-dhcp-server.service

Appendix

PXE boot 用の設定

PXE boot 用の設定は下記の通りです。PXE boot を必要とする環境は非常に限られていると思いますが、Ubuntu において Autoinstall などを組み合わせてインストールプロセスを自動化したい場合は必須です。

この設定フィルには以下も含まれます。

  • 自ネットワーク以外に DHCP を提供しています。この DHCP サーバーは 10.1.0.0/24 に属しますが、PXE boot 対象となるサーバーは 172.17.0.0/24 に属しています。自ネットワークを DHCP に含めないと DHCP は起動することができません。異なるネットワークへ DHCP を提供するため、上位の L3SW で DHCP リレーを設定しています。
  • MAC アドレスをベースとし、ubuntu.s1230.com に固定 IP アドレスを設定しています。PXE boot 完了後の対象ホストへのアクセスをスムーズにするためです。
sudo tee /etc/dhcp/dhcpd.conf <<"EOF"
option domain-name-servers 10.1.0.53;
option arch code 93 = unsigned integer 16;
class "pxeclients"{
    match if substring (option vendor-class-identifier,0,9) = "PXEClient";
    next-server 10.1.0.69;
    filename grubnetx64.efi.signed;
}
subnet 10.1.0.0 netmask 255.255.255.0 {
}
subnet 172.17.0.0 netmask 255.255.255.0 {
    option routers 172.17.0.1;
    range dynamic-bootp 172.17.0.224 172.17.0.239;
}
host ubuntu.s1230.com {
    hardware ethernet 80:ee:73:e2:2c:a3;
    fixed-address 172.17.0.23;
}
EOF

以下は PXE boot 用設定の説明です。

設定説明
option arch code 93 = unsigned integer 16;クライアントのアーキテクチャ情報を定義するオプションを設定しています。アーキテクチャ情報は PXE ブート時に特定のブートローダーを提供するために使用されます。
match if substring (option vendor-class-identifier,0,9) = “PXEClient”;class-identifier オプションが PXEClient で始まるクライアントを対象としています。これに一致するクライアントに対して、次の設定が適用されます。
next-server 10.1.0.69;PXE クライアントの次のサーバーとして 10.1.0.69 (TFTP) を指定しています。
filename grubnetx64.efi.signed;PXE クライアントに提供するブートローダーのファイル名を指定しています。
PXE boot 用の設定

DHCP サーバーを立てる時の注意

DHCP サーバーは同一 L2 セグメント上のクライアントへ強い影響を与えます。検証用に立てる場合でも、既存の DHCP サーバーと競合しないネットワークで動かすことが重要です。

PXE 用途では、単なる IP アドレス配布だけでなく、next-server、filename、UEFI / BIOS の違いを意識します。

次に読む記事

Ubuntu 22.04 サーバー構築・運用メモへ戻る

参考書籍

参考書籍
参考書籍

Advanced Ubuntu Administration and Management Best Practices

Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

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

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

コメントを残す

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

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

トップへ戻る