DHCP(Dynamic Host Configuration Protocol)
IP アドレス・サブネットマスク・デフォルトゲートウェイ・DNS サーバなどを自動配布するプロトコル。 DORA の流れ、オプション、リレー、DHCPv6、セキュリティまで。
DHCP が解決する問題
- 各端末に手動で IP を振るのは運用が破綻する(数百台規模で)
- ノート PC が場所を変えるたびに設定変更したくない
- サブネットマスク・GW・DNS など複数情報をまとめて配布したい
- 使われなくなった IP を再利用したい
前身は BOOTP(RFC 951)。DHCP(RFC 2131)はその拡張で、現代まで使われている。
登場人物
- DHCP クライアント: 端末(PC / スマホ / IoT 機器)
- DHCP サーバ: IP プールを管理して配布する。ルータ内蔵 or 専用サーバ
- DHCP リレーエージェント: 別サブネットの DHCP 要求を中継
DORA:4 ステップの流れ
Client Server
| |
|-- DHCPDISCOVER (broadcast) ------------>|
| src: 0.0.0.0 dst: 255.255.255.255 |
| |
|<-- DHCPOFFER ----------------------------|
| "192.168.1.50 を提案します" |
| |
|-- DHCPREQUEST (broadcast) ------------->|
| "192.168.1.50 をお願いします" |
| |
|<-- DHCPACK ------------------------------|
| "確定。リース 24 時間" |
| |
↓
IP 設定完了
DISCOVER
- クライアントは IP をまだ持っていないので送信元 0.0.0.0
- 宛先 255.255.255.255(リミテッド・ブロードキャスト)
- UDP 67(サーバ) / 68(クライアント)
- L2 ブロードキャスト(FF:FF:FF:FF:FF:FF)
- クライアントの MAC アドレスでリクエストを識別
OFFER
- サーバが空きから 1 つ選んで提案
- 複数のサーバが居ると複数の OFFER が返る
- リース時間、サブネットマスク、GW、DNS 等を含む
REQUEST
- クライアントが採用する OFFER を選び、ブロードキャストで通知
- 「他のサーバ向けに『不採用』通知」を兼ねる
ACK
- 選ばれたサーバが正式に確定
- 選ばれなかったサーバはこの IP を解放
- ACK の代わりに NAK が返ることもある(既に他に割当済み等)
DHCP メッセージタイプ
| タイプ | 用途 |
|---|---|
| DHCPDISCOVER | サーバ探し |
| DHCPOFFER | 提案 |
| DHCPREQUEST | 要求 / 更新 |
| DHCPACK | 承認 |
| DHCPNAK | 拒否 |
| DHCPDECLINE | クライアントが「使えない」と返す(重複検知) |
| DHCPRELEASE | クライアントが解放 |
| DHCPINFORM | IP は持っているが追加情報が欲しい |
パケット構造(簡略)
+-------+-------+-------+-------+
| op | htype | hlen | hops |
+-------+-------+-------+-------+
| xid (transaction ID, 32 bit) |
+-------+-------+---------------+
| secs | flags |
+---------------+---------------+
| ciaddr (Client IP) |
+-------------------------------+
| yiaddr (Your IP, サーバが入れる)|
+-------------------------------+
| siaddr (Server IP) |
+-------------------------------+
| giaddr (Gateway/Relay) |
+-------------------------------+
| chaddr (Client MAC, 16 bytes) |
+-------------------------------+
| sname (Server name, 64) |
+-------------------------------+
| file (Boot filename, 128) |
+-------------------------------+
| Magic Cookie (0x63825363) |
+-------------------------------+
| Options (可変) |
+-------------------------------+
DHCP オプション(主要)
| Code | 名称 | 用途 |
|---|---|---|
| 1 | Subnet Mask | サブネットマスク |
| 3 | Router | デフォルトゲートウェイ |
| 6 | DNS Servers | DNS のリスト |
| 12 | Host Name | クライアントのホスト名 |
| 15 | Domain Name | ドメインサフィックス |
| 26 | Interface MTU | MTU |
| 42 | NTP Servers | 時刻同期サーバ |
| 43 | Vendor Specific | 機器固有情報(PoE 機器など) |
| 50 | Requested IP | クライアントが希望する IP |
| 51 | Lease Time | リース期間(秒) |
| 53 | Message Type | DISCOVER / OFFER / REQUEST など |
| 54 | Server Identifier | 選ばれたサーバの IP |
| 55 | Parameter Request List | クライアントが欲しいオプション一覧 |
| 58 | Renewal Time (T1) | 更新試行のタイミング |
| 59 | Rebinding Time (T2) | 別サーバへ切替試行 |
| 61 | Client Identifier | クライアント識別子(MAC など) |
| 66 / 67 | TFTP Server / Bootfile | PXE ブート |
| 119 | Domain Search | 検索ドメイン |
| 121 | Classless Static Route | 静的経路 |
リース期間とライフサイクル
0% T1 (50%) T2 (87.5%) 100%
|---------------------------|-------------------|--------------------|
通常使用 更新試行 (Renew) 別サーバへ (Rebind)
リース失効
- T1(50%): 自分にリースをくれたサーバへ更新(unicast REQUEST)
- T2(87.5%): そのサーバが応答しないなら、他のサーバへブロードキャスト
- 100%: 失効。IP を破棄して再度 DISCOVER から
DHCP リレー
DHCP はブロードキャストで動くため、ルータを越えない。 異なるサブネットに 1 台のサーバを置くにはDHCP リレーが必要。
- クライアントが DISCOVER をブロードキャスト
- ルータ(リレー)が受け取り、giaddr に自分の IP を入れて DHCP サーバへ unicast 転送
- サーバは giaddr のサブネットから IP を選んで応答
- 応答はリレーを経由してクライアントへ届く
Cisco / 一般ルータでの設定
interface Vlan10
ip helper-address 10.0.0.5 ! DHCP サーバの IP
DHCP サーバの実装
ISC DHCP / dhcpd(古典)
# /etc/dhcp/dhcpd.conf
default-lease-time 86400;
max-lease-time 172800;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 1.1.1.1, 8.8.8.8;
option domain-name "example.local";
}
# 静的割当
host printer {
hardware ethernet 00:1a:2b:3c:4d:5e;
fixed-address 192.168.1.50;
}
dnsmasq(軽量、家庭向け)
# /etc/dnsmasq.conf
dhcp-range=192.168.1.100,192.168.1.200,12h
dhcp-option=3,192.168.1.1 # GW
dhcp-option=6,1.1.1.1,8.8.8.8 # DNS
dhcp-host=00:1a:2b:3c:4d:5e,192.168.1.50,printer
Kea(ISC の後継)
モダンな DHCP サーバ。JSON 設定、HA / API 対応。
クライアント側のコマンド
# Linux (dhclient)
sudo dhclient -r eth0 # 解放
sudo dhclient eth0 # 再取得
# 現代の Linux (NetworkManager / systemd-networkd)
sudo nmcli connection up eth0
networkctl renew eth0
# macOS
sudo ipconfig set en0 BOOTP # 一旦無効
sudo ipconfig set en0 DHCP # DHCP 再取得
ipconfig getpacket en0 # 受信した DHCP 情報を表示
# Windows
ipconfig /release
ipconfig /renew
ipconfig /all
静的アドレス割当 vs DHCP
| 静的 | DHCP(動的) | DHCP 予約 | |
|---|---|---|---|
| 設定場所 | 各端末 | 各端末(自動) | サーバ側 |
| 運用負荷 | 高 | 低 | 中 |
| 移動性 | 低 | 高 | 高 |
| 用途 | サーバ | クライアント | プリンタ等の固定機器 |
DHCPv6
- UDP 547(サーバ) / 546(クライアント)
- マルチキャスト ff02::1:2 を使う(ブロードキャストは IPv6 にない)
- SLAAC と併用が一般的
- ステートフル: アドレスも DHCP 配布
- ステートレス: アドレスは SLAAC、DNS だけ DHCP
- DHCPv6-PD(Prefix Delegation): ISP が
/56や/48を配布、家庭ルータが/64ずつに分配
セキュリティ
不正な DHCP サーバ(Rogue DHCP)
悪意あるサーバが DHCP 応答を流して偽の GW / DNS を配布すると、トラフィックを乗っ取れる。
DHCP Snooping
スイッチで「正規の DHCP サーバが繋がっているポート」だけを信頼。 他のポートからの DHCP OFFER / ACK は破棄。
DHCP Starvation
攻撃者が大量の偽 MAC で DISCOVER を送り、IP プールを枯渇させる。 対策: ポートあたりの MAC 制限、Snooping。
Option 82
リレーエージェントが「どのスイッチのどのポート」から来たかを付加情報として送る。 正規端末の識別やログ追跡に有用。
IP 重複検知(DAD / GARP)
- クライアントは ACK 後、ARP リクエストで重複検知を行うことがある
- 応答が来たら DECLINE をサーバに送り、別アドレスを要求
- 正常運用ではめったに発動しない
PXE ブート
DHCP オプション 66 / 67 でネットワーク起動を指示する仕組み。 OS インストール、シンクライアント、IoT デバイスのプロビジョニングで使われる。
DHCP DISCOVER → OFFER に「TFTP サーバ + ブートファイル」が含まれる
↓
クライアントが TFTP でブートローダ取得
↓
ブートローダがカーネルを取得
↓
OS 起動 / ネットワークインストール
DHCP Fingerprint
各 OS の DHCP リクエストには独特のオプション順序がある。 サーバ側で見ると「これは iOS だな」「これは Windows だな」と推測できる(fingerbank 等)。 ネットワーク管理ツールの端末識別に使われる。
失敗パターン
| 症状 | 原因 |
|---|---|
| IP が取れない (169.254.x.x) | DHCP に届いていない(VLAN / リレー / ケーブル) |
| たまに違う IP になる | リース満了で別 IP が振られた |
| 固定 IP 機器が DHCP の範囲と被る | 静的設定とプール範囲を分離する |
| すぐに切れる / 接続不安定 | 2 台目の Rogue DHCP がいる |
| 新規端末だけ繋がらない | DHCP プール枯渇 / DHCP Starvation |
| VPN 後に DNS が引けない | Option 6 が古いまま、resolv.conf を確認 |
キャプチャの読み方
Wireshark で bootp や udp.port == 67 でフィルタ。
DORA 4 つのパケットが順番に並ぶのが見える。
運用 Tips
- プール範囲と静的範囲を明確に分離(例: .100〜.200 は DHCP、.10〜.50 は静的)
- サーバ・プリンタ・カメラなどはDHCP 予約で静的化(端末側は何もしないで済む)
- リース時間は環境次第(モバイル多いネットワークは短く、安定環境は 24h)
- IP 利用率を監視(プール枯渇のアラート)
- DHCP ログは長期保存(フォレンジック / 端末特定)
まず ipconfig / ip a で IP を確認。
169.254.x.x なら DHCP が動いていない、それ以外で外に出れないなら GW / DNS の問題。
DHCP は原因切り分けの最初の手がかりになる。