TCP/IP とデータ通信

第 14 章 DHCP の概要

この章では、動的なホスト構成プロトコル (DHCP) を紹介し、クライアント側とサーバ側の両方のプロトコルについて説明します。また、DHCP の動作内で使用できるブートストラッププロトコル (BOOTP) の中継エージェントについても説明します。

DHCP とは何か

DHCP は、インターネットプロトコル (IP) のアドレスやその他のインターネット構成パラメタをホストに提供します。DHCP を使用すると、ユーザが事前に構成を行う必要がなくなります。この新しいプロトコルにより、システム管理者が個々の IP アドレスを個別に割り当てたり変更したりする必要があった従来のインターネットアーキテクチャが改善されます。手動処理は費用がかかり、難しく、エラーが起こりやすく、さらに時間がかかります。

DHCP は、管理者が何度も IP アドレスを割り当てたり変更したりする必要性をなくすことにより、ネットワークの管理費用を削減します。使用されていない IP アドレスのプールから動的 IP アドレスを選択して、一時使用または永久使用のために自動的にホストに割り当てます。さらに、割り当てた IP アドレスが必要でなくなるか、または使用期限が切れた場合には、DHCP はその他のクライアントに使用させるために当該 IP アドレスを回収します。

DHCP と BOOTP のパケットフォーマットは同じですが、BOOTP パケットは固定長、DHCP パケットは可変長です。DHCP パケットの長さについては、クライアントとサーバとの間でネゴシエーションが行われます。

インターネット技術タスクフォース (IETF) の動的なホスト構成のための作業グループは、約 5 年間にわたって、現在の IP アドレス割り当てのアーキテクチャが持っている問題について作業を行なってきました。IETF は、DHCP の標準化を行なっている途上です。現状は、複数のコメント要求 (RFC)、すなわち RFC 1542、2131、2132 が出されている状態です。

インターネットが急速に成長しているため、ネットワークアドレスが不足しています。この問題に対処するために、クラスレスドメイン間ルーティング (CIDR) が開発されました。IP アドレスは、大規模、中規模、小規模ネットワークに対応するクラス A、B、C に分けられていました。クラス B の IP アドレスが不足したため、CIDR の設計が使用されることになりました。CIDR は、65,536 個のアドレスから構成されるクラス B ネットワークを 1 つの組織に 1 つ割り当てるのではなく、必要な数だけのクラス C アドレスを割り当てるという考えをベースにしていました。

CIDR 戦略に従って割り当てられたクラス C ネットワーク番号は、ランダムではありません。番号は連続しており、同じ接頭辞を共有しています。このことが、非常に大きいルーティングテーブルを操作することによって引き起こされる問題の大部分を軽減するのに役立ちます。

以前は、IP アドレスのブロックが個別の要求者や企業に割り当てられていましたが、CIDR 戦略の場合は、個別の ISP に割り当てられます。したがって、ISP を簡単に変更するためには、簡単に番号の付け直しができることが重要になります。DHCP では、ネットワークの番号を簡単に付け直すことができ、したがって、ISP を簡単に変更することができます。

DHCP の技術では、以下の便利な機能を使用することができます。

さらに、DHCP は BOOTP をベースとしているため、既存の BOOTP 中継機能を活用することができます。これにより、ネットワーク管理者は、ルータを設定して BOOTP/DHCP トラフィックをリモート BOOTP/DHCP サーバへ転送することができます。その結果として、in.rarpdbootparams による構成サービスの場合には必要であった、ネットワークセグメントごとのネットワークパラメタサーバは必要なくなりました。

ネットワーク管理者は、このコマンドを使用して、Solaris 2 サーバ上に DHCP サービスと BOOTP サービスを迅速かつ容易に構成することができます。このコマンドは、DHCP サービスを立ち上げて、ローカルネットワークとリモートネットワークを構成します。ローカルネットワークは、サーバが直接接続されているネットワークです。リモートネットワークは、サーバが直接には接続されていないネットワークであり、BOOTP 中継エージェントを介してアクセスします。

リモートネットワーク上のクライアントにサービスを提供するには、クライアントのネットワーク上で BOOTP 中継エージェントを設定することが必要です。BOOTP 中継エージェントの機能は、普及している数多くのルータや交換機内に存在します。ルータがこの機能をサポートしていない場合は、クライアントのネットワーク (in.dhcpd を実行可能である必要があります) 上の任意の Solaris 2 マシン上で、in.dhcpd デーモンを中継エージェントモードで動作させることができます。この方法は、Solaris 2.6 およびそれ以降のリリースが動作しているマシンに当てはまる方法です。図 14-1 に、DHCP と BOOTP の概要を示します。

図 14-1 DHCP アーキテクチャダイアグラム

Graphic

DHCP クライアント

DHCP プロトコルには、クライアントに関連する 2 つの機能があります。1 つは、クライアントがネットワーク通信の終端を確立することができるように、クライアントに対して十分な情報を配信することです。もう 1 つの機能は、システムレベルとアプリケーションレベルのソフトウェアに必要な、その他のパラメタを提供することです。

クライアント情報の配信

最初の機能を実行するにあたり、DHCP プロトコルはクライアントのハードウェアインタフェースに接続されているネットワークに対して有効な IP アドレスを提供します。IP アドレスを使用する権利は設定された期間だけ与えられ、これをリースと呼びます。この点が、従来の静的構成と異なります。クライアントが、オリジナルのリースよりも長い期間に渡ってこの IP アドレスを使用したいと希望する場合は、サーバとの間で DHCP を介してリースの延長についてネゴシエーションを定期的に行う必要があります。クライアントに IP アドレスが必要なくなった場合、マシンのユーザはリースを放棄して、使用可能な IP アドレスのプールへ IP アドレスを戻すことができます。ユーザが戻さない場合、その IP アドレスはリースの期限が切れると自動的に回収されます。

クライアント側の DHCP プロトコルを Solaris 上に実装する場合には、複数の条件を満たす必要があります。サンのワークステーションを立ち上げることは、構成や起動が必要なサービスが多様でかつその数が多いため、複雑なプロセスです。DHCP による解決策はすべて、すでに使用されているその他の方法 (特に、逆アドレス解決プロトコル (RARP) および静的な構成) と併存する必要があります。ワークステーションが起動した後でもスーパーユーザはネットワークのアドレスを変更することができることを前提とする必要があります。複数のインタフェースが構成可能である必要があります。人間による制御に応答する必要があり、さらにプロトコルの状態についての報告と統計の提供が可能である必要があります。

Solaris 2 DHCP クライアントは、複数の機能を実装することによってこれらの条件を満たします。最初の起動から数日または数週間後にはリースを更新する必要があるため、DHCP を受け持つエージェントを、クライアント上でデーモンとして動作させる必要があります。このデーモン、すなわち DHCP エージェントあるいは dhcpagent(1M) は、プロトコルの対話をすべて受け持ちます。デーモンは、サーバへの接続の際には、DHCP プロトコルの全パケットの送受信を行います。このデーモンは、以下を実行します。

エージェントの役割はこれですべてです。クライアントが動作している可能性がある、より上位のレベルについては、このデーモンはまったく関知しません。

開始時点では、エージェントは DHCP がどのインタフェースを構成するかについては何も想定しないで他のエンティティからの命令を待機します。これらの命令は制御プロトコルによってエージェントへ引き渡されますが、さらに、この制御プロトコルによって状態とその他の情報がエージェントからコントローラへ戻されます。ユーザはこのコントローラによってエージェントの動作を制御することができ、エージェントの動作の制御は、このコントローラによって ifconfig(1M) コマンドの新規機能を介して実現されます。

ifconfig コマンドには、インタフェース上での DHCP の開始や終了を行う、DHCP 専用の新しいコマンド行オプションがあります。DHCP が開始されると、エージェントはプロトコルの命令に応じてサーバとの間でパケットの送受信を行います。

最も簡単な例として、DHCP によってインタフェースが正常に構成された場合を考えます。エージェントは、リースの存続期間を記録し、インタフェースが構成済みである旨を ifconfig に通知し、受け取った構成をディスクに書き込んで休眠状態に戻ります。

事前に設定された将来のある時点 (通常はリース存続期間を 50% 経過した時点) になると、エージェントは再び目を覚まして、リースの延長についてネゴシエーションを行います。このネゴシエーションは、ワークステーションが動作している間は何回でも無制限に行うことができます。最後には、システムを停止する時が来ます。その場合は、ifconfig によってエージェントに通知して、リースを放棄することができます。リースを放棄すると、ディスク上に格納されている構成情報はもはや有効でなくなるため削除されます。

エージェントは、数多くの別々のインタフェースを同時に追跡することができますが、それらのインタフェースの更新を同時に行う必要はありません。

上記の例は最も単純な場合ですが、状況がより複雑な場合も考えられます。エージェントが、自己のプロトコルメッセージに対する応答をまったく受け取らない場合もあります。その場合、エージェントはディスクに格納されていた構成を使用することができます。ただし、それが可能なのは、その構成に関連付けられたリースの期限が切れていない場合に限られます。有効な構成が見つからない場合、エージェントは定義済みの再伝送スケジュールを使用して DHCP を再試行を継続することもできますが、インタフェースの構成に失敗することもあります。どちらになるかは、インタフェースが主インタフェースとして指定されているかどうかに依存します。インタフェースが主インタフェースとして指定されている場合、エージェントは DHCP の再試行を継続します。インタフェースが主インタフェースとして指定されていない場合、エージェントは ifconfig コマンドに失敗します。

さらにエージェントは、人間の介入が発生した可能性も考慮する必要があります。目が覚めた際に、IP アドレスとインタフェースの状態が受け取った構成と一致していないことをエージェントが発見した場合、エージェントはそのインタフェースをアクティブリストからはずします。リースの取得がエージェントに対して再度要求されるまでは、インタフェースに対しては DHCP 操作は何も発生しません。

追加情報の提供

2 番目の機能、すなわちアプリケーションレベルとシステムレベルの情報の配信を実行するにあたり、Solaris DHCP クライアントは別のプログラムの dhcpinfo(1) を使用します。エージェントはこれらのサービスについては何も知らないため、dhcpinfo が取り出すのを待機し、DHCP プロトコルを介して受け取った構成情報をすべて格納します。

dhcpinfo コマンドは、指定されたパラメタを用いてコマンド行の引数を解釈し、当該パラメタの値についてエージェントに問い合わせ、その結果を (人間が読める) テキストの文字列として標準出力に表示します。ただし、dhcpinfo の応答を主に使用するのはユーザではなく Solaris 2 の起動スクリプトです。その理由は、シェルコマンドの置換や出力の切り替えの際に容易にこの出力を使用することができるからです。

DHCP が提供するデータは、ホスト全体についてのデータもあれば、インタフェース専用のデータもあります。DHCP が構成可能なインタフェースを 1 つだけ持つクライアントではこの違いは意味がありませんが、数多くのインタフェースをもつホストでは dhcpinfo パラメタに関する解釈の疑問が生じます。たとえば、エージェントが 2 つのインタフェースを構成可能であり、かつこの 2 つのインタフェースに対して戻された NIS+ ドメイン名が異なる場合があります。この状況は、インタフェースを 2 つのカテゴリ、すなわち主インタフェースと二次インタフェースに分けることによって解決することができます。

主インタフェースは、ホスト全体の構成の場合に優先されるインタフェースです。dhcpinfo は、値を尋ねられると主インタフェースに問い合わせます。インタフェース専用のデータの場合もまったく同じように行われます。戻される値は、主インタフェースついて受け取ったデータになります。たとえば dhcpinfo は、IP アドレスを尋ねられると主インタフェースの IP アドレスを標準出力に表示します。ifconfig に対するコマンド行の引数によって、インタフェースを主インタフェースとして指定します。

dhcpinfo コマンドでは、その他のコマンド行オプションによってデフォルトの動作を無効にすることができます。それらのオプションのうちの 1 つを使用すると、インタフェース名を明示的に指定することができます。その場合、戻される値は当該インタフェースに対して DHCP が配信した値になります。

ホスト全体についてのデータの大部分は Solaris 2 クライアントの正常なブートにとって非常に重要であるため、1 つのインタフェースを主インタフェースとして指定することは、エージェントがその主インタフェースを構成できない限りシステムがブートできないことを示します。 dhcpagent が主インタフェースの構成を完了するまで無期限に待機するように、コマンド行の引数によって ifconfig コマンドに命令します。

DHCP サーバ

DHCP サーバは、そのサーバに直接接続されているネットワークの IP アドレス空間を管理します。この環境をその他のネットワークに拡張する場合は、DHCP サーバまたは BOOTP 中継エージェントをそれらのネットワーク上で構成する必要があります。

DHCP サーバは、主サーバとしても二次サーバとしても動作することができます。主サーバであるためには、一定の範囲の IP アドレスを受け持つ必要があります。


注 -

という用語は、クライアントとサーバでは異なる意味で使用されます。


すでに主 DHCP サーバが存在するネットワークに DHCP サーバを追加する場合は、新規サーバを、主サービスと二次サービスを提供するように構成することも、また二次サービスだけを提供するように構成することもできます。新規サーバを両方のサービス用に構成した場合は、それぞれが異なる IP の範囲を受け持っている限り、両方のサーバが主サーバの役割を実行することができます (IP アドレスを配付することができます)。確認を求める要求に 1 つの主サーバが応答できない場合に、その主サーバが提供する既存の構成を確認することによって、各サーバはその他のサーバの二次サーバとして動作することができます。各主サーバは、自動的に 1 つの二次サーバとして動作します。

DHCP サーバの IP アドレスの範囲は、そのサーバ上にソフトウェアをインストールして設定する際に指定します。主 DHCP サーバになると、サーバは、新規設定を要求するクライアントに対して、自己が受け持つ IP アドレスの範囲から IP アドレスを配付することができます。クライアントが既存の設定の確認を要求した場合は、当該クライアントの IP アドレスを受け持っているサーバが設定を確認します。二次サーバとして動作する場合は、ネットワーク上の別の DHCP サーバが提供した設定を確認することができます。

二次サービスを提供する場合、DHCP サーバはネットワーク上の別のサーバが提供した設定を確認します。これを行うのは、IP アドレスを受け持つ主サーバが応答することができない場合です。待機時間経過後に、主サーバに代わって二次サーバが応答します。

DHCP サーバを二次サーバとしてのみ構成することもできます。DHCP サーバを二次サーバとしてのみ構成したい場合は、dhcpconfig プログラムを使用し、新規設定を要求するクライアントに対して配付する IP アドレスの範囲を持たないサーバの構成を選択します。この構成では、DHCP サーバは、データの記憶領域として NIS+ を使用している必要があります。

DHCP サービスは、DHCP が dhcpconfig ユーティリティを用いて動作しているマシン上で有効にして構成することができます。このユーティリティを使用すると、起動オプションの設定、DHCP サービスのデータベースの形式と位置の設定、任意のローカル接続またはリモートネットワークの dhcptab テーブルと dhcp_network テーブルの初期化を行うことができます。

dhcpconfig を起動するとメニューが表示されます。このメニューには、DHCP サービスを構成するオプション、BOOTP 中継エージェントを設定するオプション、DHCP の構成または中継サービスの構成を削除するオプション、終了オプションがあります。管理者がメニューオプションのうちの 1 つを選択すると、必要な情報を収集するための一連の質問が表示されます。次に、dhcpconfig により、選択した機能をオンに設定するためのステップが実行されます。

同じネットワーク上の複数の DHCP サーバは、NIS+ または NFS を介して DHCP データベースを共有すると、より効率的に動作します。共有を行うと、DHCP サーバが共通のデータストアを介して通信できるために、冗長性が向上し、かつ連携するサービス間で負荷が分散されます。

新規 DHCP クライアントがネットワークに追加されると、そのクライアントは、到達範囲内にある使用可能なすべての DHCP サーバまたは BOOTP サーバ、あるいはその両方を検出する目的でメッセージを送ります。このメッセージを受け取った DHPC サーバは、最初に、割り当て用に使用可能な IP アドレスがあるかどうかを検査します。使用可能な IP アドレスがある場合、サーバは、まだ使用されていない使用可能な IP アドレスがあるかどうかを確認します。まだ使用されていない IP アドレスがない場合、サーバは、その IP アドレスとその他の構成情報をクライアントに提供します。IP アドレスが使用中であった場合、サーバはその IP アドレスを使用不可とマークし、状態を管理者に通知して、別の IP アドレスを選択します。

クライアントは、独自の条件をベースにして、自己に対して提供された 1 つの IP アドレスを選択し、自己の選択を特定するメッセージを送ります。

サーバのデータベース

DHCP/BOOTP サーバは、dhcptab データベースと dhcp_network データベースという 2 種類のデータベースを使用します。

dhcptab データベースは、termcap に似た構文を使用して定義されたマクロを格納しています。この構文を使用すると、ネットワーク管理者はクライアントに戻す DHCP 構成パラメタのグループを定義することができます。現在のところ、77 の定義済みパラメタがあります。

DHCP/BOOTP サーバは、そのサーバと同じネットワークに接続されているクライアントによって要求された場合には、ホスト名、ネットワーク一斉同報通信アドレス、ネットワークのサブネットマスク、IP 最大転送ユニット (MTU) のいずれかを戻します。この情報は、dhcptab 内に明示的に設定する必要はありません。dhtadm コマンドによって dhcptab サーバ構成テーブルを管理します。

分散型 dhcptab テーブルを共有する 2 つのサーバが存在し、かつ 2 つのサーバが同じ NIS+ ドメイン内にある場合、管理者はそのテーブル内の DHCP パラメタを設定して 2 つのサーバに相互のバックアップを行わせることができます。ただし、本来の構成として、それぞれが異なる範囲の IP アドレスを受け持つ必要があります。さらに、クライアントが他のネットワーク上のサーバに到達することを可能にするため、個々のネットワークに BOOTP 中継エージェントが必要な場合もあります。

dhcp_network データベースは、クライアント識別子と IP アドレスとの間のマップを格納しています。このデータベースの名前は、サポート対象のネットワークにちなんで付けられています。dhcp_network データベースは、DHCP/BOOTP サービスを提供するネットワークごとに 1 つ存在します。dhcp_network データベースは、実行時にサーバによって動的に検出され、問い合わせを受けます。dhcp_network データベースが存在しないネットワークから受け取ったクライアントの要求は無視されます。

dhcp_network データベースは、IP アドレスとその IP アドレスに関連付けられている構成パラメタに対して、DHCP クライアントのクライアント識別子を対応づけます。このデータベースは、実行時に DHCP サーバによって検出されますが、検出は DHCP 要求が発信されたネットワークの IP ネットワークアドレスとサブネットマスクを使用して dhcp_network データベース名を生成することにより行われます。たとえば、10.0.0.0 ネットワークをサポートする dhcp_network データベースは 10_0_0_0 と呼ばれます。dhcp_network データベースは、NIS+ テーブルまたは ASCII ファイルとして存在が可能です。dhcp_network データベースを管理する場合は、pntadm コマンドを使用します。

in.dhcpd デーモンには、DHCP サーバ (オプションの BOOTP 互換モードを含む) および BOOTP 中継エージェントモードという 2 つの動作モードがあります。

BOOTP 中継エージェント

複数のネットワークと、ネットワークを特定するためのネットマスクの使用によって、TCP/IP をベースとしたネットワークの機能が複雑化しています。たとえば、IP を使用した一斉同報通信は、ネットワーク同士を接続するゲートウェイを介しては行うことができません。つまり、あるネットワーク上のクライアントは、その他のネットワーク上のサーバに対して DHCP 要求または BOOTP 要求の一斉同報通信を行うことができません。BOOTP 中継エージェントがゲートウェイを介してサーバへ要求を送り、次にサーバからの応答をクライアントに戻す必要があります。

ルータには組み込み型の BOOTP 中継エージェントがないが、DHCP サーバにインストールしたサービスの利点をその他のネットワーク内のクライアントにも利用させたいと希望する場合は、それらのネットワーク上に BOOTP 中継エージェントをインストールすることができます。BOOTP 中継エージェントを使用すると、DHCP サーバが動作していないネットワークから DHCP サーバへアクセスすることが可能になります。

in.dhcpd デーモンを BOOTP 中継エージェントとして動作させることができます。BOOTP 中継エージェントモードを指定する場合は、オプションの引数により、中継エージェントが BOOTP 要求を転送する必要がある転送先の DHCP サーバまたは BOOTP サーバの IP アドレスまたはホスト名のコンマ区切り形式のリストを指定します。このモードでデーモンを開始すると、DHCP データベースがすべて無視されて、デーモンが BOOTP 中継エージェントとして動作します。

BOOTP 中継エージェントは、UDP ポート 68 での受信を待機し、このポートで受信した BOOTP 要求のパケットをコマンド行に指定された転送先へ転送します。中継エージェントは、ローカルなルータの情報を持つマシン上であれば動作可能であるため、インターネット用のゲートウェイマシンである必要はありません。

-r IPaddr | hostname ... オプションによって、BOOTP 中継エージェントが使用可能になります。netmasks データベースに正しいエントリを作成して、BOOTP 中継エージェントが役割を果たす対象の DHCP サーバが、外部の BOOTP/DHCP クライアントのネットワークのサブネットマスクを特定することを可能にする必要があります。

BOOTP 中継エージェントをインストールした後で、分散型 DHCP データベースにエントリを追加して、BOOTP 中継エージェントを介して要求を送信するクライアントに DHCP サーバがサービスを提供することを可能にする必要があります。

pntadm コマンドのマクロオプション (-M) は、特定のアドレスを使用してクライアントに戻す構成パラメタをネットワーク管理者が選択することを可能にするメカニズムです。このマクロオプションは、サーバに固有な情報を含むマクロを配信する場合にも使用することができます。この場合は、当該マクロ定義を特定のサーバが所有するすべての dhcp_network データベースのエントリに含めます。

リース

DHCP/BOOTP サーバは、dhcptab データベースと dhcp_network データベースに格納されている情報を使用して、クライアントの IP アドレスのリースを計算します。サーバが調べるのは、dhcptab データベース内の LeaseTim シンボルと LeaseNeg シンボル、選択された dhcp_network データベースレコードの Flags フィールドと Lease フィールドです。

サーバは最初に、特定された dhcp_network レコードの Flags フィールドを調べます。PERMANENT フラグまたは BOOTP フラグがオンの場合、クライアントのリースは永久的であるとみなされます。

PERMANENT フラグがオンではない場合、サーバは dhcp_network レコード内の Lease フィールドに表示されているクライアントのリースが期限切れになっているかどうかを検査します。期限切れになっていない場合、サーバはクライアントが新規リースを要求しているのかどうかを検査します。クライアントの dhcptab パラメタ内に LeaseNeg シンボルが含まれていない場合、クライアントが要求しているリースの延長は無視され、リースは Lease フィールド内に表示されている残り時間に設定されます。

LeaseNeg シンボルが含まれていて、かつ要求されたリースが、現在時刻にクライアントの LeaseTim dhcptab パラメタの値を加えた値以下である場合、サーバはクライアントのリースをクライアントが要求した値まで延長します。クライアントが要求したリースがポリシーにより許容される値 (ポリシーは LeaseTim の値) より大きい場合は、現在時刻に LeaseTim の値を加えた値に等しいリースがクライアントに与えられます。LeaseTim が設定されていない場合は、デフォルトで LeaseTim の値が 1 時間となります。