ネットワーク●●○○○

DHCP

Dynamic Host Configuration Protocol ・ でぃーえいちしーぴー

ネットワークに参加した機器へ、IPアドレスやゲートウェイなどの設定一式を期限付きで貸し出すプロトコル。

✦ 30秒で試す — 航海家のWi-Fiでもらうアドレスは、実は期限つきの借り物スマホが最初に延長を頼むのはいつ?予想してみる

概要

DHCP(Dynamic Host Configuration Protocol)は、ネットワークに参加してきた機器へ、IPアドレスをはじめとする通信に必要な設定一式を自動で配布するプロトコルです。スマホを自宅の Wi-Fi につないだ瞬間、何も設定していないのにインターネットが使える — あの「つないだら勝手に使える」体験の裏で働いているのが DHCP です。

配布する側を DHCP サーバと呼びますが、専用の機械が必要なわけではありません。家庭用の Wi-Fi ルーターにはほぼ例外なく DHCP サーバ機能が内蔵されており、あなたの家でも今まさに動いています。企業ネットワークやクラウドの仮想ネットワークでも、機器やインスタンスへのアドレス配布は DHCP(またはその発想を継いだ仕組み)が担っており、「ネットワークの受付係」として最も身近なプロトコルのひとつです。

配られるアドレスは「もらう」のではなく「借りる」ものです。貸し出しには期限(リース期間)が付いていて、機器は期限が来る前に延長を申し出ます。いなくなった機器のアドレスは期限切れで自然に回収され、次に来た機器へ貸し出されます。

なぜ生まれたか

IP ネットワークでは、すべての機器が重複しないIPアドレスを持ち、さらにゲートウェイ(外への出口となるルーター)や DNS サーバの所在も知らなければ通信できません。DHCP 以前、これらはすべて管理者が 1 台ずつ手で設定していました。数台なら耐えられますが、数百台の職場では台帳でアドレスを管理し、設定ミスや台帳の記入漏れによる「アドレス重複」が起きるたびに 2 台の機器が同時に不調になる、という消耗戦でした。

先に現れたのは、ディスクを持たない端末がネットワークから起動するための BOOTP(1985年、RFC 951)です。起動時にサーバへ問い合わせて自分のアドレスを教えてもらう仕組みでしたが、対応表は管理者が機器ごとに登録しておく必要がありました。決定打になったのはノート PC の普及です。持ち運ばれる機器は、つなぐ場所が変わるたびに適切なアドレスへ設定し直さなければなりません。「機器が固定の場所にある」前提が崩れた結果、人手による設定は破綻しました。

そこで BOOTP を土台に、1993 年に標準化されたのが DHCP です(現行の仕様は 1997 年の RFC 2131)。設定情報をサーバに集約し、機器がネットワークに参加した時点で自動配布する。しかも「貸与」という形にして期限を付けることで、いなくなった機器のアドレスを自動回収し、限られたアドレスを使い回せるようにしました。

詳細

DORA — 4 つのメッセージで契約が成立する

DHCP のやり取りは、DISCOVER → OFFER → REQUEST → ACK という 4 つのメッセージで完結します。頭文字を取って DORA と呼ばれる、この分野の基本フローです。

DHCPサーバクライアントDHCPサーバクライアントまだIPアドレスがない 送信元は 0.0.0.0以後クライアントは配布された設定で通信を開始DISCOVER サーバを探す ブロードキャストOFFER このアドレスはどうですかREQUEST それをください ブロードキャストACK 確定です リース期間はこれだけ

順に追いましょう。参加したての機器は、自分のアドレスも DHCP サーバの場所も知りません。そこで(1)DISCOVER を「同じネットワークの全員宛て」(ブロードキャスト、宛先 255.255.255.255)で叫びます。送信元のアドレスはまだないので 0.0.0.0 です。自分の身元は、パケットの中に書いた MACアドレスで名乗ります。(2)それを聞いた DHCP サーバは、管理しているアドレスプールから空きをひとつ選び、「これはどうですか」と OFFER を返します。(3)機器は「では、それをください」と REQUEST を返します。これもブロードキャストで送るのがポイントで、ネットワークに DHCP サーバが複数あった場合に「どのサーバの提案を採用したか」を全サーバへ知らせ、選ばれなかったサーバが提案分を引っ込められるようにしています。(4)最後にサーバが ACK で確定を告げ、契約成立です。多くのクライアントは使い始める前に、そのアドレスを使っている機器がほかにいないかを ARP で確かめます。

運ぶのに UDP(サーバはポート 67、クライアントは 68)が使われるのには理由があります。宛先の分からない相手に呼びかけるにはブロードキャストが必要ですが、TCP は特定の2者の間で接続を確立してから話すプロトコルなので、「全員宛て」には送れません。UDP なら接続の手続きなしに、1 つのパケットをブロードキャストアドレスへ投げられます。届かなかったときのやり直しは、DHCP 自身が時間をおいて再送することで補っています。

リレーエージェント — ブロードキャストはルーターを越えない

ここでひとつ問題があります。ブロードキャストは同じネットワークの中にしか届かず、ルーターを越えません。企業ではフロアや部署ごとにネットワークを分けるのが普通ですが、そのすべてに DHCP サーバを置くのは管理が大変です。そこで、各ネットワークの出口のルーターに「DHCP リレーエージェント」の機能を持たせます(Cisco の設定名から ip helper とも呼ばれます)。

部署のネットワーク 192.168.20.0/24クライアントアドレスなしルーターリレーエージェント192.168.20.1サーバ用のネットワークDHCP サーバプール: 20.0/24 用プール: 30.0/24 用 …① DISCOVER を全員宛てに叫ぶ(破線)② サーバ宛てのユニキャストに包み直して転送。「192.168.20.1 から来た」と書き添える③ サーバは書き添えを見て、20.0/24 のプールから選び、リレー経由で返す
リレーエージェントは、届いたブロードキャストをサーバ宛てのユニキャストに包み直し、どのネットワークから来たかを書き添えて転送する

リレーエージェントは、クライアントのブロードキャストを受け取ると、それを DHCP サーバ宛てのユニキャストに包み直して転送します。このとき、自分のそのネットワーク側のアドレス(giaddr という欄)を書き添えるので、サーバは「192.168.20.0/24 から来た依頼だ」と分かり、そのネットワーク用のプールからアドレスを選べます。1 台の DHCP サーバで多数のネットワークをまとめて面倒を見られるのは、この仕組みのおかげです。「新しく作ったフロアのネットワークだけアドレスが取れない」というトラブルは、多くの場合このリレーの設定漏れです。

リース — 期限の半分で更新、8 割 7 分で再バインド

ACK で渡されるアドレスには必ず有効期限(リース期間)が付いています。クライアントは期限が来るのをただ待つのではなく、2 段構えで延長を試みます。

そのまま使う更新(RENEW)再バインドACKT1 = 50%T2 = 87.5%失効借りたサーバに直接(ユニキャスト)「延長してください」。ACK で期限が戻る期限の前半は何もしないT2 までに返事がない → 全員宛てに延長を頼む。失効したらアドレスを手放し、DISCOVER から
リース期間の時間軸。半分(T1)で借りた相手に更新を頼み、87.5%(T2)までに返事がなければ、どのサーバでもよいから延長を頼む

リース期間の半分(T1)を過ぎると、クライアントは借りたサーバへ直接(ユニキャストで)「延長させてください」と REQUEST を送ります。サーバが認めれば、同じアドレスのまま期限が元に戻ります。サーバが故障していて返事がないまま 87.5%(T2)まで来ると、今度はブロードキャストで「どのサーバでもいいので延長を」と頼む再バインドに移ります。冗長化された別のサーバが引き継げるのはこの段階です。それでも期限が切れたら、クライアントはアドレスを手放し、DORA の最初からやり直します。

リース期間の長さは設計の問題です。カフェの Wi-Fi のように客が次々入れ替わる環境では短め(1 時間など)、社内 LAN では長め(数日)と、機器の入れ替わりの激しさに合わせます。短すぎれば更新のトラフィックが増え、DHCP サーバが少し止まっただけで多くの機器がアドレスを失います。長すぎれば去った機器がアドレスを抱えたままになり、プールが枯渇します。

配られるのはアドレスだけではない

DHCP が配布するのは IP アドレス単体ではなく、通信を始めるための設定一式です。最低限、IP アドレスとサブネットマスク(自分のネットワークの範囲)、デフォルトゲートウェイ(外の世界への出口。ルーティングで最初に託すルーター)、DNS サーバのアドレス(名前解決の問い合わせ先)の 3 点がそろって初めて「インターネットが使える」状態になります。このほかオプションとして時刻サーバや、ネットワークブート用の情報なども配れます。

逆に言えば、DHCP サーバの設定ミスは全端末に一斉配布される、ということでもあります。誤った DNS を配れば全員が名前解決できなくなります。ネットワーク内に野良の DHCP サーバ(設定ミスで DHCP 機能が有効なまま持ち込まれた家庭用ルーターなど)が現れると、正規サーバと早い者勝ちの配布競争になり、一部の機器だけが誤ったゲートウェイを受け取って外に出られなくなります。悪意のある者が偽の DHCP サーバを立てれば、自分をゲートウェイや DNS として配り、通信を丸ごと経由させることもできます。これを防ぐのが、スイッチの DHCP スヌーピングです。DHCP サーバがつながるポートだけを「信頼できる」と設定し、それ以外のポートから来た OFFER や ACK を捨てます。同時に「どのポートのどの MAC アドレスにどの IP を貸したか」を記録するので、この表は ARP の偽装を防ぐ機能(Dynamic ARP Inspection)の土台にもなります。

固定割当との使い分け、そして IPv6

すべてを動的配布にすればよいわけではありません。社内の DNS サーバやプリンタ、ロードバランサ配下の機器のように「他の機器から名指しでアクセスされる側」は、アドレスが変わると参照が壊れるため固定である必要があります。方法は 2 つあり、機器側に手動で書く静的設定と、DHCP サーバ側で「この機器(MAC アドレスで識別)には常にこのアドレスを貸す」と決めておく予約(固定リース)です。後者なら設定の集中管理という DHCP の利点を保ったまま固定化でき、実務ではこちらが好まれます。ただし、スマートフォンの MAC アドレスのランダム化を切り替えると、同じ端末でも別の機器に見えて予約が効かなくなる点に注意が必要です。

IPv6 では事情が少し変わります。ルーターが定期的に「このネットワークのプレフィックスはこれ」と広告し、機器はそれに自分で作ったホスト部を付けてアドレスを組み立てる SLAAC(ステートレスアドレス自動設定)があり、DHCP サーバなしでもアドレスが決まります。DNS サーバなどの追加情報を配ったり、誰にどのアドレスを貸したかを管理したりしたい場合には、DHCPv6 を併用します。「サーバが台帳を持って貸し出す」DHCP と、「各自が名乗って重複だけ確かめる」SLAAC という、2 つの発想が並んでいるわけです。

試問

ある会社のネットワークにつながる8台の機器です。つないだ機器にアドレスを期限つきで自動で貸し出す仕組み(DHCP)に任せてよいものと、アドレスを固定で決めておくべきものに分けます。貸し出されるアドレスは、つなぎ直しや期限切れで変わることがあります。

✦ 命題挑戦中

社内の8台の機器を、自動の貸し出しに任せてよいものと、アドレスを固定すべきものに仕分けよ

自動の貸し出しに任せるアドレスが変わっても困らない
アドレスを固定する変わると困る

項目を選んでから、入れる箱を選びます