DHCP クライアントが DHCP サーバーからIPアドレスを取得する時には、最初に DHCPDISCOVER メッセージ ( DHCP クライアントが DHCP サーバーを発見するためのメッセージ) を送出します。
DHCP クライアントは、DHCP サーバーのIPアドレスもMACアドレスも知らないので、このメッセージはブロードキャストで行われます。しかし、ブロードキャストである DHCP パケットはルータを超えることができません。では、次の構成図のように、ルータを挟んだネットワーク上にある DHCP クライアントにIPアドレスの割り当てを行いたい場合どうすればいいでしょうか?
もっとも簡単なのは、PC-A や PC-B があるネットワークセグメントに DHCP サーバーを移動させることですね。
しかし、もし PC が DHCP サーバーのあるネットワークセグメントにもあった場合どうすればいいでしょうか?
これは両方のネットワークセグメントに DHCP サーバーをそれぞれ設置すれば簡単に解決します。
しかし、DHCP サーバーを1台だけにしたい場合は DHCP リレーエージェントを使用します。
前のシナリオで行った通り、この構成の場合は、中央のルータで DHCP サーバーを設定すれば DHCP リレーエージェントは必要ありません。しかし、次の図のようにルータが2台あり、1台のルータだけに DHCP サーバーを設定する場合は DHCP リレーエージェントが必要です。
想定するネットワーク構成図
・RT-B を DHCP サーバーとして構成し、RT-A は PC-A、PC-B と DHCP サーバー (RT-B) のセグメントを分けるルータとして使用する。
ラボ・シナリオで使用するネットワーク構成図
・物理 PC の VirtualBox 上に、PC-A、PC-B、PC-C、PC-D の4つの仮想 PC を構成する。
・PC-A、PC-B は物理 PC に標準搭載している LAN ポートを使用するように VirtualBox を設定する。
・物理 PC に USB-LAN 変換ケーブルを2つ接続し、PC-C と PC-D でそれぞれを使用するように VirtualBox を設定する。
・物理 PC の全ての LAN ポートのプロパティで、
[VirtualBox Bridged Networking Driver] 以外の全てのチェックを外す。
まず、DHCP リレーエージェントを構成しない場合、ルータを挟んだネットワーク上にある PC にIPアドレスが割り当てられないことを確認します。
- RT-A をネットワーク構成図に示す通り設定し、適切なスタティックルートを構成しなさい。
< RT-A >
Router# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)# host RT-A
RT-A(config)# int f0/0
RT-A(config-if)# ip add 172.16.1.1 255.255.255.0
RT-A(config-if)# no shut
RT-A(config-if)# int s0/0/0
RT-A(config-if)# ip add 172.16.2.1 255.255.255.0
RT-A(config-if)# clock rate 64000
RT-A(config-if)# no shut
RT-A(config-if)# ip route 172.16.3.0 255.255.255.0 172.16.2.2
RT-A(config)# ip route 172.16.4.0 255.255.255.0 172.16.2.2
RT-A(config)# ^Z
RT-A#
- RT-B をネットワーク構成図に示す通り設定し、適切なスタティックルートを構成しなさい。
< RT-B >
Router# conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)# host RT-B
RT-B(config)# int s0/0/0
RT-B(config-if)# ip add 172.16.2.2 255.255.255.0
RT-B(config-if)# no shut
RT-B(config-if)# int f0/0
RT-B(config-if)# ip add 172.16.3.1 255.255.255.0
RT-B(config-if)# no shut
RT-B(config-if)# int f0/1
RT-B(config-if)# ip add 172.16.4.1 255.255.255.0
RT-B(config-if)# no shut
RT-B(config-if)# ip route 172.16.1.0 255.255.255.0 172.16.2.1
RT-B(config)#
- 以下の情報を基に RT-B で DHCP サーバーを構成しなさい。
< RT-B >
RT-B(config)# ip dhcp excluded-address 172.16.1.1 ← 除外アドレス
RT-B(config)# ip dhcp pool RT-A-F0/0 ← 1つ目の DHCP アドレスプールの設定
RT-B(dhcp-config)# network 172.16.1.0 255.255.255.0
RT-B(dhcp-config)# default-router 172.16.1.1
RT-B(dhcp-config)# domain-name jukenki.local
RT-B(dhcp-config)# dns-server 8.8.8.8
RT-B(dhcp-config)# lease 3
RT-B(dhcp-config)# ip dhcp pool RT-B-F0/0 ← 2つ目の DHCP アドレスプールの設定
RT-B(dhcp-config)# network 172.16.3.0 255.255.255.0
RT-B(dhcp-config)# default-router 172.16.3.1
RT-B(dhcp-config)# domain-name jukenki.local
RT-B(dhcp-config)# dns-server 8.8.8.8
RT-B(dhcp-config)# lease 1 12
RT-B(dhcp-config)# ip dhcp pool RT-B-F0/1 ← 2つ目の DHCP アドレスプールの設定
RT-B(dhcp-config)# network 172.16.4.0 255.255.255.0
RT-B(dhcp-config)# default-router 172.16.4.1
RT-B(dhcp-config)# domain-name jukenki.local
RT-B(dhcp-config)# dns-server 8.8.8.8
RT-B(dhcp-config)# lease 0 6 30
RT-B(dhcp-config)# end
RT-B#
DHCP サーバーを構成している RT-B のインターフェイスに設定されているIPアドレスはアドレスプールから自動的に除外されますが、DHCP サーバーではない RT-A のインターフェイスに設定されているIPアドレスは自動的には除外されませんので、除外アドレスとして設定します。
ただし、実際には、ルータのコンフリクト検出機能で 172.16.1.1 は使用済みであることが検出されますので、除外アドレスに設定しなくてもこのアドレスを DHCP クライアントに割り当てることはありません。しかし、通常は不要なパケットを抑えるために予め除外アドレスとして設定します。
■ 172.16.1.1を除外アドレスに設定していない場合
debug ip dhcp server packet コマンドを実行することで確認できます。
DHCP サーバーは、プールアドレスの中の 172.16.1.1 を DHCP クライアントに提供する前に ping を使って、ネットワーク内で 172.16.1.1 が使われていないかどうか確認します。
172.16.1.1 が使われていると確認すると、次のIPアドレスである 172.16.1.2 を ping を使って使用済みかどうか確認します。使用済みでないとわかると、
DHCP クライアントに 172.16.1.2 の提供の申し出を行います。
RT-B# debug ip dhcp server packet
DHCP server packet debugging is on.
(略)
Sep 11 21:12:05.766: %DHCPD-4-PING_CONFLICT: DHCP address conflict: server pinged 172.16.1.1.
Sep 11 21:12:05.766: DHCPD: Allocate an address without class information (172.16.1.0)
Sep 11 21:12:07.770: DHCPD: Sending DHCPOFFER to client 0100.9f31.0a00.00 (172.16.1.2).
また show ip dhcp conflict コマンドでも conflict を検出したことを確認できます。
RT-B# sh ip dhcp conflict
IP address Detection method Detection time VRF
172.16.1.1 ping Sep 14 2013 08:46 PM
※ ping により 172.16.1.1 の conflict を検出
ただし、これは RT-B で ip dhcp excluded-address 172.16.1.1 コマンドを実行していない場合ですので、このシナリオ通りの設定では 172.16.1.1 の conflict は発生しません。
- RT-C を DHCP クライアントに設定し、取得したIPアドレスを確認しなさい。
< RT-C >
C:\> netsh interface ipv4 set address "イーサネット" dhcp
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .: jukenki.local
IPv4 アドレス . . . . . . . . . . . .: 172.16.3.2
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 172.16.3.1
C:\>
PC-C にはIPアドレス 172.16.3.2 が割り当てられています。
- RT-D を DHCP クライアントに設定し、取得したIPアドレスを確認しなさい。
< RT-D >
C:\> netsh interface ipv4 set address "イーサネット" dhcp
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .: jukenki.local
IPv4 アドレス . . . . . . . . . . . .: 172.16.4.2
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 172.16.4.1
C:\>
RT-D にはIPアドレス 172.16.4.2 が割り当てられました。
- PC-A を DHCP クライアントに設定し、取得したIPアドレスを確認しなさい。
< PC-A >
C:\> netsh interface ipv4 set address "イーサネット" dhcp
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 0.0.0.0
サブネット マスク . . . . . . . . . .: 0.0.0.0
デフォルト ゲートウェイ . . . . . . .:
C:\>
PC-C、PC-D にはIPアドレスが割り当てられていますが、PC-A にはIPアドレスは割り当てられていません。
※ もしくは APIPA 機能により、リンクローカルアドレス 169.254.0.0/16 が割り当てられています。
APIPA は DHCP サーバーからアドレスを取得できなかった時に、リンクローカルアドレスを勝手に割り当てる機能です。
ブロードキャストである DHCPDISCOVER メッセージはルータを超えることはできません。
そのため、PC-A から送信された DHCPDISCOVER メッセージが DHCP サーバーである RT-B に届くことはありません。
この DHCP パケットを、ルータを超えて転送するために使用するのが DHCP リレーエージェントです。
DHCP リレーエージェントは、PC-A からブロードキャストで送られてきた DHCP メッセージを受け取り、それをユニキャストに変換して DHCP サーバーに転送します。こうすれば、ブロードキャストである DHCP メッセージもルータを超えることができます。ただし、このためには、あらかじめ DHCP サーバーのIPアドレスを RT-A に登録しておく必要があります。
- RT-A の F0/0 でDHCPリレーエージェントを構成しなさい。
< RT-A >
RT-A# conf t
Enter configuration commands, one per line. End with CNTL/Z.
RT-A(config)# int f0/0
RT-A(config-if)# ip helper-address 172.16.2.2
RT-A(config-if)# ^Z
RT-A#
Cisco ルータで DHCP リレーエージェントを有効にするには、ブロードキャストである DHCP パケットを受け取るインターフェイスで次のコマンドを実行します。
ip helper-address [転送先 (DHCP サーバー) のIPアドレス]
これを設定したインターフェイスで、ブロードキャストパケットを受信すると、そのパケットの宛先を転送先IPアドレスに変更して (ユニキャストパケットに変えて) 、転送先IPアドレスを持つ機器 (DHCP サーバー) 向けにパケットを転送します。
ip helper-addressを設定すると、DHCPパケットだけでなく、他のUDPブロードキャストパケットもユニキャストパケットに変換されて転送されます。転送されるUDPブロードキャストパケットには、デフォルトで以下のものがあります。
ポート番号 | サービス名 | 説明 |
37 | time | 時刻サービス |
42 | nameserver | ホストネームサーバー (Windows関連) |
49 | tacacs | TACACS |
53 | domain | DNS |
67 | bootps | BOOTP/ DHCP サーバー |
68 | bootpc | BOOTP/ DHCP クライアント |
69 | tftp | TFTP |
137 | netbios-ns | NetBIOSネームサービス (Windows関連) |
138 | netbios-dgm | NetBIOSデータグラムサービス (Windows関連) |
もし不要なブロードキャストパケットの転送を防ぎたい時は、no ip forward protocol コマンドを使います。
Router(config)# no ip forward-protocol udp tftp
- PC-A で ipconfig /renew を実行しなさい。
< PC-A >
C:\> ipconfig /renw
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .: jukenki.local
IPv4 アドレス . . . . . . . . . . . .: 172.16.1.2
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 172.16.1.1
C:\>
PC-A にもIPアドレスが割り当てられました。
- PC-B を DHCP クライアントに設定し、ipconfig を実行しなさい。
< PC-B >
C:\> netsh interface ipv4 set address "イーサネット" dhcp
C:\> ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .: jukenki.local
IPv4 アドレス . . . . . . . . . . . .: 172.16.1.3
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 172.16.1.1
C:\>
- RT-B で、show ip dhcp binding コマンドを実行しなさい。
< RT-B >
RT-B# sh ip dhcp binding
Bindings from all pools not associated with VRF:
IP address Client-ID/ Lease expiration Type
Hardware address/
User name
172.16.1.2 0100.9f31.0a00.00 Jan 18 2014 05:15 PM Automatic
172.16.1.3 0100.9f31.0b00.00 Jan 18 2014 05:16 PM Automatic
172.16.3.2 0100.9f31.0c00.00 Jan 17 2014 05:11 AM Automatic
172.16.4.2 0100.9f31.0d00.00 Jan 15 2014 11:41 PM Automatic
RT-B#
4台の PC へIPアドレスが割り当てられています。