3. クライアントの設定

現在 Linux では、3つの異なる DHCP クライアントプログラムがあります。 dhcpcd, pump と dhclient です。この mini-HOWTO では、 主に dhcpcd を取り扱います。

3.1. クライアントデーモン (dhcpcd) のダウンロード

お使いのディストリビューションによっては、 DHCP クライアントデーモンをダウンロードする必要があるかもしれません。 ソースからコンパイルしたいのであれば、 必要なパッケージは dhcpcd と呼ばれるもので、現在の最新版は 1.3.18 です。 Sergei Viznyuk がメンテナンスしており、 今日では多くのディストリビューションでバイナリパッケージが収録されています。

dhcpcd のソースは次の場所からダウンロードできます。

ダウンロードしたら、以下の指示に従ってください。 どちらのリンクからも同じものが入手可能なはずです。

3.2. Slackware

最新版の DHCPcd は metalab のミラーから、あるいは以下から ダウンロードできます。

最新版の dhcpcd.tar.gz をダウンロードしましょう。

/etc/dhcpc というディレクトリができます。 DHCPcd はここに DHCP 情報を保存します。 dhcpcd は /usr/sbin にコピーされます。

ブート時に DHCP を利用してシステムの初期化を行うには、 以下のように入力します。

cd /etc/rc.d

mv rc.inet1 rc.inet1.OLD

古いネットワーク初期化スクリプトを rc.inet1.OLD にリネームします。ここで新しい rc.inet1 スクリプトを作成する必要があります。 以下のコードで OK でしょう。

#!/bin/sh
#
# rc.inet1      This shell script boots up the base INET system.

HOSTNAME=`cat /etc/HOSTNAME` #This is probably not necessary but I
                             #will leave it in anyways

# Attach the loopback device.
/sbin/ifconfig lo 127.0.0.1
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

# IF YOU HAVE AN ETHERNET CONNECTION, use these lines below to configure the
# eth0 interface. If you're only using loopback or SLIP, don't include the
# rest of the lines in this file.

/usr/sbin/dhcpcd

保存してコンピュータを再起動しましょう。

終わったら最終設定に進みましょう。

3.3. RedHat 6.x および Mandrake 6.x

RedHat 6.0+ における DHCPcd の設定はとても簡単です。 まず control-panel コマンドでコントロールパネルを起動します。

RedHat 6.x では、上記の dhcpcd ではなく、pump が 標準の DHCP クライアントとして同梱されていることに気をつけてください。CD-ROM には dhcpcd の rpm も含まれているので、pump でうまくいかなかったら dhcpcd で試してみましょう。dhcpcd を (例えば rpm -i dhcpcd-1.3.17pl2-1.i386.rpm のように) インストールしたら、 修正が必要になります。

Alexander Stevenson による追加情報を以下に示します。

DHCPcd では全くうまくいきませんでした。結局役に立ったのは Mandrake 6.0 同梱の (たぶん RedHat にもあると思う) "pump" でした。 私が使ったコマンドを以下に示します。

pump -i eth0 -h hostname

"hostname" は何でも構いませんでしたが、 とにかくこれがないとサーバは反応を示しませんでした。

それから、/sbin/ifup スクリプトに変更を加え、設定を反映させました。標準のバージョンでは -h オプションがなかったので、うまく動きませんでした。

基本的に、linuxconf を使っているのであれば、 アダプタの設定を "DHCP" にしても動かない場合には、 /sbin/ifup のスクリプトの pump の行に "-h hostname" というオプションを追加してみるといいのではないでしょうか。私はスクリプトを次のように修正しました。

...
if [ -n "$PUMP" ]; then
    echo -n "Determining IP information for $DEVICE..."
    if /sbin/pump -i $DEVICE -h hostname; then
        echo " done."
    else
        echo " failed."
        exit 1
    fi
else ...

もう一つの、よりエレガントにホスト名を設定する方法が Aad van der Klaauw から寄せられました。以下に示します。

いま自宅のゲートウェイシステムを設定しているんですが、 MAC アドレスをセットして '-h hostname' を有効にする必要がありました。 そのために、スクリプトを「変更せずに」、設定ファイルを使うことにしました。 /etc/sysconfig/network-scripts/ifcfg-eth0 に、次のような記述を加えました。

DEVICE="eth0"
MACADDR="00:11:22:33:44:55"
DHCP_HOSTNAME="trigger_for_terayon"

こちらならアップグレードしても設定が残りますし、 私の知る限りでは「見通しの良い」方法です。

これで終わりです。マシンをリブートするか、 /sbin/ifup eth0 をコマンドラインで実行してください。

3.4. RedHat 5.x

RedHat 5.0+ における DHCPcd の設定はとても簡単です。 まず control-panel コマンドでコントロールパネルを起動します。

終わったら最終設定に進みましょう。

3.5. RedHat 4.x および Caldera OpenLinux 1.1/1.2

DHCPcd は RedHat の標準ディストリビューションに RPM として入っています。 ディストリビューション CD-ROM の RPMS ディレクトリにあるでしょう。 以下からダウンロードしてもいいでしょう。

ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm

次のコマンドでインストールしましょう: rpm -i dhcpcd-0.6-2.i386.rpm

あるいは自分の好きなバージョンを取ってきて、Slackware の 部分で説明したやり方でコンパイルしてもかまいません。

以下の情報は nothing から寄せられました。

静的な IP アドレスと名前を /etc/resolv.conf から取り除きました。 しかし search 行と二つの nameserver 行は残しました (なぜか私の dhcpcd は /etc/dhcpc/resolv.conf を生成してくれないので、 静的な /etc/resolv.conf を使わなければなりませんでした)。

/etc/sysconfig/network からは HOSTNAME, GATEWAY のエントリを 削除しました。その他のエントリ (NETWORKING, DOMAINNAME, GATEWAYDEV) はそのまま残しました。

/etc/sysconfig/network-scripts/ifcfg-eth0 からは IPADDR, NETMASK, NETWORK, BROADCAST のエントリを削除しました。 DEVICE と ONBOOT はそのまま残しました。 BOOTPROTO 行は BOOTPROTO=dhcp と変更しました。

ファイルをセーブし、コンピュータをリブートしましょう。

終わったら最終設定に進みましょう。

3.6. Debian

DHCPcd の deb パッケージは以下にあります。dhcpcd で始まるものを入手しましょう。

http://ftp.debian.org/debian/dists/slink/main/binary-i386/net/

あるいは Slackware のように自分でインストールしてもいいでしょう。

deb パッケージを展開するには以下のコマンドを入力します。 dpkg -i /where/ever/your/debian/packages/are/dhcpcd*deb

DHCPcd 用の設定は特に必要ないようです。理由を以下に示します。

 

debian パッケージはだいたいそうですが、dhcpcd パッケージも スタートアップスクリプトを /etc/init.d/package_name に インストールし (ここでは /etc/init.d/dhcpcd です)、 そして /etc/rc?.d/ ディレクトリに、必要なリンクを配置してくれます。

 
--Heiko Schlittermann による。 

したがって /etc/rc?.d/ ディレクトリの内容がブート時に実行されます。

インストールしてからコンピュータを再起動しない場合は、 次のコマンドによって手動でデーモンを起動してみてください。 /etc/init.d/dhcpcd start

終わったら最終設定に進みましょう。

3.7. LinuxPPC および MkLinux

以下の内容は R. Shapiro によるものです。

"1999" (R5) リリースで、Linuxppc は、ほぼ完全に RedHat 6 互換となりました。ただし一つ警告があります(下を見てください)。 それ以外の点については、 RedHat 6.x および Mandrake 6.x での説明と同じことがあてはまります。

残っている問題は、Redhat 6 が標準の DHCP クライアントとして使っている pump が、Linuxppc では安定して動作しない、というものです。 この問題に対処するには、Sergei Viznyuk のページから最新版の dhcpcd を入手してインストールし、/sbin/ifup を編集して pump の代わりに dhcpcd を使うようにする必要があります。

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
     PUMP=true
 fi

 if [ -n "$PUMP" ]; then

とある部分を、

 if [  "$BOOTPROTO" = bootp ]; then
       echo " done."
     else
       echo " failed."
       exit 1
     fi
 elif [ "$BOOTPROTO" = dhcp ]; then
     echo -n "Determining IP information for $DEVICE..."
     if /sbin/dhcpcd -d $DEVICE ; then
       if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then
           /etc/dhcpc/dhcpcd-${DEVICE}.exe
       fi

と書き換えてください。ifdown にもこれに 対応する修正が必要です。

if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then
....
fi

とある部分を

if [ "$BOOTPROTO" = bootp ]; then
fi

if [ "$BOOTPROTO" = dhcp ]; then
      if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then
              kill `cat /var/run/dhcpcd-${DEVICE}.pid`
              rm -f /var/run/dhcpcd-${DEVICE}.pid
      fi
fi

と書き換えます。

ppc で動く dhcpcd の rpm は Linuxppc 1999 に同梱されています。 もう少し新しい rpm が、 ftp://ftp.linuxppc.org/ の contrib ディレクトリにあります。Linuxppc 1999 でコンパイルできるソースは ftp://ftp.phystech.com/pub/dhcpcd-1.3.17-pl9.tar.gz から入手可能です。

3.8. 最終設定

マシンを再起動したら、ネットワークインターフェースは 設定済みになっているはずです。ifconfig コマンドを実行しましょう。

以下のような表示が出るはずです。

          lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Bcast:127.255.255.255  Mask:255.0.0.0
          UP BROADCAST LOOPBACK RUNNING  MTU:3584  Metric:1
          RX packets:302 errors:0 dropped:0 overruns:0 frame:0
          TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0

eth0      Link encap:Ethernet  HWaddr 00:20:AF:EE:05:45
          inet addr:24.128.53.102  Bcast:24.128.53.255  Mask:255.255.254.0
          ^^^^^^^^^^^^^^^^^^^^^^^
          UP BROADCAST NOTRAILERS RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24783 errors:1 dropped:1 overruns:0 frame:1
          TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96
          Interrupt:10 Base address:0x300 

inet addr のあとに通常の番号が出ていれば OK です。 0.0.0.0 が出てもがっかりしないでください、これは dhcpcd が IP アドレスを取得する前の一時的な状態です。数分経っても 0.0.0.0 のままでしたら、 トラブルシューティング をチェックしてください。 DHCPcd はデーモンですから、マシンの電源が入っている限り居座り続けます。 DHCPcd は 3 時間おきに DHCP サーバに接続し、新たな IP アドレスを 貸し出してもらおうとします。メッセージはすべて syslog に 保存されます (Slackware 系なら /var/adm/syslog, Redhat/OpenLinux なら /var/log/syslog です)。

最後にもう一つ。ネームサーバを指定しなければなりません。 これには二つのやり方があります。一つはプロバイダに、使ってもかまわない ネームサーバのアドレスを教えてもらい、それを /etc/resolv.conf に書く方法、もう一つは DHCPcd に DHCP サーバから リストを取得させ、/etc/dhcpcresolv.conf を作成させる方法です。

私は DHCPcd の resolv.conf を使うことにしました。 やり方を以下に示します。

古い /etc/resolv.conf を、 次のコマンドを実行してバックアップします。 mv /etc/resolv.conf /etc/resolv.conf.OLD

/etc/dhcpcディレクトリがなければ、次のコマンドを実行して作ります。 mkdir /etc/dhcpc

/etc/dhcpc/resolv.conf から /etc/resolv.confへのリンクを 作ります。 ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf

上記でうまくいかない場合は以下を試してください ( の指摘を受けて修正しました。また Henrik Stoerner からも改善提案を いただきました)。

この最終ステップを行わなければならなかったのは、 私の dhcpcd が /etc/dhcpc/resolv.conf を作成しなかったからでした。私は /etc/sysconfig/network-scripts/ifup に以下の修正を行いました (非常に情けないハックですが、私のところではうまく動いています)。

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE}
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^
        echo "failed."
        exit 1

これを以下のように変更しました。

elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then
    echo -n "Using DHCP for ${DEVICE}... "
    /sbin/dhcpcd
    echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh

    if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then
	^^^^^^
       echo "failed."
       exit 1

Note: 注意すべきは if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; の部分の ! (エクスクラメーション) です。

さあ、では席に戻って楽しみましょう :-)

3.9. 雑多な注意

以下のステップは本来不要ですが、役に立つ人もいるでしょう。

  1. ネットワーク接続を時々しか必要としないなら、 dhcpcd をコマンドラインから起動する事もできます (root 権限が必要です)。以下を実行します。 /usr/sbin/dhcpcd

    ネットワークを切断するときには以下を実行します。 /usr/sbin/dhcpcd -k

3.10. トラブルシューティング

これまで述べてきたステップを正しくたどってもネットワークアクセスが できない場合には、いくつかの理由が考えられます。

3.10.1. ネットワークカードが正しく設定されていない

ブートアップのプロセスで、 Linux はネットワークカードを プローブして以下のような行を出力するはずです。

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

このようなメッセージが現れない場合は、あなたの Linux システムでは Ethernet カードが認識されていません。一般的な Ethernet カード (NE2000 クローンなど) を使っている場合は、カード設定用の DOS ユーティリティの入ったディスクがあるはずです。 Linux がカードを認識するまで、IRQ を変えていってみましょう (IRQ 9, 10, 12 などなら通常は良いはずです)。

3.10.2. DHCP サーバが RFC1541 準拠である/DHCP サーバが Windows NT である

dhcpcd を、dhcpcd -r とタイプして実行してみましょう。

ifconfig を用いてネットワークインターフェースが正しく設定されたか チェックしてみましょう (設定のプロセスには数秒かかります。 最初は Inet.addr=0.0.0.0 と言ってきます)。

これで解決したら、ブートアップスクリプトにも "-r" フラグを 加えましょう。つまり /sbin/dhcpcd のかわりに /sbin/dhcpcd -r のようにしましょう。

例えば RedHat なら、 /etc/sysconfig/network-scripts/ifup スクリプトを編集して以下のようにしましょう。

        IFNAME=$[ {DEVICE} \
        "/sbin/dhcpcd -r -c /etc/"- etc etc.    

3.10.3. ブートアップの最中に "Using DHCP for eth0 ... failed" というメッセージが出るのですが、システムはうまく動いています。

おそらく RedHat をお使いで、説明を注意深くたどって来ませんでしたね :-)。 if 文の ! (エクスクラメーション) が抜けているのでしょう。 ここに戻って修正方法をチェックすること。

3.10.4. 数分はちゃんとネットワークが動作するのですが、 そのあと反応しなくなってしまいます。

gated (ゲートウェイデーモン) が Linux マシンのルーティングを 壊してしまい、このような問題を引き起こすことがあるそうです。 gated が起動していないかどうかを、次のコマンドで確認してください。 ps -auxww | grep gate

あった場合は RedHat の RPM マネージャで削除するか、 /etc/rc.d/ のエントリを削除しましょう。

3.10.5. ブートアップのときには Ethernet カードは認識されているのに、 "NO DHCPOFFER" メッセージがログに残ります。 PCMCIA の Ethernet カードなんですけど。

ネットワークカードの 10BaseT ポート (電話プラグみたいなやつです) が使われる設定になっているかを確認する必要があります。 調べるのに一番いい方法は、カードのどのコネクタが使われるように なっているのかをブートアップ時に確認することです。 以下のような表示があるはずです。

eth0: 3c509 at 0x300 tag 1, 10baseT port, address  00 20 af ee 11 11, IRQ 10.
		            ^^^^^^^^^^^^
3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov

ラップトップ型のユーザから、このような問題が PCMCIA ユーティリティ (特に ifport) のせいで生じるという報告をもらっています。 これがコネクタのタイプを 10Base2 (同軸ケーブル) に設定して しまうのです。 10BaseT になっていることを確認してください。 そうなっていなければカードを再設定してコンピュータを再起動してくださ い。

3.10.6. DHCP クライアントはブロードキャストリクエストを 出すんですが、誰も答えてくれないんです (Peter Amstutz から 寄せられました)

システムによってはリクエストの一部にホストの名前を含めなければ ならない場合があります。 dhcpcd でこれを行うには dhcpcd -h foohost とします。必要となるホスト名は、そのネットワークでのあ なたのアカウント名と一致することが多いでしょう。

3.10.7. 全部のステップをちゃんとたどったのに、私のマシンは接続できません

多くの場合、ケーブルモデムは、ネットワークカードの Ethernet アドレスを 記憶してしまいます。その場合、新しいコンピュータを接続したり ネットワークカードを交換したときには何とかしてケーブルモデムに 新しいコンピュータとカードを教えてやらなければなりません。 通常はコンピュータの電源を入れたままモデムの電源を一度切って 入れ直せばいいはずです。だめな場合はテクニカルサポートに電話して、 コンピュータのネットワークカードを交換した旨を伝えてください。

ファイアウォールのルール (ipfwadm rule) によって、 DHCP が設定情報を流すポート 67/68 がふさがれているのかもしれません。 ファイアウォールのルールを注意して調べてください。

3.10.8. MediaOne Express のサービスを使っているんですが、接続できません

MediaOne は DHCP に付加すべきでない情報を加えてしまっています。 おそらくこれはもう問題ではないのでしょうが、うまくいかない場合は これらを確認してみてください。もし幸運 (不運?) にも同じマシンに Windows NT が載っている場合は、イベントビューアを起動すると 以下のような警告が出ているはずです。

DHCP received an unknown option 067 of length 005. The raw option data is 
given  below.

0000: 62 61 73 69 63            basic

訳注: 訳者は NT を使っていませんので、 日本語版のメッセージはわかりません(^_^;

これが原因だった場合は ftp://vanbuer.ddns.org/pub/ に行ってバイナリをダウンロードするか、 ソースを入手して入れ替えてください。

3.11. もう一つの DHCP クライアント (ISC dhclient)

dhcpcd を使っても Linux で接続を確立できない場合は、 ISC dhclient を試してみるといいかもしれません。dhclient は、 ISC 由来の DHCP 配布 (クライアント・サーバ両方を同梱しています) に含まれます。 入手方法やコンパイル方法については ここを読んでください。 成功したら、この章に戻ってクライアントを設定してください。

Note: 次の情報は、dhclient の作者の一人、 Ted Lemon から寄せられました。

DHCP client の現在のバージョンでは、 dhclient.conf は必要ありません。 dhclient を、次のコマンドで起動するだけです。 /sbin/dhclient

このコマンドを実行すると、全てのブロードキャストインターフェースが設定されます。これでうまく動かなかったり、 特定のインターフェースだけを使いたいのなら、次のような設定を /etc/dhclient.conf に記述してください。

interface "eth0" {
  send dhcp-client-identifier 1:xx:xx:xx:xx:xx:xx;
  send dhcp-lease-time 86400;
}

この例では、イーサネットインターフェースは eth0 を使うものと仮定しています。 他のものを使うときは、記述もそれに合わせてください。 xx:xx:xx:xx:xx の部分も、お使いのイーサネットアドレスに合わせてください。 この dhclient.conf を使うと、Win 95 のクライアントの挙動に近いものになります。