DCHP Option 82はdhcp relayに関する情報が格納されるフィールドです。Cisco IOSはOption 82の情報に基づいたアドレス割当を行う事もできます。
コマンド一覧
このシナリオで重要なコマンド一覧は以下の通りです。
Router(config)# ip dhcp relay information option Router(config-if)# ip dhcp relay information option subscriber-id <value> Router(config)# ip dhcp class <class_name> Router(config-dhcp-class)# relay agent information Router(config-dhcp-class-relayinfo)# relay-information hex <hex_dump> Router(config)# ip dhcp pool <pool_name> Router(dhcp-config)# network <addr> <mask> Router(dhcp-config)# class <class_name> Router(config-dhcp-pool-class)# address range <lower_addr> <higher_addr>
構成図
以下の環境で動作確認を行います。R1がDHCP server、R2がDHCP relay agent、R3がDHCP clientとします。
e0/0 e0/1 e0/0 e0/1 +--------+.1 .2+--------+.2 dhcp+--------+ | R1 +--------+ R2 +--------+ R3 | +--------+ +--------+ +--------+ 192.168.12.0/24 192.168.23.0/24 DHCP server DHCP relay DHCP client R1 Loopback0 R2 Loopback0 R3 Loopback0 10.1.1.1/32 10.2.2.2/32 10.3.3.3/32
[R1] interface Loopback0 ip address 10.1.1.1 255.255.255.255 ! interface Ethernet0/0 ip address 192.168.12.1 255.255.255.0 [R2] interface Loopback0 ip address 10.2.2.2 255.255.255.255 ! interface Ethernet0/0 ip address 192.168.23.2 255.255.255.0 ! interface Ethernet0/1 ip address 192.168.12.2 255.255.255.0
設定全文は下記ファイルです。ルーティングなどの詳細設定は下記を参照ください。
Subscriber id
仕様説明
DHCPにはOption82と呼ばれるDHCP relayに関する情報を格納するフィールドがあります。以下のコマンドを入力する事でDHCP Option82をinsertしたりremoveしたりする事ができるようになります。
Router(config)# ip dhcp relay information option
ip helper-addressコマンドでDHCP discoverを転送する事ができますが、その際に以下コマンドを併用するとsubscriber-idを付与する事ができます。
Router(config-if)# ip dhcp relay information option subscriber-id <value>
動作確認
R2において、DHCP Option82のsubscriber-idとしてVLAN23を付与します。
[R2] ip dhcp relay information option ! interface Ethernet0/0 ip helper-address 10.1.1.1 ip dhcp relay information option subscriber-id VLAN23
Option82を確認する適当なshowコマンド, debugコマンドはありませんので、packet dumpより動作確認を行います。bootpsのみのpacket dumpを出力するよう以下debugコマンドを入力します。(なお、debug ip packet dumpコマンドは入力補完が効かない隠しコマンドです。)
[R1] R1#conf t Enter configuration commands, one per line. End with CNTL/Z. R1(config)#access-list 100 permit udp any any eq bootps R1(config)#exit R1# *Mar 1 00:06:32.811: %SYS-5-CONFIG_I: Configured from console by console R1# R1#debug ip packet 100 dump IP packet debugging is on (dump) for access list 100 R1#
R3において、DHCPによるアドレス割り当てを試みます。その後、packet dumpによりOption 82に想定通りのフィールドが挿入された事を確認します。
[R3] R3(config)#int e0/1 R3(config-if)#no shut R3(config-if)# *Mar 1 00:05:46.483: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to up *Mar 1 00:05:47.483: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to up R3(config-if)#ip address dhcp R3(config-if)# [R1] R1#debug ip packet 100 dump IP packet debugging is on (dump) for access list 100 R1# *Mar 1 00:07:16.739: IP: tableid=0, s=192.168.23.2 (Ethernet0/0), d=10.1.1.1 (Loopback0), routed via RIB *Mar 1 00:07:16.743: IP: s=192.168.23.2 (Ethernet0/0), d=10.1.1.1, len 343, rcvd 4 07BB66E0: CC00 01CC0000 L..L.. 07BB66F0: CC0101CC 00010800 45000157 00040000 L..L....E..W.... 07BB6700: FE11D8E5 C0A81702 0A010101 00430043 ~.Xe@(.......C.C 07BB6710: 01434675 01010601 00001420 00008000 .CFu....... .... 07BB6720: 00000000 00000000 00000000 C0A81702 ............@(.. 07BB6730: CC0201CC 00010000 00000000 00000000 L..L............ 07BB6740: 00000000 00000000 00000000 00000000 ................ 07BB6750: 00000000 00000000 00000000 00000000 ................ 07BB6760: 00000000 00000000 00000000 00000000 ................ 07BB6770: 00000000 00000000 00000000 00000000 ................ 07BB6780: 00000000 00000000 00000000 00000000 ................ 07BB6790: 00000000 00000000 00000000 00000000 ................ 07BB67A0: 00000000 00000000 00000000 00000000 ................ 07BB67B0: 00000000 00000000 00000000 00000000 ................ 07BB67C0: 00000000 00000000 00000000 00000000 ................ 07BB67D0: 00000000 00000000 00000000 00000000 ................ 07BB67E0: 00000000 00000000 00000000 00000000 ................ 07BB67F0: 00000000 00000000 00000000 00000000 ................ 07BB6800: 63825363 35010139 0204803D 1B006369 c.Sc5..9...=..ci 07BB6810: 73636F2D 63633032 2E303163 632E3030 sco-cc02.01cc.00 07BB6820: 30312D45 74302F31 0C025233 37080106 01-Et0/1..R37... 07BB6830: 0F2C0321 962B5216 020C020A 0000C0A8 .,.!.+R.......@( 07BB6840: 17020000 00000606 564C414E 3233FF ........VLAN23.
DHCP classによるアドレス割り当て
仕様説明
DHCP Option82の各フィールドの仕様はベンダー毎プラットフォーム毎に様々です。ですので、Cisco IOSは各フィールドに対する設定ではなくOption82が指定したhex dumpに一致するかどうかを判定する設定を提供しています。以下のようなコマンドで、指定したhex dumpに一致するかどうかを判定するdhcp classを作成します。
Router(config)# ip dhcp class <class_name> Router(config-dhcp-class)# relay agent information Router(config-dhcp-class-relayinfo)# relay-information hex <hex_dump>
dhcp classに対して割り当てるIPアドレスの範囲を指定します。
Router(config)# ip dhcp pool <pool_name> Router(dhcp-config)# network <addr> <mask> Router(dhcp-config)# class <class_name> Router(config-dhcp-pool-class)# address range <lower_addr> <higher_addr>
Option 82 観察
まずはDHCP Option82の仕様を理解しましょう。以下はDHCP discoverをキャプチャした結果です。DHCPには様々はOptionがあり、各Optionは”Option”, “Length”, “Value”の順で値が格納されている事が分かります。
Frame 1: 357 bytes on wire (2856 bits), 357 bytes captured (2856 bits) Ethernet II, Src: cc:01:01:cc:00:01 (cc:01:01:cc:00:01), Dst: cc:00:01:cc:00:00 (cc:00:01:cc:00:00) Internet Protocol Version 4, Src: 192.168.23.2 (192.168.23.2), Dst: 10.1.1.1 (10.1.1.1) User Datagram Protocol, Src Port: bootps (67), Dst Port: bootps (67) Bootstrap Protocol Message type: Boot Request (1) Hardware type: Ethernet Hardware address length: 6 Hops: 1 Transaction ID: 0x000003fc Seconds elapsed: 0 Bootp flags: 0x8000 (Broadcast) Client IP address: 0.0.0.0 (0.0.0.0) Your (client) IP address: 0.0.0.0 (0.0.0.0) Next server IP address: 0.0.0.0 (0.0.0.0) Relay agent IP address: 192.168.23.2 (192.168.23.2) Client MAC address: cc:02:01:cc:00:01 (cc:02:01:cc:00:01) Client hardware address padding: 00000000000000000000 Server host name not given Boot file name not given Magic cookie: DHCP Option: (t=53,l=1) DHCP Message Type = DHCP Discover Option: (t=57,l=2) Maximum DHCP Message Size = 1152 Option: (t=61,l=27) Client identifier Option: (t=12,l=2) Host Name = "R3" Option: (t=55,l=8) Parameter Request List Option: (t=82,l=22) Agent Information Option Option: (82) Agent Information Option Length: 22 Value: 020c020a0000c0a81702000000000606564c414e3233 Agent Remote ID: 020a0000c0a8170200000000 Subscriber ID: 564c414e3233 End Option
DHCP classとしてどのようなhex dumpを設定すべきかを判断するために、packet dumpを観察します。まずは、Option82の82に相当する部分を探します。82は16進数で0x52ですので、52と書かれている部分を探します。52の次の1byteはlengthを表しますので、0x16(10進数で22)byteがOption82に格納された値と分かります。
07BB6820: 30312D45 74302F31 0C025233 37080106 01-Et0/1..R37... 07BB6830: 0F2C0321 962B5216 020C020A 0000C0A8 .,.!.+R.......@( 07BB6840: 17020000 00000606 564C414E 3233FF ........VLAN23.
field | value |
---|---|
Option | 52 |
length | 16 |
value | 020C020A0000C0A81702000000000606564C414E3233 |
動作確認
R1に以下設定を投入し、DCHP classによるアドレス割り当てを行います。
[R1] ip dhcp class OPTION82 relay agent information relay-information hex 020C020A0000C0A81702000000000606564C414E3233 ! ip dhcp pool VLAN23 network 192.168.23.0 /24 class OPTION82 address range 192.168.23.3 192.168.23.3
動作確認のため、以下debugを予め有効にしておきます。
[R1] R1#debug ip dhcp server class DHCP server class debugging is on. R1#
R3 e0/1をshut, no shutし、DHCPによるアドレス再割り当てを行います。
[R3] R3(config)#int e0/1 R3(config-if)#shut R3(config-if)#no shut *Mar 1 00:27:16.007: %LINK-5-CHANGED: Interface Ethernet0/1, changed state to administratively down *Mar 1 00:27:17.007: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to down R3(config-if)# *Mar 1 00:27:19.979: %LINK-3-UPDOWN: Interface Ethernet0/1, changed state to up *Mar 1 00:27:20.979: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/1, changed state to up *Mar 1 00:27:21.403: %DHCP-6-ADDRESS_ASSIGN: Interface Ethernet0/1 assigned DHCP address 192.168.23.3, mask 255.255.255.0, hostname R3 R3(config-if)#
デバッグメッセージおよびshowコマンドから想定通りのアドレスが割り当てられた事を確認します。
[R1] R1#debug ip dhcp server class DHCP server class debugging is on. R1# *Mar 1 00:27:41.547: DHCPD: Class 'OPTION82' matched by default *Mar 1 00:27:41.547: DHCPD: Searching for a match to 'relay-information 020c020a0000c0a81702000000000606564c414e3233' in class OPTION82 *Mar 1 00:27:41.551: DHCPD: input pattern 'relay-information 020c020a0000c0a81702000000000606564c414e3233' matches class OPTION82 *Mar 1 00:27:41.555: DHCPD: input matches class OPTION82 R1# R1# R1#show ip dhcp binding Bindings from all pools not associated with VRF: IP address Client-ID/ Lease expiration Type Hardware address/ User name 192.168.23.3 0063.6973.636f.2d63. Mar 02 2002 12:28 AM Automatic 6330.322e.3062.3063. 2e30.3030.312d.4574. 302f.31 R1#
Option82 補足説明
正確な説明をすると、Option82にはSubscriber-id以外にAgent Remote IDというフィールドも含まれています。Agent Remote IDはDHCPをrelayしたルータのMACアドレスを表します。各フィールドの値は以下の通りです。もし、Subscriber-idにのみ基づいてDHCP classを作成したいのならば、”relay-information hex 564C414E3233″として下さい。
field | value |
---|---|
Option | 52 |
length | 16 |
Agent Remote ID | 020C020A0000C0A8170200000000 |
Subscriber-id | 564C414E3233 |