dhclient-script - DHCP
クライアントのネットワーク設定スクリプト
DHCP
クライアントのネットワーク設定スクリプトは、
時あるごとに
dhclient(8)
が呼び出します。 DHCP
クライアントは、本スクリプトを使用することにより、
アドレス要求に先立つ各インタフェースの初期設定と、
付与されたアドレスの検査と、
リース獲得時のインタフェースの最終設定を行います。
リースが獲得されなかった場合、
定義済みのリースが存在するならばこれを検査するために本スクリプトは使用され、
有効なリースが判明しなかった場合にももう
1
回このスクリプトが呼ばれます。
本スクリプトは、エンドユーザにカスタマイズされることを意図していません。
ローカルなカスタマイズが必要な場合、
これは入 (enter) と出 (exit)
というフックを使用することで可能となります
(詳細はフック参照)。
これらのフックは、
/etc/resolv.conf 作成時に、
クライアントのデフォルト動作をユーザがオーバライドできるようにします。
特定のオペレーティングシステムでは、
クライアントの実体は動作するとしても、
標準のスクリプトが動作しないかもしれません。
先駆的なユーザが新規スクリプトを作成したり既存のものを修正したりする必要がある
ことはもっともなことです。
一般的には、それぞれのコンピュータに固有のカスタマイズは
ETCDIR/dhclient.conf
スクリプトで行うべきです。
ETCDIR/dhclient.conf
のカスタマイズ無しにできないカスタマイズや、
入と出のフックの使用ではできないカスタマイズに気づいた場合には、
バグレポートを送ってください。
フック¶
開始時に、クライアントスクリプトはまずシェル関数を定義します。その関数は
make_resolv_conf であり、後に
/etc/resolv.conf
ファイルを作成するために使用されます。
デフォルト動作をオーバライドするには、
この関数を入のフックスクリプトで再定義してください。
make_resolv_conf
関数の定義の後、クライアントスクリプトは
実行可能な
ETCDIR/dhclient-enter-hooks
スクリプトの存在を検査し、
存在する場合には Bourne
シェルの '.'
コマンドを使用して
本スクリプトをインラインで起動します。
操作で記述されているすべての環境が本スクリプトで使用可能であり、
スクリプトの動作の変更が必要な場合には環境の修正が許されています。
スクリプト実行中にエラーが発生した場合、
exit_status 変数を非 0
値に設定することが可能であり、
クライアントスクリプト終了直後に
CLIENTBINDIR/dhclient-script
はそのエラーコードで終了します。
すべての処理の完了後に、
CLIENTBINDIR/dhclient-script
は実行可能な
ETCDIR/dhclient-exit-hooks
スクリプトの存在を検査し、存在する場合には
'.'
コマンドでこれを起動します。
dhclient-script の 終了状態は
dhclient-exit-hooks の exit_status
シェル変数に渡され、
起動された仕事にスクリプトが成功した場合には値は常に
0 になります。 dhclient-enter-hooks
の項で前述したその他の環境も引き継がれます。
ETCDIR/dhclient-exit-hooks は exit_status
に手を加えて dhclient-script
の戻り値を変更できます。
dhclient
がクライアント設定スクリプトを起動する必要があるとき、
様々な変数を環境に定義してから
CLIENTBINDIR/dhclient-script
を起動します。
すべての場合において、$reason
にはスクリプトが起動される理由名が設定されます。
次の理由が現在定義されています:
MEDIUM, PREINIT, BOUND, RENEW, REBIND, REBOOT, EXPIRE, FAIL, TIMEOUT。
MEDIUM¶
DHCP
クライアントは、インタフェースのメディアタイプの設定を求めています。
インタフェース名は
$interface
で渡され、メディアタイプは
$medium で渡されます。
PREINIT¶
DHCP クライアントは、
実際のアドレスを受け取る前にパケットを送信する目的で、
要求通りにインタフェースが設定されることを求めています。
BSD
のソケットライブラリを使用するクライアントでは、
IP アドレス 0.0.0.0
かつブロードキャストアドレス
255.255.255.255 で、
インタフェースを設定することを意味します。
他のクライアントでは、
実際に IP
アドレスを与えることなく単にインタフェースを設定することで
実現されるでしょう。
インタフェース名は
$interface
で渡され、メディアタイプは
$medium で渡されます。
IP エイリアスが dhclient.conf
で宣言されている場合、
このアドレスが $alias_ip_address
で渡されます。 本 IP
アドレスへの経路とともに、
本 IP
アドレスを対象インタフェースから削除する必要があります。
BOUND¶
DHCP
クライアントは、新アドレスへの初期の結合を完了しました。
新しい IP アドレスは
$new_ip_address で渡され、
インタフェース名は
$interface で渡されます。
メディアタイプは $medium
で渡されます。
サーバから獲得したオプションは、
dhcp-options
で宣言されている
オプション名で渡されます。
例外として、
有効なシェル変数とするために
ダッシュ ('-')
はアンダスコア('_')で置き換えられ、
変数名は new_
で開始します。
例えば、新しいサブネットマスクは
$new_subnet_mask で渡されます。
アドレスを実際に設定する前に、dhclient-script
は何らかの方法で
そのアドレスに対して
ARP
を行い、返事を受け取った場合には非
0 の値で
終了するべきです。この場合クライアントは
DHCPDECLINE
メッセージをサーバ
に送信し、違うアドレスを取得します。
この作業は RENEW, REBIND, REBOOT
状態でも同様に行いますが、
必ずしも必要ではなく、実際好ましくないでしょう。
結合が完了すると、
ネットワークに関する多くのパラメータを設定する必要があるでしょう。
$new_domain_name および $new_domain_name_servers
(これには複数のサーバを空白で区切って列挙してあるかもしれません)
を使用して、 新しい
/etc/resolv.conf
を作成する必要があります。
デフォルト経路は、$new_routers
を使用して設定する必要があります。
静的経路は、$new_static_routes
を使用して設定する必要があるかもしれません。
IP
エイリアスが宣言されている場合、ここで設定する必要があります。
エイリアスの IP
アドレスは $alias_ip_address
として記述され、
エイリアス用に設定される他の
DHCP オプション
(例えばサブネットマスク)
は
前述のように変数で渡されますが、
$new_
で開始するのではなく
$alias_ で開始します。
エイリアスの IP
アドレスが結合された
IP アドレス ($new_ip_address) と
同じ場合、これを使用してはならないことに注意してください。
なぜなら、この場合には他のエイリアスのパラメータが正しくない可能性がある
からです。
RENEW¶
結合が更新されると、スクリプトは
BOUND
と同様に呼ばれますが、
$new_
で開始する全変数に加えて
$old
で開始する別の変数の組があるという
例外があります。
変更された可能性がある永続的な設定は、削除する必要があります。
例えば、結合されたアドレスに対するローカル経路が設定された場合、
古いローカル経路を削除する必要があります。
デフォルト経路が変更された場合、古いデフォルト経路を削除する必要があります。
静的経路が変更された場合、古いものを削除する必要があります。
その他については、BOUND
と同様に処理可能です。
REBIND¶
DHCP
クライアントが、新規
DHCP
サーバに再結合されました。
これは RENEW
と同様に扱えますが、IP
アドレスが変わった場合には、
ARP
表をクリアする必要があります。
REBOOT¶
DHCP
クライアントは、リブート後に元のアドレスを再獲得することに成功しました。
これは BOUND
と同様に処理可能です。
EXPIRE¶
DHCP
クライアントはリース更新と新規リース獲得に失敗し、
リースの期限が切れました。
対象 IP
アドレスを解放する必要があり、
RENEW および REBIND
と同様に、関連するパラメータを削除する必要があります。
FAIL¶
DHCP クライアントは DHCP
サーバに接続できず、
また検査した IP
アドレスには有効なものはありませんでした。
最後に検査したリースのパラメータは、設定解除する必要があります。
これは、EXPIRE
と同様に扱えます。
TIMEOUT¶
DHCP クライアントはどの
DHCP
サーバにも接続できませんでした。
しかしながら、古いリースが識別され、
BOUND
と同様に、この古いリースのパラメータが渡されました。
クライアントの設定スクリプトは、このパラメータを検査し、
これが有効であると信じる理由があるならば、値
0 で終了すべきです。
そうでないならば、非
0
の値で終了すべきです。
リースを検査する通常の方法は、REBIND
と同様にネットワークを設定して
(複数のリースを検査するために呼ばれることがあるからです)、
$routers
で定義される最初のルータに
ping することです。
応答を受信した場合、
インタフェースが現在接続されているネットワークに対して、リースが有効です。
$new_static_routers に加えて $new_routers
に列挙されている全ルータに
ping
を試すようになれば、
完全性が増すでしょう。しかし、現在のスクリプトはそうなっていません。
関連ファイル¶
類似したオペレーティングシステムに対するスクリプトファイルは
似ていたり全く同じかもしれませんが、一般には、
各オペレーティングシステム用に各々のスクリプトファイルがあるべきです。
Internet Systems Consortium の DHCP
配布に含まれるスクリプトファイルは、
client/scripts
以下の配布ツリーにあり、
動作対象オペレーティングシステム名になっています。
複数インタフェースを使用する場合、
サーバが提供する設定パラメータ同士が
衝突しないようにする明確な方法はありません。
例えば、 標準の dhclient-script
は /etc/resolv.conf
を再度書き換えてしまいます。
すなわち、複数のインタフェースが設定されている場合、
あるサーバから提供される値に
/etc/resolv.conf
が初期化された後に、
別のサーバから提供される値に初期化されるという動作を繰り返します。
どちらのサーバから提供される情報も有効である場合には、
実際上問題とはならないものの、混乱のもとになりえます。
関連項目¶
dhclient.conf(5),
dhclient.leases(5),
dhclient(8)
dhclient-script(8) は Ted Lemon が Vixie Enterprises
と協力して Internet Systems Consortium
のために
書きました。 Internet Systems Consortium
についてより詳しくは、
https://www.isc.org
をご覧ください。 Vixie
Enterprises
についてより詳しくは、
http://www.vix.com
をご覧ください。