## DHCP mini-HOWTO

Vladimir
Vuksan

                   vuksan@veus.hr

保英
大森
日本語翻訳

                   dasen@icntv.ne.jp

v4.12
October 22, 2000
vv

この文書は、Linux マシンを DHCP サーバや DHCP クライアントにする方法について、基本的な質問に答えるものです。

## はじめに

### よくある免責条件

No liability for the contents of this documents can be accepted. Use the concepts, examples and other content at your own risk. As this is a new edition of this document, there may be errors and inaccuracies, that may of course be damaging to your system. Proceed with caution, and although this is highly unlikely, I don't take any responsibility for that.

この文書の内容に関しては一切無保証です。 概念・例・その他全て読者の責任のもとにご利用ください。 現在の版は新しいので、間違いや不正確な部分があるかもしれません。 それによってあなたのシステムに障害が起きるかもしれません。 気をつけて作業してください。あまりそういうことはないとは 思いますが、私はそのような障害に対して一切責任を負いません。

Also bear in mind that this is NOT official information. Much content in this document are assumptions, which appear to work for people. Use the information at your own risk.

また、これはオフィシャルな情報ではないことも心にとめておいてください。この文書の内容はある意味仮定です (ただし多くの人々の環境で動作してはいます)。 情報はあなたの責任のもとにご利用ください。

### この文書の最新版

この文書の最新版は次に掲げるリンクから入手可能です。

http://www.oswg.org/oswg-nightly/DHCP.html

DHCP mini-HOWTO の翻訳版は次に掲げるリンクから入手可能です。

- 中国語 - http://www.linux.org.tw/CLDP/mini/DHCP.html

- 日本語 - http://www.linux.or.jp/JF/JFdocs/DHCP/index.html

- スペイン語 - ftp://cuates.pue.upaep.mx/pub/linux/LuCAS/DHCP-mini-Como/

この文書の他の言語への翻訳は自由とします。 ただこのオリジナル文書へ戻るリンクをその翻訳中に示していただくこと、および翻訳版の URL をお知らせくださること、 をお願いしたいと思います。 後者はこの文書に翻訳へのリンクを追加できるようにするためです。

### フィードバック

この文書に関するフィードバックはもちろん大歓迎です。 あなたの協力と情報提供がなければ、この文書は存続できません。 追記・コメント・批判などを vuksan-feedback@veus.hr まで送ってください。

訳注: 日本語訳に関するコメントは ここを読んで送ってください。

### 貢献者

この文書は Paul Makeev によるオリジナル版を修正してできたものです。

訳注: 日本語訳に関しては、中野＠成蹊大さんの翻訳を、 大森保英が DocBook 版 v4.12 に追従させてできたものです。

以下の方々がこの mini-HOWTO に貢献してくださいました。

- Heiko Schlittermann

- Jonathan Smith

- Dan Khabaza

- Hal Sadofsky

- Henrik Stoerner

- Paul Rossington

- numerous others

### 著作権に関する情報

This document is copyrighted (c) 1998 Vladimir Vuksan and distributed under the terms of the OpenContent License (OPL). Full text of the license can be found at

http://www.opencontent.org/opl.shtml

この文書の著作権は (c)1998 Vladimir Vuksan にあり、 the OpenContent License (OPL) に基づいて配布できます。 ライセンス文書の全文は、上掲のリンクから利用可能です。

訳注: 日本語訳の著作権は (c)1999 Takeo Nakano, (c)2001 Yasuhide OOMORI にあります。 再配布の条件は上記オリジナルに準じるものとします。

## DHCP プロトコル

DHCP とは Dynamic Host Configuration Protocol のことです。 これはホスト (動作中のクライアント) に与えられるネットワークのパラメータを、サーバを利用して動的に制御するために用いられます。 DHCP は BOOTP に対して後方互換 (backward compatible) です。 より詳しい情報は RFC 2131 (以前は RFC 1541 でした) などを見てください。

訳注: RFC の国内ミラーサイトとしては、

- ftp://ftp.ring.gr.jp/pub/doc/RFC/rfc2131.txt

- ftp://ftp.ring.gr.jp/pub/doc/RFC/rfc1541.txt

があります。

http://web.syr.edu/~jmwobus/comfaqs/dhcp.faq.html も参考になるでしょう。

この mini-HOWTO は DHCP 「サーバ」デーモンと DHCP 「クライアント」デーモンの両方を扱います。多くの人が必要としているのはクライアントデーモンでしょう。これはワークステーションがリモートサーバからネットワークの情報を取得するために用いられます。サーバデーモンはシステム管理者がネットワークの情報をクライアントに配布するために用いられます。ですから、普通のユーザが必要としているのは「クライアント」デーモンのはずです。

## クライアントの設定

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

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

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

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

- ftp://ftp.phystech.com/pub/ (Primary site)

- http://www.cps.msu.edu/~dunham/out/

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

### Slackware

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

- ftp://metalab.unc.edu/pub/Linux/system/network/daemons

- ftp://ftp.phystech.com/pub/ (Primary site)

- ftp://ftp.kobe-u.ac.jp/pub/PC-UNIX/Linux/network/dhcp/ (Primary site in Japan)

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

- 展開します。

  `tar -zxvf dhcpcd-1.3.18pl1.tar.gz`

- ディレクトリに入って dhcpcd を make します。

  `cd dhcpcd-1.3.18pl1`

  `make`

- インストールします (以下のコマンドは root で実行する必要があります)

  `make install`

/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

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

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

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

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

- "Network Configuration" を選びます。

- Click on Interfaces

- Add をクリックします。

- Ethernet を選びます。

- Edit Ethernet/Bus Interface から "Activate interface at boot time" を選び、"Interface configuration protocol" として "DHCP" を選びます。

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

Alexander Stevenson alexander.stevenson@home.com による追加情報を以下に示します。

> 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` をコマンドラインで実行してください。

### RedHat 5.x

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

- "Network Configuration" を選びます。

- Click on Interfaces

- Add をクリックします。

- Ethernet を選びます。

- Edit Ethernet/Bus Interface から "Activate interface at boot time" を選び、"Interface configuration protocol" として "DHCP" を選びます。

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

### 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`

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

以下の情報は nothing nothing@cc.gatech.edu から寄せられました。

> 静的な 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 と変更しました。

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

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

### 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 用の設定は特に必要ないようです。理由を以下に示します。

> Heiko Schlittermann heiko@os.inf.tu-dresden.de による。

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

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

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

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

### LinuxPPC および MkLinux

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

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

残っている問題は、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 から入手可能です。

### 最終設定

マシンを再起動したら、ネットワークインターフェースは 設定済みになっているはずです。`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/dhcpc` に `resolv.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`

上記でうまくいかない場合は以下を試してください ( nothing@cc.gatech.edu の指摘を受けて修正しました。また 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

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

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

### 雑多な注意

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

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

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

### トラブルシューティング

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

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

ブートアップのプロセスで、 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 などなら通常は良いはずです)。

#### 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.

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

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

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

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

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

#### ブートアップのときには 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 になっていることを確認してください。 そうなっていなければカードを再設定してコンピュータを再起動してくださ い。

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

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

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

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

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

#### 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/ に行ってバイナリをダウンロードするか、 ソースを入手して入れ替えてください。

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

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

次の情報は、dhclient の作者の一人、 Ted Lemon mellon@isc.org から寄せられました。

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 のクライアントの挙動に近いものになります。

## DHCP サーバのセットアップ

### UNIX 用の DHCP サーバ

U*X ライク OS 用の DHCP サーバはいくつか存在します。 商用のものもフリーのものもあります。フリーの DHCP サーバの中で よく使われているものは Paul Vixie の ISC DHCPd でしょう。 現在の最新版は 2.0 (ほとんどのユーザはこちらが良いでしょう) ですが、 3.0 もβテストの段階です。 次に掲げるリンクから入手可能です。

ftp://ftp.isc.org/isc/dhcp/

バイナリパッケージが収録されているディストリビューションもあります。 それを使う場合は、次のセクションは飛ばしてください。

ダウンロードしたら展開します。 展開したら、配布ソースのディレクトリに cd して、 `./configure` を実行します。

設定にはしばらく時間がかかるでしょう。終わったら、 `make` と `make install` を実行します。

### DHCP サーバの設定

インストールが終わったら、 `ifconfig -a` と入力してください。 以下のような表示が出るはずです。

    eth0      Link encap:10Mbps Ethernet  HWaddr 00:C0:4F:D3:C4:62
              inet addr:183.217.19.43  Bcast:183.217.19.255  Mask:255.255.255.0
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:2875542 errors:0 dropped:0 overruns:0
              TX packets:218647 errors:0 dropped:0 overruns:0
              Interrupt:11 Base address:0x210

MULTICAST という文字が現れない場合はカーネルを設定しなおして multicast のサポートを追加する必要があります。ほとんどのシステムでは これは不要でしょう。

次に行うことは 255.255.255.255 への経路の追加です。 DHCPd の README から引用します。

> 「dhcpd を細かいことにうるさい DHCP クライアント (例えば Windows 95 のものなど) と正しく動作させるには、dhcpd は destination address が 255.255.255.255 の IP パケットを送ることができるようになっている必要があります。残念ながら Linux は 255.255.255.255 をローカルなサブネットのブロードキャスト (ここでは 192.5.5.223) に変換してしまうのです。 この結果は DHCP プロトコルに違反することになります。 たいていの DHCP クライアントはこれに気がつきませんが、 気がつくもの (例えば Microsoft の DHCP クライアントは全てそうです) もあります。 後者の様なクライアントはサーバからの DHCPOFFER メッセージを受信する事ができないのです。」

次のように入力しましょう。 `route add -host 255.255.255.255 dev eth0`

もしも "`255.255.255.255: Unknown host`" のようなメッセージが出力された場合は、 次のようなエントリを `/etc/hosts` ファイルに追加する必要があります。

    255.255.255.255 all-ones

追加したら

    route add -host all-ones dev eth0

あるいは

    route add 255.255.255.0 dev eth0

としてください。 もちろん `eth0` は使おうとしている ネットワークデバイス名です。異なる場合は適宜変更してください。

### DHCPd のオプション

ここで DHCPd を設定しなければなりません。 `/etc/dhcpd.conf` を編集 (なければ作成) します。KDE ( http://www.kde.org/ ) には、kcmdhcpd という、GUI による dhcpd の設定ツールがあります。Windows NT の DHCP コンフィグレータに極めてよく似ています。

KDE 2.0 がリリースされれば、kcmdhcpd もリリースされるはずです。 次に掲げるリンクからも入手できます。

ftp://ftp.us.kde.org/pub/kde/unstable/apps/network/

訳注: 現時点で KDE-2.0.1 がリリースされていますが、 kdenetwork-2.0.1 には kcmdhcpd は含まれていません。

直接 DHCPd を設定したければ、以下の指示に従ってください。

たいていの人がやりたいと思うのは IP アドレスをランダムに割り当てることでしょう。 これには以下のような設定を用います。

    # Sample /etc/dhcpd.conf
    # (add your comments here)
    default-lease-time 600;
    max-lease-time 7200;
    option subnet-mask 255.255.255.0;
    option broadcast-address 192.168.1.255;
    option routers 192.168.1.254;
    option domain-name-servers 192.168.1.1, 192.168.1.2;
    option domain-name "mydomain.org";

    subnet 192.168.1.0 netmask 255.255.255.0 {
       range 192.168.1.10 192.168.1.100;
       range 192.168.1.150 192.168.1.200;
    }

こうすると DHCP サーバがクライアントに与える IP アドレスは 192.168.1.10-192.168.1.100 または 192.168.1.150-192.168.1.200 の範囲となります。特にクライアントからの時間枠の要求がなければ、 600 秒の間 IP アドレスが貸し出されます。要求があった場合に最大限許される貸し出し時間は 7200 秒です。またサーバはクライアントに 255.255.255.0 をサブネットマスクとして用い、 192.168.1.255 をブロードキャストアドレスとして用い、 192.168.1.254 をゲートウェイとして用い、 192.168.1.1 か 192.168.1.2 を DNS サーバとして用いるように 「アドバイス」します。

Windows クライアントに WINS サーバを教えてあげる必要がある場合は、 `netbios-name-servers` オプションを書く必要があります。 具体例を以下に示します。

    option netbios-name-servers 192.168.1.1;

特定の IP アドレスをクライアントの Ethernet アドレスに応じて 割り当てることもできます。

    host haagen {
       hardware ethernet 08:00:2b:4c:59:23;
       fixed-address 192.168.1.222;
    }

このようにすると IP アドレス 192.168.1.222 が Ethernet アドレス 08:00:2b:4c:59:23 を持ったクライアントに 割り当てられます。

これらを適当に混ぜる事もできます。つまり特定のクライアントには静的な IP アドレスを与え (サーバなど)、他には動的な IP を与える (ラップトップユーザなど) ことができます。 他にもたくさんのオプションがあります。 nis サーバのアドレスを与えたり、タイムサーバを教えたり、などです。これらが必要な場合は `dhcpd.conf` のマニュアルページを読んでください。

### サーバを起動する

サーバを起動する前に一つだけやっておかねばならないことがあります。 多くの場合、DHCP サーバをインストールしても `dhcpd.leases` ファイルが作成されません。 このファイルは、現在の IP アドレス貸し出しに関する情報を保存するためにDHCPd が使うものです。プレインテキストの形式なので、 DHCPd を操作している間に見ることができます。 `dhcpd.leases` を作成するには、次のようにします。

    touch /var/state/dhcp/dhcpd.leases

これで空のファイル(ファイルサイズ = 0)が作成されます。 dhcpd 2.0 以前のバージョンの中には、 `/etc/dhcpd.leases` を使うものがありました。 貸し出し情報ファイルを編集する必要はありません。 DHCPCd が自動的に操作します。 「ファイルが存在します」というようなメッセージを受けたとしても、 無視して次に進んで構いません。

いよいよ DHCP サーバを起動できます。単に以下のように入力 するだけです (あるいはブートアップスクリプトに書きます)。

    /usr/sbin/dhcpd

このコマンドは、DHCP サーバを eth0 デバイスに対して起動します。 他のデバイスで起動したければ、 単にそのデバイス名をコマンドラインで渡してください。 具体例を以下に示します。

    /usr/sbin/dhcpd eth1

ちゃんと動作しているかどうかを確かめたい場合は、 まずデバッグモードをオンにしてサーバをフォアグラウンドで 実行してみましょう。以下のようにします。

    /usr/sbin/dhcpd -d -f

そしてどれかクライアントを一つブートしてみて、 サーバのコンソールを確認しましょう。 たくさんのデバッグメッセージが現れるはずです。 全てがうまくいっているようなら、完了です :-) dhcpd を終了して `-d` `-f` オプション無しで起動しましょう。 ブート時に dhcpd を起動したいのであれば、 例えば次のファイルに dhcpd を追加するといいでしょう。

    /etc/rc.d/rc.local

### その他の興味深い文書

Linux Magazine (訳注: 日本のものではありません) の2000年4月号には、非常によい記事が掲載されています。 ネットワークの楽園 (Nirvana)：ネットワークの設定を DHCP 並に簡単にする方法 という題名で、DHCP のセットアップについて述べられています。

## 日本語訳について

日本語訳は Linux Japanese FAQ Project が行いました． 翻訳に関するご意見は JF プロジェクト <JF@linux.or.jp> 宛に連絡してください．

改訂履歴を以下に示します．

v4.12j, Sun Feb 4 2001
  翻訳:

    大森保英 <dasen@icntv.ne.jp>

  校正:

    - 早川仁さん

    - 中野＠成蹊大さん

    - 川崎貴彦さん

    - その他の JF メンバーの方々