はじめに
本記事は構成図内にいる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加入プロセスについて
記事内の「ワイヤレス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の場合は若干違うとかあると思いますが、そこは各自で調整してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
[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など、お気に入りのエディタを使ってください。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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 |
編集後、中身を見てみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
[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」を実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
[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アドレスを払い出します。
リース状況を見る
1 2 3 4 5 6 |
[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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[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サーバは払い出す対象のアドレスを決定するわけです。なるほど、賢いですね。