【図解】DHCPのパケットフォーマット~Magic cookieやsname/fileの意義~ | SEの道標
DHCP

【図解】DHCPのパケットフォーマット~Magic cookieやsname/fileの意義~

DHCPのパケットフォーマット

DHCP のパケットフォーマットを理解するには、DHCP が bootp と互換性があることを意識する必要があります。

DHCP のパケットフォーマットは RFC 2132 にて定義されています。以下にフォーマットを示します。

 

op = Message Operation Code

op=1 は boot request を意味し、DHCP クライアントからのメッセージであることを示します。op=2 は boot reply を意味し、DHCP サーバからのメッセージであることを示します。

htype = Hardware Address Type

htype=1 は Ethernet であることを意味します。

hlen = Hardware Address Length

Ethernet の場合はMACアドレスの長さである 6 が入ります。

hops

DHCP サーバがリレー等で何回中継されたかを示します。クライアントは 0 をセットしますが、リレーエージェント等により 1 が加算されます。

xid = Transaction ID

DHCP クライアントが割り当てる 4 byte のランダム値です。Discover/Offer/Request/ACK 等の流れで一貫して同じ値でなくてはならず、この値によってどのパケットがどのシーケンスに属するものかを識別します。

secs =  Seconds elapsed

DHCP にて払い出されたIPアドレスには期限がありますが、DHCP クライアントの挙動としては期限の半分まで経過したら再リースを要求し、期限を回復しようとします。再リースの要求時にはこのフィールドに残り期限をセットします。

flags

16 bit のうち、最初の 1 bit だけ定義されており、残りの 15 bit は将来のための予約として 0 としなければなりません。

定義された 1 bit は Broadcast flag と呼ばれており、"B flag" と表現されます。クライアントが "B flag" = 1 にセットした場合、DHCP サーバから DHCP クライアントへの返信は、ユニキャストではなくブロードキャストで返さなければなりません。

DHCP は IP アドレスを割り当てるプロトコルでありながら、IP レイヤーの上で動作する珍しいプロトコルです。アプリケーションによっては IP アドレス未割当の状態でユニキャストを受信できないことも想定され、それをケアするものです。

ciaddr = Client IP Address

DHCP クライアントが再リースを要求する場合等には、この領域に自身が既に払い出されているIPアドレスをセットします。

yiaddr = Your IP Address

DHCP サーバが DHCP クライアントへ払い出す IP アドレスをセットします。セットされるタイミングは DHCP サーバからの応答である Offer と ACK です。DHCP クライアントから DHCP サーバへの要求である Discover と Request の場合はこの領域は 0.0.0.0 がセットされます。

siaddr = Server IP Address

(DHCPではなく) bootp で PXE ブート等のネットブートを行う際の、TFTP サーバの IP アドレスを示します。この領域を使えるかどうかはアプリケーション次第ですが、最近の仕組みとしては一般的にオプション 66 を使いますのでほぼ使われていないと思われます。

giaddr = Gateway IP Address

L3 機器が DHCP リレーする場合、DHCP を受信したインタフェースの IP アドレスを giaddr に格納した上でリレーを行います。DHCP サーバはこのフィールドを見て、どのスコープから払い出すかを判断します。

詳しくは以下を参照下さい。

【図解】DHCPリレーの仕組み~パケットキャプチャの比較, Option82について
DHCP リレーとは DHCP クライアントはブロードキャストで DHCP サー...

chaddr = Client Hardware Address

クライアントの MAC アドレスを格納します。これは DHCP サーバ側で MAC アドレス予約をする場合に使われます。

sname = Server Name

(DHCPではなく) bootp で PXE ブート等のネットブートを行う際の、TFTP サーバのホスト名を示します。siaddr と同様、この領域を使えるかどうかはアプリケーション次第ですが、最近の仕組みとしては一般的にオプション 66 を使いますのでほぼ使われていないと思われます。

file = Boot File Name

(DHCPではなく) bootp で PXE ブート等のネットブートを行う際の、TFTP サーバ上のブートファイルのファイル名を示します。siaddr, sname と同様、この領域を使えるかどうかはアプリケーション次第ですが、最近の仕組みとしては一般的にオプション 67 を使いますのでほぼ使われていないと思われます。

Options

オプションには様々なネットワーク環境情報を載せることができますが、ここでは基本的な一部のみ紹介します。

Magic Cookie

オプション領域の最初には Magic Cookie = 0x 63 82 53 63 が入ります。実はこの Options より前 (つまり file まで) は bootp プロトコルと全く同じフォーマットとなっており、この Magic Cookie によってようやくこのプロトコルが DHCP であることが分かるのです。

Option 53 = Message Type

Discover/Offer/Request/ACK 等のメッセージタイプはオプション 53 です。

  1. Discover
  2. Offer
  3. Request
  4. Decline : クライアントからサーバへやり直しを要求
  5. ACK
  6. NAK : サーバからクライアントへやり直しを要求
  7. Release : クライアントからサーバへ IP を返却
  8. Inform : クライアントから(IPは変更せず)オプションだけを再要求
  9. ForceRenew (RFC3203) : サーバから強制的に再構成

Decline は例えばリースされたIPを割り当てる前にGARPで重複確認をし、重複していることが確認できた場合はクライアントはサーバへ Decline を送り、違うIPを要求します。

NAK は Request に対して拒否を行う場合に使われます。例えば Windows10 や CentOS8 では OS 起動時に (Discover/Offer を経ずに) 前回の IP を Request する実装になっていますので、前回の IP が他の PC に払い出されてしまったり、そもそも所属 VLAN が前回と異なる可能性もありますので、そういうときは DHCP NAK が返されます。

【DHCP】環境でIPアドレスが変わるタイミング ~PC再起動時にIPが変わらない理由~
Windows/LinuxのDHCP環境はIPアドレス変更による影響を考慮し、極...

その他、ケースとしては少ないと思いますが、DHCP サーバが Offer で IP アドレス払い出しの打診をしてから Request を受信するまでの間に何かが起こり、打診中の IP アドレスを払い出せなくなってしまった場合にも送信されます。

Release はコマンドプロンプトで ipconfig /release などを実行すると送信されます。(シャットダウン時には送信されません。)

Option 55 = Parameter Request List

Discover において、クライアントがサーバに対して『どの Option が欲しいか』を示すものです。サーバはそれに対して全てを答える必要はありません。その中で持っているものがあればそれを返します。

 

上図は CentOS 7 の DHCP クライアントにおける DHCP Discover の Option 55 を示したパケットキャプチャです。

Option 1 = Subnet Mask

払い出し IP は yiaddr ですがここにはサブネットマスク情報はありません。このオプションでサブネットマスクを払い出します。

Option 3 = Router

デフォルトゲートウェイの IP アドレス情報です。

Option 6 = DNS Server

DNS サーバのIPアドレス情報です。

Option 15 = Domain Name

クライアントの所属するドメインを割り当てます。割り当てた場合、DNS サーバへの名前解決時に suffix として付け加えることができます。

例えば example.com というドメインが割当たった場合、test1 という名前解決を行う場合は test1 だけでなく test1.example.com も DNS に聞きに行ってくれます。

Option 66 = TFTP Server Name

PXE ブート等ネットワークブートを行う際の TFTP サーバのURLを指定します。

Option 67 = Boot File Name

PXE ブート等ネットワークブートを行う際のブート用ファイルを指定します。

Option 82 = Relay Agent Information

DHCP サーバに DHCP リレーの情報を伝えることができます。伝わる情報は一般的には『リレーを行った機器のホスト識別子 (Remote ID)、およびポート番号 (Circuit ID)』です。

この Option 82 の使われ方は主に 2 つあります。

1 つ目は DHCP サーバでのログに出力し、どのクライアントがどの機器経由でIPが払い出されたかを管理する、という使い方です。

特にケーブル TV では各家庭への Global IP アドレスを DHCP リレーで払い出しますが、どの収容機器のどのポートがいつからいつまで IP を使っているかを知ることができます。

2つ目は DHCP サーバ側で Option 82 の値によって払い出す IP やオプションを変更する、という使い方です。

具体的には、『Option 82 が XXX の場合は IP アドレスの払い出し範囲は 10.1.1.10-15/24 で DGW は 10.1.1.250、YYY の場合は 10.1.1.90-95/24 で DGW は 10.1.1.251』といった具合です。

Option 252 = Web Proxy Auto Discovery (WPAD)

ブラウザのプロキシ設定の『設定を自動的に検出する』などのチェックボックスにチェックを入れるとこの Option 252 に記載された URL の PAC ファイルを取得し、その PAC ファイルに記載された JavaScript に従いプロキシ設定が為されます。

WPAD の PAC ファイルの書き方については以下をご参照下さい。

【ブラウザのプロキシ設定】ローカルアドレス,例外,自動構成スクリプト,WPAD,グループポリシー
プロキシの設定パターン プロキシの設定は OS で1つの設定するわけではなく、ア...

 

コメント

タイトルとURLをコピーしました