TCP/IP とデータ通信

DHCP クライアントの障害追跡

DHCP クライアントの障害追跡を行う場合は、クライアントの構成とクライアント〜サーバ間の通信についての問題点を理解しておく必要があります。DHCP がサーバと通信できなかったか、または受け取った構成応答が間違っていたかのいずれかのために、DHCP がクライアントを正しく構成することに失敗する場合があります。さらに、クライアントが自己の IP アドレスを更新することができない場合には、DHCP のリースの期間の終わり頃になって問題が発生することがあります。

クライアントがサーバと通信できない場合

クライアントとサーバが相互に通信を行うことができない場合は、以前の DHCP のトランザクションからキャッシュに書き込んだ構成をクライアントが持っているかいないかに応じて結果が異なります。クライアントがキャッシュに書き込まれた構成を持っていて、かつリースがまだ有効な場合は、キャッシュのデータを使用してインタフェースを構成します。

ただし、キャッシュに書き込まれている構成が有効であるという外部での確認をクライアントが受け取っていないため、IP アドレス、ルータのアドレス、およびその他の情報が有効であるという保証はありません。構成を受け取った際のネットワークとは別のネットワークにインタフェースが接続された場合は 2 種類のエラーが発生する可能性があり、発生する場合にはいずれか 1 つが発生します。その他のネットワークサービスを開始した際にいずれかのエラーが表示される場合があります。あるいはネットワーク上のその他のホストとの通信ができない場合があります。

逆に、期限が切れていないリースを持つキャッシュが存在しない場合、インタフェースは構成されません。

受け取った DHCP 構成が無効な場合

以下の 2 つの理由から、構成が無効なことがあります。

  1. クライアントに提供された IP アドレスが他で使用中であることを ARP によってクライアントが判定する。

    この場合、クライアントはサーバに DHCPDECLINE メッセージを送信します。サーバが不良なアドレスを 3 つ以上提供すると、dhcpagent は失敗します。

  2. クライアントは IP アドレスを取得したが、確認を試行するとサーバが確認ではなく DHCPNAK メッセージを送信する。

クライアントが DHCPNAK メッセージを 3 回以上受け取ると、dhcpagent は失敗します。このことは、サーバが誤動作していることを示します。

問題をクライアントまたはサーバに切り離す場合

問題をクライアントマシンまたはサーバマシンのいずれかの問題として切り離す場合は、以下の処置を実行します。

問題

DHCP サーバマシンが動作していない。

検証: クライアントと同じサブネット上の別のマシンにログインし、ping コマンドを使用してサーバへの接続を試行します。

解決策: サーバマシン上で問題を診断します。

問題

DHCP サーバが動作していない。

検証: サーバにログインして、以下のコマンドを入力します。


ps -ef | grep dhcp

解決策:

  1. DHCP サーバを停止して再起動します。

  2. 以下のコマンドを入力します。


    /etc/init.d/dhcp stop 
    

  3. 約 10 秒間待機してから、以下のコマンドを入力します。


    /etc/init.d/dhcp start 
    

問題

DHCP の際、ブートプロセスがハングする。

検証: インタフェースが primary とマークされますが、有効な DHCP トランザクションは発生していません。

解決策: control-C を入力して DHCP に割り込みます。ブートが継続します。


注 -

ブートは継続しますが、ホストが接続されているネットワークに対しては、ホストの間違った構成が行われる場合があります。


クライアントが DHCP サーバに接続できない場合

問題

DHCP クライアントのソフトウェアを構成し、そのクライアントを再起動した後で、ネットワーク上のサーバにクライアントから接続することができない。DHCP のネットワークコマンドがすべて失敗し、DHCP サーバへの接続をクライアントが試行したが失敗した、というメッセージが表示される。

一般的なエラーメッセージは以下のとおりです。


DHCP or BOOTP server not responding


(DHCP サーバまたは BOOTP サーバが応答しない)


A request to access nonexistent dhcp_network database: databasename in datastore: datastore.


(データストア datastore 内の、存在しない dhcp_network データベース databasename へのアクセス要求である)


No more IP addresses for network_address network.


(network_address には、もう IP アドレスがない)

検証: 問題を正確に突き止めるために、以下の処置を実行します。

  1. クライアントをデバッグモードで動作させます。

  2. 手動でインタフェースの構成を試行して、ハードウェアが機能していることを確認します。

  3. DHCP サーバをデバッグモードで実行します。

  4. snoop コマンドを使用して、DHCP サーバとクライアントとの間で送信されるメッセージを追跡します。

  5. 問題がクライアントマシン側にあるのかサーバマシン側にあるのかを調べます。

  6. エラーメッセージを調べて、以下の情報から解決策を選択します。

クライアントをデバッグモードで動作させる

クライアントをデバッグモードで動作させます。稼働している製品のマニュアルを参照してください。

Solaris 2 クライアントの場合

  1. 以下のように入力して起動します。


    /sbin/dhcpagent -d3
    

DOS クライアントの場合

PC-NFS DOS クライアント上で、以下を実行します。

  1. AUTOEXEC.BAT ファイルを編集し、SNCLIENTSNCLIENT /D に置換します。

  2. クライアントを再起動します。

インタフェースを手動で構成する

dhcpagent をデバッグモードで開始した後で、以下のように入力して、手動でインタフェースの構成を試行することができます。


ifconfig interface_name auto_dhcp

送受信されたパケットが表示されます。

サーバをデバッグモードで動作させる

  1. クライアントと同じサブネット上の DHCP サーバにスーパーユーザでログインします。

  2. デバッグモードで、DHCP サーバを終了して再起動します。たとえば、以下のようにします。


    /etc/init.d/dhcp stop
    /usr/lib/inet/in.dhcpd -d -v
    

    あるいは、i オプションが存在する場合には、コマンドを以下のフォーマットで入力します。


    /usr/lib/inet/in.dhcpd -i interface_names -d -v
    

snoop を使用してネットワークのトラフィックを監視する

  1. クライアントと同じサブネット上の DHCP サーバまたは BOOTP 中継エージェントにスーパーユーザでログインします。

  2. snoop コマンドを使用して、ネットワークのトラフィックを追跡します。たとえば、以下のように入力します。


    snoop -o /tmp/output udp port 67 または udp port 68
    
    あるいは

    snoop -o /tmp/output udp port bootps または udp port bootpc
    
    インタフェースごとの引数が存在する場合は、その引数を加えます。

  3. クライアントをブートして、サーバ上でネットワークのメッセージを監視します。

  4. 以下のように入力します。


    snoop -i /tmp/output -x 0 -v
    
    このコマンドにより、パケットのトレースを参照することができます。

エラーメッセージを調べる

デバッグモードで in.dhcpd コマンドを実行した結果の出力を調べ、調べたエラーメッセージまたは状態を使用して、以下の情報から解決策を見つけ出します。

問題

以下のエラーメッセージが表示される。


Datagram received on network device: le0


(ネットワークデバイス le0 上でデータグラムを受け取った)


ICMP ECHO reply to OFFER candidate: ip_address disabling


(OFFER 候補 ip_address に対する ICMP ECHO の応答が無効にされた)

検証: DHCP サーバは、クライアントに対して IP アドレスを提供する前に、その IP アドレスに対して ping コマンドを使用して当該アドレスが使用中ではないことを確認します。クライアントが応答した場合、その IP アドレスは使用中です。

解決策: 設定した IP アドレスがまだ使用中ではないことを確認します。

問題

以下のエラーメッセージが表示される。


No more IP addresses for network_address network


(network_address ネットワークには、もう IP アドレスがない)

検証: クライアントの dhcp_network テーブル内に、使用可能な IP アドレスがありません。

解決策: dhcpconfig コマンドを使用して、さらに IP アドレスを割り当てます。DHCP デーモンが複数のサブネットを監視している場合は、追加の IP アドレスが、クライアントが配置されているサブネットに対するものであることを確認します。

問題

dhcp_network データベース内に id_name という不良なクライアント ID がある。

検証: dhcp_network テーブル内のクライアント ID (MAC アドレス) が間違っています。

解決策: イ−サネットを使用している場合、クライアント ID は 01 の後にイ−サネットアドレスが続きます。アドレス内のすべての文字が大文字になっていることを確認します。00 は、アドレスが割り当てられていないことを表します。

問題

以下のエラーメッセージが表示される。


Request to access nonexistent dhcp_network database: database_name in datastore: nisplus_datastore.


(データストア nisplus_datastore 内の、存在しない dhcp_network データベース database_name へのアクセス要求である)

検証: DHCP サーバの構成時に、dhcpconfig スクリプトがサブネットの dhcp_network テーブルを作成しませんでした。テストネットワークとして、LAN (たとえば、サーバ 1 つとクライアント 2 つ) を設定して切り離した場合に起こることがあります。

解決策: dhcpconfig コマンドを使用して、dhcp_network テーブルと新規 IP アドレスを初期化します。

問題

以下のエラーメッセージを受け取る。


Client client_id is trying to verify unrecorded address ip_address, ignored.


(クライアント client_id が、記録されていないアドレス ip_address の確認を試行して無視された)

検証: このメッセージを受け取る場合は、考えられる理由が 2 つあります。

  1. dhcp_network テーブルが削除されている場合に、このメッセージを受け取ることがあります。Solaris 2 の DHCP サーバのみを使用している場合は、通常これが理由です。

  2. データストア用に NIS+ が使用されていないことが原因で情報が共有されていない場合に、このメッセージを受け取ることがあります。サーバがデータを共有していることを確認します。

異機種システムが混在しているサーバのグループがある場合、このメッセージを無視します。

解決策: 以下のように入力して、クライアント上の古いキャッシュファイルを削除します。


ifconfig interface_name dhcp release

問題

DHCP は開始されているが、必要なネットワークサービスの一部が開始しない。

検証: DHCP サーバが、必要な構成を供給していません。

解決策: サーバが、必要なパラメタを送信しない理由を調べます。必要なパラメタを送信するようにサーバを構成します。

問題

DHCP は開始されているが、特定のネットワークサービス (たとえば、NIS や NIS+) がエラーを報告するか、またはハングする。ホストが、ネットワーク上のその他のホストと通信を行うことができない。

検証: dhcpagent コマンドが、DHCP と通信を行うことができない (DHCP が使用可能でないため、と考えられます) ために、キャッシュに書き込まれているデータを使用しました。

解決策: キャッシュを削除します。以下のように入力します。


ifconfig interface_name dhcp release

キャッシュを削除しても、正しい構成を取得するという問題は解決されないため、ホストを手動で構成する必要がある場合があります。以下のように入力してトリガーファイルを削除することにより、ブート時に DHCP を無効にする必要があります。


rm /etc/dhcp.interface_name

問題

クライアントはブートして適正に動作するが、以下のメッセージが表示される。


DHCP renewal on interface_name failed


(interface_name に対する DHCP の更新が失敗した)

検証: DHCP は動作していますが、dhcpagent によりサーバに接続してリースの延長を行うことができません。

解決策: サーバが応答しない理由を調べます。dhcptab 内に設定されているルータの値が間違っているか、またはクライアントのネットワークに対して期限が切れていることが理由である可能性があります。

問題

失敗した DHCP の更新についてのメッセージを受け取り、その後で以下のメッセージがコンソールに表示される。


DHCP lease expired on interface_name: interface is now down


(interface_name に対する DHCP のリースの期限が切れて、インタフェースは現在ダウンしている)

ネットワークサービスがこの時点でハングすることが考えられる。

検証: リースの期限が切れました。クライアントは複数回の試行を行いましたが、リースを延長することができませんでした。

解決策: サーバが応答しない理由を調べます。クライアントを再起動します。

BOOTP 互換モードにおいて、一部のクライアントが DHCP サーバからブートしない場合

問題

DHCP デーモンが BOOTP 互換モードで動作している (-b オプション)。

検証: BOOTP はリース時間を使用しません。DHCP サーバは、BOOTP フラグが設定されている空きアドレスを探して、BOOTP クライアントに割り当てます。

解決策: BOOTP アドレスを割り当てます。dhcpconfig を使用して、デーモンのオプションを変更します。

NIS + 構成の問題の診断

以下の情報を使用して、NIS+ ネームサービスの構成内にある、ブート時にクライアントがサーバにアクセスできないというエラーを修正します。

問題

dhcptab テーブル内で、クライアントに対してネームサービスが構成されていない。

検証: サーバにログインして、以下のコマンドを入力します。


dhtadm -P | grep ip_address

NISdmainDNSdmainNISservs などのエントリを検査します。エントリに対して入力されているアドレスが適正であることを確認します。たとえば、以下のようになります。

# dhtadm -P | grep 129.148.3.129.148.3.m:Subnet=255.255.255.0:Router=129.148.3.11: 
Broadcast=129.148.3.255:NISdmain="island.ocean":NISservs=129.148.3.3:


注 -

上記の行は、実際には 2 行に分かれないで 1 行で表示されます。


解決策: dhtadm を使用して、間違っているアドレスがあればすべて変更します。

問題

NIS+ を使用しているが、サーバが NIS+ 互換モードで動作していない。NIS+ テーブルには Nobody カテゴリ用の読み取り権がないため、NIS クライアントが NIS+ テーブルに格納されている情報を読み取ることができない。

検証: 以下のコマンドを実行します。


nisls -l org_dir
このコマンドにより、.r---rmcdrmcdr--- のアクセス権が表示されます。

rpc.nisd デーモンに対して Y オプションが設定されているかどうかを検査します。たとえば、以下のように入力します。


ps -deaf | grep nis

解決策:

  1. NIS+ サーバにスーパーユーザでログインします。

  2. 以下のコマンドを入力します。


    /usr/lib/nis/nisserver -r -Y -d domainname
    

問題

デフォルトのルータが間違っているため、クライアントが別のネットワーク上のサーバに接続することができない。

検証: dhcptab テーブル内のルータのシンボルの定義が本当にルータであることを確認します。

解決策: dhtadm を使用して、テーブル内のルータのシンボルを訂正します。

問題

NIS+ を動作させているが、NIS クライアントに対する DNS 転送がオンに設定されていない。

検証: 以下のコマンドを使用します。


ps -ef | grep rpc.nisd

-B オプションは、DNS 転送がオンに設定されて NIS が動作していることを表します。たとえば、以下のようになります。


/usr/sbin/rpc.nisd -B

解決策: DNS 転送を有効にして、NIS 互換モードで NIS+ サーバを起動します。たとえば、以下のように入力します。


/usr/sbin/rpc.nisd -YB

ネームサービス構成の問題の診断

以下の情報を使用して、NIS ネームサービスの構成内にある、ブート時にクライアントがサーバにアクセスできないというエラーを修正します。

問題

デフォルトのルータが間違っているため、クライアントが別のネットワーク上のサーバに接続することができない。

検証: dhcptab テーブル内のルータのシンボルの定義が本当にルータであることを確認します。デフォルトのルータに問題がある場合は、サーバベースのツールを用いて訂正を行います。

解決策: dhtadm を使用して、テーブル内のルータのシンボルを訂正します。

問題

dhcptab テーブル内で、クライアントに対してネームサービスが構成されていない。クライアントに対しては、ネームサービスは DNS、NIS または NIS+ である必要があり、さらに必要なパラメタをクライアントごとに指定する必要がある。

検証: クライアントの構成に関連する、ネットワークに固有なマクロを検査します。

  1. サーバにログインし、以下のコマンドを入力します。


    dhtadm -P
    

  2. クライアントのネットワークに一致するエントリを探します。

解決策: dhtadm を使用し、以下に従って、ネームサービス用のクライアントのマクロを訂正します。

クライアントが、ネットワーク上の最初のクライアントである場合は、以下のようにします。

  1. dhtadm を使用してエントリを訂正します。

  2. 次に、サーバ上で以下のように入力します。


    /etc/init.d/dhcp stop, 
    /etc/rc3.d/S34dhcp start
    
    さらに、クライアントを再起動します。


    注 -

    クライアントに対して、ネームサービスの選択をサーバが指定することはありません。サーバは関連する情報を提供するだけです。クライアントが自己のネームサービスを選択します。


マクロの変更がクライアントに伝達されない場合

dhtadm を用いて、クライアントの 1 つまたは複数のマクロを変更しましたが、マシン上で変更が反映されません。たとえば、クライアントのルータを変更しましたが、クライアントは依然として古いルータを使用しています。

以下の情報を使用して、変更済みのクライアントのマクロが DHCP サーバ上に反映されないという問題を解決します。

問題

dhcptab テーブルに加えられた変更を読み込むための、DHCP サーバの再初期化が行われていなかった。マクロ定義を変更するたびに、DHCP サーバの再初期化を行う必要がある。

解決策: dhcpconfigrescan オプションセットを使用します。あるいは以下に従います。

以下のようにして、DHCP サーバの再初期化を行います。

  1. DHCP サーバにスーパーユーザでログインします。

  2. 以下のように入力します。


    /etc/init.d/dhcp stop
    

  3. 以下のように入力して、DHCP デーモンを再起動します。


    /etc/init.d/dhcp start