【Cisco】CCNP学習 WLC+APの検証環境構築_01_DHCPサーバ構築

CiscoIOS

はじめに

本記事は構成図内にいるDHCP01の構築を行います。DHCPサーバの構築の前にオプションについて書いたのですが、あれこれ書いているうちに長くなってしまいました。興味があれば是非お付き合いください。

なお、今回の記事は下記の記事の一部となっています。他の機器の設定については、おおもとの記事にリンクを載せているので、参照ください。

WLCとAPとDHCP オプション 43について 

CCNPを勉強していると出てくる「DHCP オプション 43」について。結論から先に言うと、はじめてネットワークに参加したAPがWLCの宛先を知るための仕組みです。なので、APをスタンドアロンではなくて、WLCで集中管理することを想定した設定です。

せっかくなので、本記事ではDHCPについても触れながら、このDHCP オプション 43について書こうと思います。

DHCPの通信のフロー

DHCPは「Dynamic Host Configuration Protocol」の略で、動的にIPを割り当ててくれる便利なプロトコルです。よくある例としては、PCをネットワークに参加させるためにL2スイッチに接続した際、PC側の設定と接続先がDHCP設定が整えておけば、PC利用者はIPアドレスの概念なんて知らなくてもPCを使えます。以下のような流れでIPアドレスを取得します。

①DHCPサーバの探索:DHCP DISCOVER (クライアントからサーバ宛にブロードキャスト
②IPアドレスの提案: DHCP OFFER (サーバからクライアントへユニキャスト
③提案に対する要求:DHCP REQUEST (クライアントからサーバ宛にブロードキャスト
④要求の承認:DHCP ACK (クライアントからサーバ宛にユニキャスト

個人的に③がブロードキャストというのは面白いなーと思いました。ユニキャストでいいじゃん?と思うのですが、DHCPサーバが複数いた時に、クライアントがどのDHCPサーバからIPアドレスをもらうかを、他のDHCPサーバに伝える意味もあるとどこかで見た気がします。奥深いね。

DHCPでネットワーク参加した後の話

では、本題。APの電源を入れるためにPoESWへ接続したときのことを考えます。APも同様に、PoESWに接続してDHCPでIPを取得できたとします。ただし、AP自体にSSIDをはじめとした設定が何も入っていないので、DHCPでIPが設定されていても、APとして機能するにはまだまだ足りないのです。

APにログインして設定しても良いですが、今回はWLCで一括管理をしようとしています。できれば「APにログイン」するといったことをいちいちすることなく、WLCと接続してくれると嬉しいわけです。

DHCP オプション 43という選択肢

WLCを見つけるためにどのような方法があるか。APがWLCを見つけるために、DNS設定(=CISCO-CAPWAP-CONTROLLER.localdomainを名前解決した結果をWLCのIPにする)を予め設定しておく方法や、スタティックに設定(=APに直接設定を入れる)する方法があります。その中に、「DHCP オプション 43」があります。DHCPサーバの設定に「WLCのIPはこれだ!」と書いて、IPアドレスの取得と同時に、WLCのIPアドレスも通知する仕組みです。どんな書きっぷりかは、実際のconfigを見てください。

※参考Catalyst 9800 WLCでのAP加入プロセスについて

Catalyst 9800 WLCでのAP加入プロセスについて
このドキュメントでは、Cisco Catalyst 9800 WLCを使用したAP加入プロセスについて詳しく説明します。

記事内の「ワイヤレスLANコントローラの検出方法」 に記載されています。

存在意義はあるのか?

とはいえ、「DHCP オプション 43」は普段使わないので、ナレッジも多くないです。また、DHCPはIPアドレスの割り当てがランダムだから、APに付与するIPアドレスをそもそも固定にしたほうが良いんじゃない?とも考えてしまいます。手動でAPのIPアドレスを設定することになれば、WLCへのIPアドレス設定もスタティックで良さそうです。実際の構築では、手堅くスタティックで入れているような気がします。

ただ、様々なシチュエーションが世の中にはあると思っていて、全国で展開していたり、現場にいつでもネットワークに明るい人がいてくれるわけでもないのです。APが遠くの現場で壊れてしまい、予備機だけがそこにあるとしましょう。ケーブルをつないで電源がONになって、何もしなくてもWLCから操作出来たら、便利ですよね。現場にいる人は何もしなくても良いですからね。そう考えると、存在意義はあるのかもいしれないです。APのIPアドレスを固定にしたければ、DHCPサーバ側で制御してあげればいいのですから。

ふと、そんなことを考えました。長くなりました。DHCPサーバ構築の話をしましょう。

構成図

構築

インストール

構築までに色々と困難はありましたが、順を追って記載します。まずはdhcpdをインストールします。「 dnf install -y dhcp-server」を実行します。Ubuntuの場合は若干違うとかあると思いますが、そこは各自で調整してください。

[root@dhcp01 ~]# dnf install -y dhcp-server
Last metadata expiration check: 3:56:46 ago on Thu Mar 27 05:15:19 2025.
Dependencies resolved.
================================================================================
 Package            Architecture  Version                   Repository     Size
================================================================================
Installing:
 dhcp-server        x86_64        12:4.4.2-19.b1.el9        baseos        1.2 M
Installing dependencies:
 dhcp-common        noarch        12:4.4.2-19.b1.el9        baseos        128 k

Transaction Summary
================================================================================
Install  2 Packages

Total download size: 1.3 M
Installed size: 4.2 M
Downloading Packages:
(1/2): dhcp-common-4.4.2-19.b1.el9.noarch.rpm   635 kB/s | 128 kB     00:00
(2/2): dhcp-server-4.4.2-19.b1.el9.x86_64.rpm   2.4 MB/s | 1.2 MB     00:00
--------------------------------------------------------------------------------
Total                                           253 kB/s | 1.3 MB     00:05
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Installing       : dhcp-common-12:4.4.2-19.b1.el9.noarch                  1/2
  Running scriptlet: dhcp-server-12:4.4.2-19.b1.el9.x86_64                  2/2
  Installing       : dhcp-server-12:4.4.2-19.b1.el9.x86_64                  2/2
  Running scriptlet: dhcp-server-12:4.4.2-19.b1.el9.x86_64                  2/2
  Verifying        : dhcp-common-12:4.4.2-19.b1.el9.noarch                  1/2
  Verifying        : dhcp-server-12:4.4.2-19.b1.el9.x86_64                  2/2

Installed:
  dhcp-common-12:4.4.2-19.b1.el9.noarch  dhcp-server-12:4.4.2-19.b1.el9.x86_64

Complete!

confの編集

インストール後、/etc/dhcp/に移動して、dhcpd.conf を編集します。※編集前のお決まりということで、元ファイルを事前にコピーしています。編集はviなど、お気に入りのエディタを使ってください。

[root@dhcp01 ~]# cd /etc/dhcp/
[root@dhcp01 dhcp]# ll
total 8
drwxr-xr-x. 2 root root  23 May 13  2023 dhclient.d
-rw-r--r--  1 root root 123 Sep 27  2023 dhcpd.conf
-rw-r--r--  1 root root 126 Sep 27  2023 dhcpd6.conf
[root@dhcp01 dhcp]# cp -p dhcpd.conf{,.org}
[root@dhcp01 dhcp]# ll
total 12
drwxr-xr-x. 2 root root  23 May 13  2023 dhclient.d
-rw-r--r--  1 root root 123 Sep 27  2023 dhcpd.conf
-rw-r--r--  1 root root 123 Sep 27  2023 dhcpd.conf.org
-rw-r--r--  1 root root 126 Sep 27  2023 dhcpd6.conf

編集後、中身を見てみます。

[root@dhcp01 dhcpd]# cat /etc/dhcp/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp-server/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
option space CiscoAP;
option CiscoAP.server-address code 241 = ip-address;

class "CiscoAP" {
  match if substring (option vendor-class-identifier, 0, 8) = "Cisco AP";
  option vendor-class-identifier "Cisco AP";
  vendor-option-space CiscoAP;
  option CiscoAP.server-address 10.0.1.1;
}

subnet 10.0.0.0 netmask 255.255.255.0 {
    range 10.0.0.10 10.0.0.250;
    option routers 10.0.0.254;
    option subnet-mask 255.255.255.0;
    option domain-name "example.com";
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    default-lease-time 600;
    max-lease-time 7200;
}
subnet 10.0.1.0 netmask 255.255.255.0 {
    range 10.0.1.10 10.0.1.250;
    option routers 10.0.1.254;
    option subnet-mask 255.255.255.0;
    option domain-name "example.com";
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    default-lease-time 600;
    max-lease-time 7200;
}

}

単純にDHCPでIPを払い出したいだけであれば、「class “CiscoAP” {….}」の部分は不要です。今回は検証ということで、「DHCP Option 43」 の設定も入れています。Option 43は、序盤に記載した通り、APにWLCへの宛先を通知するための設定です。

「subnet 10.0.0.0 netmask 255.255.255.0 {….}」の部分で10.0.0.0/24の払い出し設定を書いています。

細かい部分は記載の通りで、「range」で払い出し範囲を指定しています。
option routers」でクライアントのデフォルトゲートウェイのIPを指定し、「subnet-mask」で文字の通りサブネットマスクを指定します。
option domain-name」はドメインを指定しています。ドメイン環境であればこの設定は必須ですが、今回は全くないので、適用な文字列が入っています。
domain-name-servers」はDNSサーバを指定していて、「default-lease-time」と「max-lease-time」でリース時間を指定します。

起動

起動コマンド「systemctl start dhcpd」を実行します。

[root@dhcp01 dhcpd]# systemctl start dhcpd
[root@dhcp01 dhcpd]# systemctl status dhcpd
● dhcpd.service - DHCPv4 Server Daemon
     Loaded: loaded (/usr/lib/systemd/system/dhcpd.service; enabled; preset: di>
     Active: active (running) since Sat 2025-04-05 23:06:14 JST; 5s ago
       Docs: man:dhcpd(8)
             man:dhcpd.conf(5)
   Main PID: 2745042 (dhcpd)
     Status: "Dispatching packets..."
      Tasks: 1 (limit: 22588)
     Memory: 5.0M
        CPU: 25ms
     CGroup: /system.slice/dhcpd.service
             mq2745042 /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf -user dhcpd >

Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Source compiled to use binary-leases
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Wrote 0 class decls to leases file.
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Wrote 0 deleted host decls to leases fil>
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Wrote 0 new dynamic host decls to leases>
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Wrote 0 leases to leases file.
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Listening on LPF/enp0s25/ec:21:e5:9f:90:>
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Sending on   LPF/enp0s25/ec:21:e5:9f:90:>
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Sending on   Socket/fallback/fallback-net
Apr 05 23:06:14 dhcp01 dhcpd[2745042]: Server starting service.
Apr 05 23:06:14 dhcp01 systemd[1]: Started DHCPv4 Server Daemon.
lines 1-23/23 (END)

問題なく起動すれば、DHCPサーバとしてリクエストを受け入れ、IPアドレスを払い出します。

リース状況を見る

[root@dhcp01 ~]# cd /var/lib/dhcpd/
[root@dhcp01 dhcpd]# ll
total 12
-rw-r--r-- 1 dhcpd dhcpd 3364 Apr  5 23:00 dhcpd.leases
-rw-r--r-- 1 dhcpd dhcpd 4142 Apr  5 22:31 dhcpd.leases~
-rw-r--r-- 1 dhcpd dhcpd    0 Sep 27  2023 dhcpd6.leases

[root@dhcp01 dhcpd]# cat dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.4.2b1

# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;

server-duid "\000\001\000\001/\203\365V\354!\345\237\220'";

lease 10.0.0.10 {
  starts 6 2025/04/05 14:09:44;
  ends 6 2025/04/05 14:19:44;
  cltt 6 2025/04/05 14:09:44;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet 00:f8:2c:21:63:11;
  uid "\111\111\370, b\000";
  set vendor-class-identifier = "Cisco AP c1830";
  client-hostname "AP00F8-2C20-6200";
}

DHCPの素朴な疑問

今回のDHCPの検証で疑問に思ったことをメモしておきます。

疑問① 複数のルータがあるときのリレーはどうする?

ブロードキャストがルータを超えられないので、ルータの先にあるDHCPサーバに向けたリクエストは、RTやL3SWといったルーティング機能を持った機器が代理でDHCPサーバに問い合わせしてくれます。この代理で問い合わせを行う機器を「DHCPリレーエージェント」と呼びます。

前置きが長くなりましたが、「PC —- RT01 —- RT02 —- DHCPサーバ」という構成を考えます。このとき、RT01とRT02という二つの機器がありますね。このとき、リレー設定はどう設定するか?という疑問です。

RT01のみ?RT02のみ?RT01とRT02の両方?答えはRT01のみです。ヒントはリレーエージェントがDHCPサーバにユニキャストするんですね。なので、RT02はブロードキャストを受けないので、リレーする必要がないです。リレーの目的はブロードキャストをユニキャストに変えると考えれば、自ずと答えが出ます。

疑問② リレーしたときの払い出しIPは、何で判断するの?

上の話に付随して「リレーされたパケットから、DHCPサーバってどうやってアドレスを見分けてるんだ?」と思いました。今回の構成も、RT01が「10.0.0.0/24」と「10.0.2.0/24」のDHCPリレーエージェントとなりますが、DHCPサーバから見ると送信元のIPアドレスは10.0.1.254になるので、どちらのIPアドレス帯を払い出すのか分からない気がしました。

少し調べたところ、「giaddr (Gateway IP Address)」というDHCPのフレーム内の情報をもとにDHCPサーバは判断するようです。ブロードキャストを受けリレーエージェントが、ブロードキャストからユニキャストに変換するときに、giaddrに払い出すセグメント情報を入れることで、DHCPサーバは払い出す対象のアドレスを決定するわけです。なるほど、賢いですね。