DHCPの仕組みを動きで理解する|DORAの4パケットとCiscoの設定

DHCPの4つのパケット、Discover・Offer・Request・ACK(まとめてDORA)を教科書で読んで、一番引っかかるのは3つ目のRequestだと思います。サーバーからOfferで返事をもらったのに、PCはなぜもう一度ブロードキャストで送り直すのか。

この疑問は、パケットが実際にどこまで届いているかを見ると解けます。なお、この記事では「全員宛てに送る」ことをブロードキャスト、「特定の1台宛てに送る」ことをユニキャストと呼びます。下の図では、PC-AがR1からIPアドレスを借りるまでの4つのパケットを、構成図の上で流しています。

図はループ再生しています。「フェーズ1」〜「フェーズ4」のボタンで、そのパケットだけを流して止められます。下のタブでは、パケットの中身、キャプチャ、R1の設定とバインディングが、再生に合わせて変わります。

DHCPが配っているもの

DHCPサーバーが貸し出すのは、IPアドレスだけではありません。PCが通信を始めるのに必要な設定を、まとめて渡しています。

  • IPアドレス(例:192.168.10.100)
  • サブネットマスク(例:255.255.255.0)
  • デフォルトゲートウェイ(例:192.168.10.1)
  • DNSサーバー(例:8.8.8.8)
  • リース期間(貸し出しの期限。例:1日)

期限付きの貸し出しなので、使われなくなったアドレスは、貸し出し用のアドレスの一覧(プール)に戻ります。やり取りには、サーバー側が67番、PC側が68番のポートを使います。

Discover・Offer・Request・ACKで起きていること

Discover:まだ何も知らないので、全員に聞く

起動直後のPCはIPアドレスを持っておらず、DHCPサーバーがどこにいるのかも知りません。そのため、送信元IPを0.0.0.0、宛先を255.255.255.255にして「DHCPサーバーはいますか」と呼びかけます。LANの中で使う宛先(MACアドレス)も、全員宛てを表すff:ff:ff:ff:ff:ffです。

スイッチは全ポートにこのパケットを流すので、図のPC-Bのように、関係のない端末にも届いて捨てられます。

Offer:サーバーが候補のアドレスを提示する

DHCPサーバーはプールから空いているアドレスを1つ選び、「192.168.10.100はどうですか」と提示します。サブネットマスクやデフォルトゲートウェイ、リース期間も、ここで伝えます。

図では、OfferはPC-Aだけに届いています(ユニキャスト)。

キャプチャの時刻を見ると、DiscoverからOfferまで約1秒あいています。これはR1が、配る前にそのアドレスへpingを打ち、ほかの機器が使っていないかを確かめているためです(後半で詳しく書きます)。

Request:Offerをもらったのに、またブロードキャスト

最初の疑問の答えはここです。PCがRequestをもう一度ブロードキャストで送る理由は2つあります。

  • まだアドレスが確定していないので、提示されたIPを送信元に使えない
  • DHCPサーバーが複数いた場合に、選ばなかったサーバーにも結果を知らせる

Requestには「どのサーバーのOfferを選んだか」が書かれていて、選ばれなかったサーバーはそれを見て、取っておいたアドレスを手放します。図はサーバーが1台なので見えにくいのですが、故障に備えてDHCPサーバーを2台置いている会社では、この仕組みが効いてきます。

ACK:ここで初めてIPアドレスが設定される

サーバーがACKを返すと、貸し出しが確定します。PCが実際にIPアドレスを設定するのは、このACKを受け取ってからです。サーバー側の貸し出し一覧(バインディング)にも、ここで載ります。なんらかの理由で貸せないときは、ACKの代わりにNAK(お断り)が返り、PCはDiscoverからやり直します。

Cisco IOSでDHCPサーバーを立てる

図のR1と同じ設定です。小さな拠点では、このようにルーター自身をDHCPサーバーにすることがよくあります。

ip dhcp excluded-address 192.168.10.1 192.168.10.99
!
ip dhcp pool VLAN10
 network 192.168.10.0 255.255.255.0
 default-router 192.168.10.1
 dns-server 8.8.8.8
 lease 1

ポイントは1行目のip dhcp excluded-addressです。ゲートウェイやサーバー、プリンターなど、固定でIPを振る機器の範囲を、配る対象から外します。この例では.1〜.99を固定用に取っておき、.100から配っています。図のPC-B(192.168.10.20)も、この固定用の範囲に入っている機器です。

動作の確認には、次のコマンドを使います。

  • show ip dhcp binding:どのクライアントに、どのIPを貸しているか
  • show ip dhcp pool:プールの大きさと、貸し出し中の数
  • show ip dhcp conflict:配ろうとしたIPが、すでにほかの機器で使われていた記録

IPアドレスが169.254.x.xになったら

Windowsで169.254.x.xのアドレスが付いていたら、DHCPサーバーから返事が来なかったというサインです。OSが自分で仮のアドレス(APIPA)を付けた状態で、Windowsはその後も数分おきにDiscoverを送り直しています。確認する順番は、次のとおりです。

  1. DHCPサーバーが別のネットワークにいないか:Discoverはブロードキャストなので、ルーターを越えられません。この場合はルーターにDHCPリレーの設定が必要です(DHCPリレーの記事(11月10日公開予定))。
  2. ポートのVLANが合っているか:VLANは、1台のスイッチの中をいくつかのネットワークに分ける仕組みです。PCをつないだポートが、DHCPで配っていないVLANに入っていないかを確認します。
  3. スイッチのポートが、まだ通信できる状態になっていないか:Ciscoのスイッチは初期設定のままだと、ケーブルをつないでから通信できるようになるまで約30秒待ちます(ループを防ぐSTPという仕組みのため)。その間に送ったDiscoverは届かず、PCは一時的に169.254になります。PCをつなぐポートにはspanning-tree portfastを入れて、この待ち時間をなくしておきます。

実際にあった例:新しいフロアを立ち上げたとき、つないだPCが軒並み169.254になったことがあります。原因は、ゲートウェイ役のスイッチ(ルーターの働きもするL3スイッチ)に、DHCPサーバーまでDiscoverを運ぶ設定(ip helper-address)が入っていなかったことでした。DiscoverがDHCPサーバーまで届いていないので、サーバー側の設定をいくら見直しても直りません。VLANを足すときは、helper-addressまでを1セットで確認しておくと防げます。

固定IPの機器とアドレスがぶつかったとき

excluded-addressを入れ忘れると、プリンターやサーバーに固定で振ったアドレスを、DHCPがほかのPCに配ろうとします。

Ciscoのルーターは、配る前にpingで確かめ、返事があったアドレスは配らずにshow ip dhcp conflictに記録します。ここに記録がたまっていたら、除外範囲の設定漏れを疑います。

家庭用ルーターがつながると何が起きるか

家庭用のルーターを社内のLANに誤ってつなぐと、そのルーターもDHCPサーバーとしてOfferを返し始めます。PCは先に届いたOfferを選ぶことが多いので、一部のPCだけが192.168.0.xのような別のアドレスをもらい、社内のサーバーにつながらなくなります。

スイッチのDHCPスヌーピングという機能を使うと、決めたポート以外から返ってくるOfferを止められます(DHCPスヌーピングの記事(12月21日公開予定)で扱います)。

リースの更新はユニキャスト

一度アドレスをもらったPCは、リース期間の半分が過ぎると、借りているサーバーにユニキャストでRequestを送り、延長を頼みます。もう自分のIPアドレスもサーバーの場所も分かっているので、全員に聞く必要はありません。

サーバーから返事がないまま期限が近づくと、今度はブロードキャストで「どのサーバーでもいいので延長してほしい」と頼みます。それでも期限が切れたら、アドレスを手放してDiscoverからやり直します。

まとめ

  • DHCPは、Discover・Offer・Request・ACKの4つのパケットでアドレスを貸し出す
  • Requestまでブロードキャストなのは、まだIPアドレスがないことと、ほかのサーバーにも結果を知らせるため
  • PCがIPアドレスを設定するのは、ACKを受け取ってから
  • 169.254.x.xは「返事が来なかった」サイン。リレー、VLAN、portfastの順に確認する

IPアドレスをもらったPC-Aが次にやるのは、相手のMACアドレスを調べることです。pingの前に流れているこのパケットは、ARPの記事(11月7日公開予定)で扱います。

PR