DHCPはクライアント・サーバ型のシステムで、DHCPサーバはクライ
アントからの要求を受けて、クライアントがネットワークに接続す
る際に必要となるホストのコンフィグレーション情報(IPアドレス
やネットマスク、ホスト名など)を送ります。DHCPクライアントは
受け取った情報を元にネットワーク・インターフェイスの初期化を
行い、そのネットワークに接続する事ができます。
この時、DHCPサーバとクライアントは原則として同一ネットワーク・
セグメント上になければならないのですが、リレー・エージェント
と呼ばれる特別な中継用のサーバを用意する事で、DHCPサーバは異
なるネットワーク・セグメント上のDHCPクライアントに対してもサー
ビスを提供する事ができます。
DHCP サーバが IPアドレスを割り当てる場合、以下の3通りの割り 当て方があります。
要求のあったDHCPクライアントに対し、有効期間が無期限であるIP アドレスを割り当てます。デスクトップのような滅多に移動しない システムに対してアドレスを割り当てるような場合にこの割り当て 方を使うと良いでしょう。
基本的には「自動割り当て」と同じですが、割り当てられるIP アドレスには有効期限が設定されます。よって、ノートパソコンの ような移動ホストに対してアドレスを割り当てるような場合にこの 割り当て方を使うと良いでしょう。
事前に管理者が割り当てておいた IP アドレスを、要求を出したホ ストに対して通知する方式。主な用途はディスクレスワークステー ションのブート時にIP アドレスを割り当てるような時に用います。
ここでは FreeBSD マシンに Wide プロジェクトで作られている Wide-DHCP をインストールする際の手順を解説します。
DHCP は BPF(Berkeley Packet Filter)を使用するため、あらか じめ BPF を有効にするようカーネルの再構築をしなければなりま せん。/sys/i386/conf/configuration-file(FreeBSD(98)の場合は /sys/pc98/conf/configuration-file)に
pseudo-device bpfilter 4
の一文を追加しコンパイル、カーネルを新しい物と入れ換えておき ましょう。
FreeBSD の場合 DHCP は packages、portsで提供されているのでこ れを使うのが簡単です。自分でコンパイルする場合は、DHCPのソー ス自体が各種 BSD に対応しているので、make時に引数として OSTYPE を指定してやるだけでコンパイルできるでしょう。
# make OSTYPE=FreeBSDできたバイナリは
/usr/local/sbin
辺りに入れておきましょう。packages や ports ではデフォルトで ここにインストールされます。
DHCPが使うポートを有効にするため、/etc/services に以下の2行 を追加します。FreeBSD ではデフォルトで記述されているはずです が一応確認しておきましょう。
dhcps 67/udp dhcpc 68/udp
また、DHCP はエラー出力に syslog を使用するので以下の行を /etc/syslog.conf に追加します。
local0.* /var/log/dhcplog
起動用スクリプトとして以下の内容を、/usr/local/etc/rc.d に実 行権限を与えて、dhcps.sh というファイルに記述し作成しておき ましょう。FreeBSD ではローカルなデーモンの起動スクリプトは /etc/rc.local に記述するのではなく、/usr/local/etc/rc.d 以下 に置くと起動時に自動的に読み込まれるようになっています。他の OS では/etc/rc.local に記述しておけばいいでしょう。
#!/bin/sh if [ -f /usr/local/sbin/dhcps -a -f /etc/dhcpdb.pool -a -f /etc/dhcpdb.relay ] ; then echo 'starting DHCP server.' /usr/local/sbin/dhcps ed0 fied0 はネットワークインターフェイス名です。サーバにするマシン で使用しているネットワークデバイス名を指定して下さい。
以下に実際に割り当てるIPアドレスを定義するための記述例を挙げ ます。
# define global entry which specifies the stuff every host uses. global:!snmk=255.255.255.0:tmof=32400: # define different master entries for each subnet. . . local:tblc=global:dht1=500:dht2=850:brda=192.168.0.255: # entries for dynamic allocation 001: :ipad=192.168.0.1:hstn="hogehoge":dfll=3600:maxl=7200:tblc=local:
最初のエントリ global は広範囲な設定をするためのエントリで、
ここではサブネットマスクとグリニッジ標準時からの差分秒数を記
述しています。
次のエントリ local は管理するサブネットに共通する情報を記述し
ています。具体的には、
bool true またはfalse のどちらかの値を取る。これ らと異なる文字列を記述すると false とみなされる。 str 文字列。 octet 整数(8bit) short 整数(16bit) long 整数(32bit) ip 単一のIPアドレス iplist 複数のIPアドレスのリスト(各IPアドレスは空白で 区切る) ippairs IPアドレスの組のリスト(各IPアドレスは空白で 区切られ、2つで1組ろ扱われる) mtpt 整数(16bit)のリスト(各整数は空白で区切ら れる) clientid クライアントの識別子
名前 タイプ 内容 tblc str 別エントリへの参照 snam str DHCPメッセージのsnameフィールドを定 義(DHCPサーバのホスト名を記述可能) file str DHCPメッセージのfileフィールドを定義 (bootイメージのファイル名を記述) siad ip bootイメージを供給するtftpサーバのア ドレス albp bool trueの場合、このエントリはBOOTPクラ イアントに対して割り当ててもよいこと を示す ipad ip 割り当てるIPアドレス maxl long 許容する最大の割り当て期間を秒数で記述 dfll long デフォルトの割り当て期間 clid clientid 静的な割り当ての場合、クライアントの 識別子(MACアドレス)を記述 snmk ip 割り当てられるIPアドレスのサブネット マスク tmof long UTCからのオフセットを秒数で示す rout iplist クライアントのいるサブネット上のルー タのIPアドレスのリスト tmsv iplist timeサーバのIPアドレスのリスト nmsv iplist nameサーバのIPアドレスのリスト dnsv iplist DNSサーバのIPアドレスのリスト lgsv iplist MIT-LCS UDP logサーバのIPアドレスの リスト cksv iplist CookieサーバのIPアドレスのリスト lpsv iplist LPRサーバのIPアドレスのリスト imsv iplist Imagen Impress サーバのIPアドレスの リスト rlsv iplist Resource Location サーバのIPアドレス のリスト hstn str クライアントのホスト名 btsz short bootイメージの大きさ mdmp str クライアントがコアダンプする際のパス名 dnsd str DNSドメイン名 swsv ip swap サーバの IPアドレス rpth str クライアントの rootディスクのパス名 epth str Extensions Path ipfd bool IPフォワーディングの許可 nlsr bool non-localソース・ルーティングの許可 plcy ippairs non-localソース・ルーティングの policy フィルタ mdgs short クライアントが再構成できるように準備 すべき IPデータグラムの最大長 ditl octet IP TTL のデフォルト値 mtat long Path MTU Discovery で使用するエージ ングのタイムアウト値 mtpt mtpt Path MTU Discovery で利用する MTU テー ブル ifmt short Interface の MTU を指定 asnl bool クライアントの接続されたIPネットワー クに含まれる全てのサブネットで同じ MTU を使用するかどうかを示す brda ip クライアントの接続されたサブネットの ブロードキャスト・アドレス mskd bool ICMP によるサブネットマスクdiscovery を行なうかどうかを示す msks bool ICMP によるサブネットマスクの要求に 応えるか否か rtrd bool router discovery を利用するか否か rtsl ip router solicitation 要求の宛先IPアドレス strt ippairs 静的ルーティングの宛先、ルータのIPア ドレスの組のリスト(デフォルトルート を含めてはならない) trlr bool ARPを使う場合、trailerの利用に関する ネゴシエーションを行なうか否か arpt long ARPキャッシュのタイムアウト encp bool Ethernet Encapsulation を利用するか否か dttl octet TCP の TTL のデフォルト値 kain long クライアントの TCP が keep alive メッ セージを送る間隔 kagb bool クライアントの TCP の keep alive メッ セージにガベージ・オクテットを付加す るか否か nisd str NIS ドメイン名 nisv iplist NIS サーバの IPアドレスのリスト ntsv iplist NTP サーバの IPアドレスのリスト nnsv iplist NetBIOS ネームサーバのリスト ndsv iplist NetBIOS datagram ditribution サーバ のリスト nbnt octet NetBIOS のノードタイプ nbsc str NetBIOS の scope xfsv iplist X window system のフォントサーバのリスト xdmn iplist X window system のディスプレイマネー ジャのリスト dht1 short DHCP クライアントがユニキャストによ り割り当て期限の延長を開始する時期を 指定する(WIDE-DHCPでは、サーバが返 す割り当て期間に対する千分率で示す) dht2 short DHCP クライアントがブロードキャスト により割り当て期限の延長を開始する時 期を指定するWIDE-DHCPでは、サーバが返 す割り当て期間に対する千分率で示す)
一般に DHCP クライアントを起動するには、/etc/rc.local、 /etc/netstart などの設定ファイル中にある ifconfig を使ったネッ トワークインターフェイスの初期化や routed、gated などの経路 制御用デーモンの起動、route コマンドによる経路情報の追加など に関する記述を全てコメントアウトし、以下のようなスクリプトを /etc/rc.local や /etc/netstart などに記述します。
if [ -f /usr/local/sbin/dhcpc ] ; then echo 'starting DHCP client.' /usr/local/sbin/dhcpc ep0 fi
ep0 は使用するネットワークインターフェイスの指定です。
FreeBSD で PAO を用いて DHCP のクライアントとして利用する場 合には、/etc/sysconfig(2.2.2-RELEASE 以降では /etc/rc.conf) 内で
pccard_ether="ed0 ep0 fe0 sn0" ifconfig_common="DHCP" ifconfig_ed0=$ifconfig_common ifconfig_ep0=$ifconfig_common ifconfig_fe0=$ifconfig_common ifconfig_sn0=$ifconfig_common
と記述し、router などの設定をすべて Disable にします。
と、ここまでやれば後は実際にデーモンを立ち上げて動作確認する だけです。無事クライアントに IP アドレスが割り当てられたら自 由に他のホストとやり取りが出来るでしょう。