DHCP(Dynamic Host Configuration Protocol)

IP アドレス・サブネットマスク・デフォルトゲートウェイ・DNS サーバなどを自動配布するプロトコル。 DORA の流れ、オプション、リレー、DHCPv6、セキュリティまで。

DHCP が解決する問題

前身は BOOTP(RFC 951)。DHCP(RFC 2131)はその拡張で、現代まで使われている。

登場人物

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

OFFER

REQUEST

ACK

DHCP メッセージタイプ

タイプ用途
DHCPDISCOVERサーバ探し
DHCPOFFER提案
DHCPREQUEST要求 / 更新
DHCPACK承認
DHCPNAK拒否
DHCPDECLINEクライアントが「使えない」と返す(重複検知)
DHCPRELEASEクライアントが解放
DHCPINFORMIP は持っているが追加情報が欲しい

パケット構造(簡略)

+-------+-------+-------+-------+
| 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名称用途
1Subnet Maskサブネットマスク
3Routerデフォルトゲートウェイ
6DNS ServersDNS のリスト
12Host Nameクライアントのホスト名
15Domain Nameドメインサフィックス
26Interface MTUMTU
42NTP Servers時刻同期サーバ
43Vendor Specific機器固有情報(PoE 機器など)
50Requested IPクライアントが希望する IP
51Lease Timeリース期間(秒)
53Message TypeDISCOVER / OFFER / REQUEST など
54Server Identifier選ばれたサーバの IP
55Parameter Request Listクライアントが欲しいオプション一覧
58Renewal Time (T1)更新試行のタイミング
59Rebinding Time (T2)別サーバへ切替試行
61Client Identifierクライアント識別子(MAC など)
66 / 67TFTP Server / BootfilePXE ブート
119Domain Search検索ドメイン
121Classless Static Route静的経路

リース期間とライフサイクル

0%                            T1 (50%)            T2 (87.5%)         100%
|---------------------------|-------------------|--------------------|
   通常使用                     更新試行 (Renew)     別サーバへ (Rebind)
                                                                   リース失効
      

DHCP リレー

DHCP はブロードキャストで動くため、ルータを越えない。 異なるサブネットに 1 台のサーバを置くにはDHCP リレーが必要。

  1. クライアントが DISCOVER をブロードキャスト
  2. ルータ(リレー)が受け取り、giaddr に自分の IP を入れて DHCP サーバへ unicast 転送
  3. サーバは giaddr のサブネットから IP を選んで応答
  4. 応答はリレーを経由してクライアントへ届く

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

セキュリティ

不正な DHCP サーバ(Rogue DHCP)

悪意あるサーバが DHCP 応答を流して偽の GW / DNS を配布すると、トラフィックを乗っ取れる。

DHCP Snooping

スイッチで「正規の DHCP サーバが繋がっているポート」だけを信頼。 他のポートからの DHCP OFFER / ACK は破棄。

DHCP Starvation

攻撃者が大量の偽 MAC で DISCOVER を送り、IP プールを枯渇させる。 対策: ポートあたりの MAC 制限、Snooping。

Option 82

リレーエージェントが「どのスイッチのどのポート」から来たかを付加情報として送る。 正規端末の識別やログ追跡に有用。

IP 重複検知(DAD / GARP)

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 で bootpudp.port == 67 でフィルタ。 DORA 4 つのパケットが順番に並ぶのが見える。

運用 Tips

「ネットに繋がらない」と言われたら

まず ipconfig / ip a で IP を確認。 169.254.x.x なら DHCP が動いていない、それ以外で外に出れないなら GW / DNS の問題。 DHCP は原因切り分けの最初の手がかりになる。