色々できるぞDHCP!【西田の戯言。】

DHCPといえば「IPアドレスを自動で割り当ててくれるプロトコル」という印象がありますが、実はそれだけじゃないぞ!というお話です。

DHCP

DHCPは正式名称「Dynamic Host Configuration Protocol」というプロトコルです。直訳すれば、動的にホスト設定をするプロトコルとなります。

一般的な使い方としては、DHCPサーバーがIPアドレスをリースするというのがありますが、基本的にはネットワーク設定の大半をサーバから配布することができます。

基本的にはホストのプラグアンドプレイを実現するためのプロトコルであり、DHCPサーバがネットワーク内に存在していれば、自動でネットワークを使用するために必要な設定が流し込まれます。

DHCPで設定できるのは、IPアドレス・サブネットマスク・デフォルトゲートウェイだけでなく、DNSサーバーアドレス、NTPサーバーアドレス、メールサーバーアドレスなど多岐にわたります。

ちなみに、DHCPは第7層「アプリケーション層」のプロトコルです。アプリケーション層のプロトコルに基づいて、第3層ネットワーク層の設定を行うためです。送信元ポート番号は67、宛先ポート番号は68です。

DHCPはUDPのプロトコルですので、通常「サーバ」と「クライアント」という関係は存在しません。しかし、DHCPは「情報を要求する側」と「情報を提供する側」というのが正確に存在しているため、サーバとクライアントが明確に分けられています。

DHCPの基本的なシーケンス

DHCPの基礎部分として簡単にシーケンスをご紹介したいと思います。

基本的にDHCPのシーケンスは「サーバーを探索する」という段階と「実際にデータを」という段階の2段階に分けられます。実際の流れを見ていきましょう。

DHCP discover

DHCPクライアントは、ネットワークに対してブロードキャストでDHCP Discoverを送信します。DHCP Discoverパケットには、要求する情報(DHCP option/後述)とクライアントのホストの情報が含まれています。

DHCP offer

DHCP Discoverを受け取ったDHCPサーバは、受け取ったDHCP discoverの情報を基に自身が持っているネットワーク設定情報をDHCP offerとして提示します。同時にDHCPサーバは、クライアントに貸し出す情報(リソース)を仮確保します。

DHCP request

DHCP offerを受け取ったDHCPクライアントは、DHCPサーバに対して、提示された情報を使用する旨をDHCP requestとして通知します。

図中で「選択したDHCPサーバ」の情報を提供している理由は、ブロードキャストでDHCP requestを送信し、そのパケットにDHCPサーバの情報をもたせることで、選択されていないDHCPサーバが選択されなかったことを認識し、仮確保したリソースを解放するためです。

ただし、DHCP offerは必ずしもブロードキャストで送信されるわけではなく、ユニキャストで送信される場合があります。この場合は、選択されなかったDHCPサーバが仮確保しているリソースは、リース期限まで確保されたままとなります。DHCPサーバの実装にもよりますが、仮確保のリース時間はかなり短く設定されており、offerを受け取らなかったとてリースの無駄な確保が長時間発生することはないとは思います。

DHCP acknowledge

そして、DHCP requestを受け取ったDHCPサーバはユニキャストでDHCP acknowledgeを送信します。DHCP acknowledgeには、DHCP offerに含まれた情報に加え、DHCPサーバからクライアントに貸し出される設定のリース時間の情報が含まれています。これは、DHCP requestを受け取ったDHCPサーバが仮確保だったリソースを本格的に確保し、そのリース時間を提示するためです。

これが一連のDHCPのやり取りの流れです。

discover・offer・request・acknowledgeをまとめてDORAと呼ぶこともあるみたいです。

DHCPのパケットにはDORA以外にも「DHCP infomation」と「DHCP releasing」があります。

DHCP infomationは、DHCP requestsがIPアドレスの割り当てを要求するのに対して、それを要求せずそれ以外の情報を知りたいときに使用します。例えば、IPは静的ですでに設定済みだが、DNSなどの情報が欲しい場合などです。DHCP infomationにはDHCP acknowledgeが応答されます。

DHCP releasingは、IPアドレスの返却です。基本的に、IPアドレスの確保は、リースの更新が行われない限り、リース時間経過後に解放されますがDHCP releasingを使用することでクライアント側から「もう使わない」ことを通知し、解放可能であることを通知することができます。なお、DHCP releasingをサーバに送信するということは義務付けられているわけではありません。

リースの更新

DHCPサーバの貸し出した情報のリース期限が近づくと、DHCPクライアントはDHCPに対してリース情報の更新を行います。この場合、基本的にはDHCPサーバの素性がわかっているのでユニキャストで行われる事が多いです。

素性がわかっているということは、DHCPサーバの探索が不要になるため、DHCP requestとDHCP acknowledgeの1往復だけで行われます。

DHCPリレーエージェント

DHCPリレーエージェント

サブネットを使用するような大規模なネットワークにおいて、各サブネットにDHCPサーバを配置するのは面倒です。このような場合は、ネットワークでDHCPサーバを1台用意し、各セグメントごとにDHCPリレーエージェントを配置するのが定石です。

DHCPリレーエージェントがやっていることは単に、DHCPの各パケットをブリッジすることです。ただし、DHCPクライアント - DHCPリレーエージェント間の通信がブロードキャストであったとしても、DHCPリレーエージェント - DHCPサーバ間の通信は必ずユニキャストになります。

つまり、リレーエージェント自身は必ずDHCPサーバを知っています。

DHCPのデータフォーマット

DHCPのプロトコルについて語る記事なので、簡単にですが、DHCPのデータフォーマットについて触れておきます。

DHCPのデータフォーマット(UDPペイロード部)

各フィールドの簡単な説明は以下のとおりです。

フィールド サイズ
(Byte)
オフセット
(Byte)
役割
op 1 0 Message Operation Code。
クライアントからのメッセージあれば1、サーバーからのメッセージであれば2が入る。
htype 1 1 Hardware Address Type
hlen 1 2 Hardware Address length. 普通はMACアドレスの6 Byteを示す6になるはず・・・
hops 1 3 何回リレーされたか。クライアントは0を設定し、リレーエージェントが加算していく
xid 4 4 Transaction ID。ランダムな値が入り、DORAで一貫した数字を維持する。シーケンスの分別に使用
secs 2 8 DHCP Discoverをはじめてからの秒数。クライアントがどれくらい待たされてるかを保持し、秒数がながければ優先的に処理する実装もある
flags 2 10 フラグとして用意されている16-bit分の2進数列。現状、Bflagの1つしか定義されていない。このフラグが経っている場合、DHCPクライアントへの応答はブロードキャストである必要がある
ciaddr 4 12 クライアント自身のIPアドレス。
yiaddr 4 16 Your IP Address. DHCPサーバがクライアントにリースするIPアドレスを格納する。
siaddr 4 20 Server IP Address.次に接続すべきサーバを示す。主にPXEなどのネットワークブートで使用され、ブートローダやOSイメージを取得するサーバのIPアドレスを示す。
giaddr 4 24 リレーエージェントのMACアドレス
chaddr 16 28 クライアントのハードウェアアドレス。普通はMACアドレス。
sname 64 44 サーバホスト名
file 128 108 ブートファイル名。PXEブートなどで使用。
option 可変 236 オプション領域(後述)

DHCPは、前身であるBOOTPとの互換性を維持しています。BOOTPは、DHCPと同様にIPアドレスなどのネットワーク設定を割り当てる機能を持つほか、ディスクレスワークステーション(記憶装置を持たないマシン)が、PXEなどのネットワークブートを利用してOSを起動する際にも用いられていました。

BOOTPを利用した起動では、クライアントは起動後にBOOTPサーバからネットワーク設定に加え、ブートローダやOSイメージ、ファームウェアなどが格納されたTFTPサーバやHTTPサーバの情報を取得します。そのため、DHCPにもBOOTP互換のフィールドとして、次に接続すべきブートサーバのIPアドレスを示すsiaddrや、取得すべきブートファイル名を示すfileフィールドが残されています。

option部については次章で説明します。

DHCP optipn

さて、本稿の題名を「色々できるぞDHCP」とした理由は、DHCPって案外いろんな情報を配布できるからなんです。その本題が本章です。

DHCP optionと定められているのは、0x00ECバイト目以降ですが、option部の先頭2 Byte分はMagic Cookie 0x 63 82 53 63が固定で入ります。

こもMagic Cookieの役割は、DHCPかBOOTPかを区別するために利用します。基本的に、BOOTPとDHCPは仕様がかなり共通しており、0x0000~0x00EBバイトは全く同じフォーマットです。

なので、DHCPにおけるoption部は実質的にMagic Cookieに続く0x00F0バイト目以降となります。

このoption部に含まれる情報はRFC 2132「DHCP Options and BOOTP Vendor Extensions」で定められています。

option部の含まれ方は以下のような形になります。

option部のフォーマット(Dataは可変)

これが連続してoption部に含まれています。

このcodeは、Dataにどんな情報が含まれているかを示しています。以下にCodeと情報の対応表を示します。

IDオプションサイズ概要RFC
RFC 1497 Vendor   Extensions
0Pad Option0Pad。option部を一定サイズ(314 Byte)まで埋めるために使用2132
255End Option0終端であることを意味するタグ2132
1Subnet Mask4サブネットマスク2132
2Time Offset4タイムオフセット(UTCとの秒差 符号付き32-bit 整数)2132
3Router Option可変デフォルトゲートウェイ2132
4Time Server Option可変NTPサーバ2132
5Name Server Option可変IEN116サーバ2132
6Domain Name Server Option可変DNSサーバ2132
7Log Server Option可変MIT-LCS UDP log servers アドレス2132
8Cookie Server Option可変Quote of the Day(QOTD)/ Cookie Protocol サーバアドレス2132
9LPR Server Option可変LPR serverサーバアドレス2132
10Impress Server Option可変Impress サーバアドレス2132
11Resource Location Server Option可変RLPサーバアドレス2132
12Host Name Option可変クライアントホスト名2132
13Boot File Size2ブートファイルのサイズ2132
14Merit Dump File可変クライアントクラッシュ時のメモリダンプサーバ2132
15Domain Name可変DNSドメイン名2132
16Swap Server可変スワップ領域を提供するサーバのアドレス2132
17Root Path可変クライアントのルートファイルシステムがあるパス名2132
18Extensions Path可変拡張設定ファイルが格納されているパス名2132
IP Layer Parameters   per Host
19IP Forwarding Enable/Disable Option1IPフォワーディングの有効無効2132
20on-Local Source Routing Enable/Disable Option1ローカル以外のサブネットへのソース・ルーティングの有効フォワーディングの有効無効2132
21Policy Filter Option可変2132
22Maximum Datagram Reassembly Size2最大のデータグラム再構築サイズ2132
23Default IP Time-to-live1TTLのデフォルト値(IP)2132
24Path MTU Aging Timeout Option4MTU有効時間2132
25Path MTU Plateau Table Option可変MTU Plateauテーブル2132
IP Layer Parameters   per Interface
26Interface MTU Option2MTUサイズ2132
27All Subnets are Local Option1すべてのサブネットを同一のローカルNWとみなすかどうか2132
28Broadcast Address Option4ブロードキャストアドレス2132
29Perform Mask Discovery Option1ICMPサブネットマスクDiscoveryへの応答可否2132
30Mask Supplier Option1ICMP Router Discoveryへの応答可否2132
31Perform Router Discovery Option1クライアントによるRouter Disciveryの実行可否2132
32Router Solicitation Address Option4Router Solicitationの宛先IPアドレス2132
33Static Route Option可変静的ルーティング2132
Link Layer   Parameters per Interface2132
34TCP Default TTL Option1ARP通信時のTrailer Encapsulationの仕様可否2132
35ARP Cache Timeout Option4ARPキャッシュ(MACアドレス対応表)の保持時間2132
36Ethernet Encapsulation Option1Ethernetフレーム形式2132
TCP Parameters2132
37TCP Default TTL Option1TTLのデフォルト値(TCP)2132
38TCP Keepalive Interval Option4TCP Keepaliveの送信インターバル2132
39TCP Keepalive Garbage Option1TCP Keepalive Gabageデータの付与の可否2132
Application and   Service Parameters
40Network Information Service Domain Option可変NISドメイン名2132
41Network Information Servers Option可変NISサーバアドレス2132
42Network Time Protocol Servers Option可変NTPサーバアドレス2132
43Vendor Specific Information可変ベンダ独自の固有オプション用2132
44NetBIOS over TCP/IP Name Server Option可変NetBIOS Name Server (NBNS) アドレス2132
45NetBIOS over TCP/IP Datagram Distribution Server Option可変NetBIOS Datagram Distribution (NBDD)アドレス2132
46NetBIOS over TCP/IP Node Type Option1NetBIOSの名前解決方式(Node Type)2132
47NetBIOS over TCP/IP Scope Option可変NetBIOSの論理グループ名2132
48X Window System Font Server Option可変X Window Sustemのフォントサーバ2132
49X Window System Display Manager Option可変X Window Systemのマネージャアドレス2132
50Requested IP Address4クライアントがリクエストするIPアドレス2132
51IP Address Lease Time4IPアドレスのリース期間(クライアントも要求可能)2132
52Option Overload1file/snameのフィールドをoptionフィールドとして使用するか2132
53DHCP Message Type1DHCPメッセージタイプ。ここにDORAのいずれかなどの情報が入る。2132
54Server Identifier4DHCPサーバ識別子。通常はDHCPサーバのIPアドレス2132
55Parameter Request List可変クライアントからのパラメータ要求リスト。欲しいoptionのタグをクライアントが通知する2132
56Message可変人間向けDHCPサーバからのエラーメッセージ2132
57Maximum DHCP Message Size2クライアントが受信可能なメッセージのサイズ2132
58Renewal (T1) Time Value4クライアントがアドレスを取得してからRenewal(リースの再延長要求)するまでの期間(秒)2132
59Rebinding (T2) Time Value4クライアントがアドレスを取得してからRebindingする(他のDHCPに助けを求める)までの期間(秒)2132
60Vendor class identifier可変クライアント自身の機器の種類・ベンダを格納2132
61Client-identifier可変クライアントの識別子。通常はMACアドレス。2132
64Network Information Service+ Domain Option可変NIS+ クライアントドメイン名2132
65Network Information Service+ Servers Option可変NIS+ サーバ2132
66TFTP server name可変TFTPサーバ名(siaddrの代替)2132
67Bootfile name可変Bootfile名(snameの代替)2132
68Mobile IP Home Agent option可変Mobile IP の Home Agent アドレス2132
69Simple Mail Transport Protocol (SMTP) Server Option可変SMTPサーバ一覧2132
70Post Office Protocol (POP3) Server Option可変POP3サーバ一覧2132
71Network News Transport Protocol (NNTP) Server Option可変NNTPサーバ一覧2132
72Default World Wide Web (WWW) Server Option可変デフォルトのWWWサーバアドレス2132
73Default Finger Server Option可変デフォルトのFingerサーバアドレス2132
74Default Internet Relay Chat (IRC) Server Option可変デフォルトのIRCサーバアドレス2132
75StreetTalk Server Option可変StreetTalkサーバ一覧2132
76StreetTalk Directory Assistance (STDA) Server Option可変STDA サーバ一覧2132
77User Class option可変クライアントの分類ラベル3004
78SLP Directory Agent Option可変Serveice Location Protocol(SLP)のDirectory Agentのアドレス情報2610
79SLP Service Scope Option可変SLPのスコープ2610
80Service Location Protocol Naming Authority(未標準)3679
81The Client FQDN Option可変クライアントのFQDN名。ダイナミックDNSへの登録などに使用
82Relay Agent Information Option可変リレーエージェントの情報3046
83Relay Agent Options(未標準)3679
84Relay Agent Options(未標準)3679
85NDS Servers Option可変NDSサーバ(Directory Server)のIPアドレス一覧
86NDS Tree Name Option可変NDSツリー名
87NDS Context Option可変ユーザの初期ディレクトリ位置
88IEEE 1003.1 POSIX Timezone可変(未標準)3679
89FQDNs in DHCP Options可変(未標準)3679
90Authentication可変
91VINES TCP/IP Server可変(未標準)3679
92Server Selection可変(未標準)3679
93Client System可変RFCに規定なし3679
94Client NDI可変RFCに規定なし3679
95LDAP可変Apple独自実装3679
96IPv6 Transitions可変(未標準)3679
97UUID/GUID可変RFCに規定なし3679
98User-Auth可変
99未定義
100Printer Name可変(未標準)3679
101MDHCP可変(未標準)3679
102~削除/未定義
107
108Swap Path可変(未標準)3679
109未定義
110IPX Compatability可変(未標準)3679
111未定義
112Netinfo Address可変Apple独自実装3679
113Netinfo Tag可変Apple独自実装3679
114URL可変Apple独自実装3679
115Failover可変標準にならず3679
116Auto-Config可変(未標準)3679
117Name Service Search Option22937
118Subnet Selection Option4クライアントが要求するIPアドレスのサブネットの指定3011
119Domain Search Option可変DNSドメイン検索リスト3397
120Domain Name List可変ドメイン名のリスト3361
121Classless Route Option可変宛先ネットワークごとのルーティング情報3442
208MAGIC Option可変特定用途であることを示すシグネチャ5071
209Configuration File Option可変クライアントが取得すべき設定ファイル名5071
210Path Prefix Option可変クライアントがファイルを取得する基準パス5071

さすがにこれを全部使うというわけではありませんし、どんなDHCPサーバもDHCPクライアントも両方ともこれに完全に対応しているわけではありません。

ただ、特に重要なのが、50~59のあたりになるかなぁと思います。DHCPの本質ですし。

option部には、上記図のような形でこれらの情報が羅列されていることになります。

ただ、どうしてもこれらの情報を大きくするとパケットが巨大になってしまいます。そのため、52番を1にして、snamesiaddrのようにもはやDHCPでは使わないフィールドをoption部として上書きして使用したり、DHCP自体はパケットを分割して送信することは推奨されないものの、119番などの一部のパラメータは分割して送信する仕組みがあるのでそれを使うなどして対策しています。

とまあ、本当は実物パケットを乗っけて紹介したかったんですけど、だらだらこの表作るだけで半日潰れたので今日はここまで。

普段何気なく使ってるIPの自動割り当てとDHCP。実は「プラグアンドプレイにしたい」というのが発端だったりするので、実に様々な情報を配布することができるのでした。DHCPって面白いんだぞ!っていうことが伝われば嬉しいなと思います。

今回この記事を書くにあたっては、RFCのドキュメントを読み漁りました。難しかったですが勉強になりました(参考にしたドキュメントは下の方に参考文献として掲載しています)。

皆さんも時間があれば、この手の仕様書、無料で公開されているものを読んでみると「普段使ってるこいつ、実はこんなこともできたのか!」という気付きになるかもしれませんし、おもしろいのでぜひ。

最近はAI使って翻訳やら要約しながら読むと理解しやすいしね。ほなまた。


この記事を書いた人

西田(総合情報学部 情報学科 2021年入学)

通信研究会OB。当ホームページの保守運用を支援しています。組み込み系のソフトウェアエンジニア。応用情報技術者・修習技術者。

参考文献