はじめに
複数の VLAN を持つ社内ネットワークでは、DHCP サーバーを VLAN ごとに置かず、1 台のサーバーへ集約する構成が一般的です。このとき、クライアントとサーバーが別のサブネットに分かれるため、通常のルーティングだけでは初回のアドレス取得が成立しません。この中継を担うのが DHCP リレーです。
実務では「VLAN 間の通信は問題ないのに、その VLAN の端末だけ IP アドレスを取得できない」という形で表面化します。原因を切り分けるには、リレーが何を中継し、サーバーがどの情報を手掛かりにアドレスを選ぶかを押さえておく必要があります。
- 別 VLAN のサーバーからアドレスを取得できない理由
- リレーが中継する内容と、サーバーがスコープを選ぶ手掛かり
ip helper-addressをどのインターフェースに設定するか- サーバー側に必要なスコープと戻り経路の準備
- 設定後に何をどの順で確認すれば動作したと判断できるか
結論として、クライアント側の L3 インターフェースへ ip helper-address を設定すると、リレーがクライアントのブロードキャストを受け取り、ユニキャストでサーバーへ中継します。サーバーはリレーが書き込んだ giaddr を手掛かりに、クライアント側サブネットのスコープを選びます。VLAN 間のルーティングができていることと、DHCP の初回取得ができることは別の条件です。
本記事は IPv4 の DHCP(DHCPv4)を対象とし、設定例は Cisco Catalyst 9300(IOS XE 17.15.x)の SVI を使う構成で統一します。初回取得の 4 メッセージ(Discover、Offer、Request、ACK)そのものの説明は最小限にとどめ、リレーが加わることで経路と情報がどう変わるかを中心に扱います。
DHCP リレーが必要になる理由
リレーが必要になる理由は、初回の要求がブロードキャストで送られることにあります。まず、なぜルーティングだけでは届かないのかを整理します。
初回の DHCPDISCOVER は別サブネットへ転送されない
IP アドレスを持たない端末は、宛先を 255.255.255.255 としたブロードキャストで DHCPDISCOVER を送ります。ルーターや L3 スイッチは、このブロードキャストを別のサブネットへそのまま転送しません。転送してしまうと、すべてのブロードキャストがネットワーク全体へ広がるためです。
その結果、DHCP サーバーが別 VLAN にある場合、要求はクライアントと同じ VLAN の中で止まります。サーバーは要求を受け取っていないため、応答もありません。端末側から見ると、設定は正しいのに取得できない状態になります。
VLAN 間通信ができることと、初回取得ができることは別
切り分けで混乱しやすいのがこの点です。VLAN 間のルーティングが動作していれば、アドレスを持つ端末同士はサブネットをまたいで通信できます。しかし、それはユニキャストの話です。アドレスを持たない端末が送るブロードキャストは、その経路に乗りません。
つまり、サーバー VLAN へ ping が通る状態であっても、初回取得が成立するとは限りません。ブロードキャストをユニキャストへ変換してサーバーへ届ける役割が、別に必要になります。それが DHCP リレーです。
- DHCP リレー
-
クライアントとサーバーが同じサブネットにない場合に、両者の間で DHCP のメッセージを中継する L3 機器の機能です。受け取ったメッセージをもとに新しいメッセージを作り、出力側のインターフェースへ送り出します。アドレスの割り当て自体は行いません。
- DHCP サーバー
-
スコープから実際にアドレスを選び、配布情報とともに応答する役割です。リレーを経由した要求に対しても、割り当てを決めるのはサーバー側です。
本記事で使う構成例
クライアント VLAN を 2 つ用意し、DHCP サーバーをサーバー VLAN へ置いた構成を使います。L3 スイッチ SW1(Catalyst 9300)が各 VLAN の SVI を持ち、デフォルトゲートウェイとリレーの両方を担います。実機で検証した構成ではなく、説明のために用意した構成です。
| 用途 | サブネット | ゲートウェイ(SW1 の SVI) | 配布範囲・固定アドレス |
|---|---|---|---|
| クライアント VLAN 10 | 192.168.10.0/24 | 192.168.10.1 | 192.168.10.100〜199 |
| クライアント VLAN 20 | 192.168.20.0/24 | 192.168.20.1 | 192.168.20.100〜199 |
| サーバー VLAN 100 | 192.168.100.0/24 | 192.168.100.1 | DHCP サーバー: 192.168.100.2 |
DNS サーバーは 192.168.10.53 とし、両方のクライアント VLAN から SW1 のルーティング経由で到達できる前提にします。なお、DHCP サーバーのアドレスは 192.168.10.2 ではなく 192.168.100.2 です。同一 VLAN 内にサーバーを置いていた構成から、サーバーだけを別セグメントへ移した形になります。

同一 VLAN 内にサーバーを置く構成では、ゲートウェイの役割をルーターが担う例もあります。本記事では L3 スイッチの SVI に統一しているため、ゲートウェイのアドレスはいずれも SW1 のものです。
リレーを経由したアドレス取得の流れ
リレーが入ると、クライアントとサーバーの間が 2 つの区間に分かれます。区間ごとに送信方法と宛先が変わるため、どこを見ているのかを意識して読み進めます。
VLAN 10 の PC-A が、送信元 0.0.0.0、宛先 255.255.255.255 のブロードキャストで DHCPDISCOVER を送ります。宛先は DHCP サーバー用のポート(UDP 67)です。この区間にサーバーはいませんが、同じ VLAN にいる SW1 の SVI がこれを受け取ります。
SW1 は受け取った内容をもとに新しいメッセージを作り、ip helper-address で指定した 192.168.100.2 へユニキャストで送ります。このとき、要求を受け取ったインターフェースのアドレス(192.168.10.1)を giaddr に書き込みます。ここでブロードキャストからユニキャストへ変わるため、通常のルーティングでサーバーまで届きます。
サーバーは giaddr に対応するスコープからアドレスを選び、応答を giaddr のアドレス宛てに返します。宛先は DHCP サーバー用のポートです。このため、サーバーからクライアント側サブネットへの戻り経路がないと、応答はリレーに届きません。
SW1 は応答を受け取り、要求を受けた VLAN 10 側へ送り出します。宛先は DHCP クライアント用のポート(UDP 68)です。クライアントがまだユニキャストを受け取れない状態であることを示していれば、ブロードキャストで送られます。Request と ACK も同じ経路をたどります。


giaddr がスコープ選択の手掛かりになる
リレーを使う構成で中心になるのが giaddr です。サーバーから見ると、要求はリレーから届くため、そのままではクライアントがどのサブネットにいるか分かりません。サーバーは giaddr の値を手掛かりに、割り当てるアドレスを選びます。
参考: RFC 2131(Dynamic Host Configuration Protocol)
“the address of the relay agent that forwarded the message (‘giaddr’ when not 0)”
(giaddr が 0 でない場合は、メッセージを転送したリレーのアドレスに基づいて選択します。)
https://www.rfc-editor.org/rfc/rfc2131
giaddr は、リレーが要求を受け取ったインターフェースのアドレスです。構成例では VLAN 10 からの要求なら 192.168.10.1 になります。サーバーはこの値が 192.168.10.0/24 に含まれることから、そのサブネットのスコープを使います。
VLAN 10 と VLAN 20 で配られるアドレスが変わる理由
同じ 192.168.100.2 が応答していても、要求がどの SVI を通ったかによって giaddr が変わります。その結果、選ばれるスコープも変わります。
| 項目 | VLAN 10 からの要求 | VLAN 20 からの要求 |
|---|---|---|
| 要求を受け取る SVI | Vlan10 | Vlan20 |
| giaddr | 192.168.10.1 | 192.168.20.1 |
| サーバーが使うスコープ | 192.168.10.0/24 | 192.168.20.0/24 |
| 割り当てられるアドレスの例 | 192.168.10.100 | 192.168.20.100 |
| 配布するデフォルトゲートウェイ | 192.168.10.1 | 192.168.20.1 |
| 配布する DNS サーバー | 192.168.10.53 | 192.168.10.53 |
1 台のサーバーで複数サブネットへ配布できるのは、この仕組みによるものです。逆に言えば、VLAN を増やしたときにスコープを追加し忘れると、その VLAN だけ取得できない状態になります。
giaddr と混同しやすい 3 つの値
構成例では giaddr と配布するゲートウェイが同じ 192.168.10.1 になるため、同じものと理解されがちです。実際には設定項目も役割も異なります。
| 値 | 誰が決めるか | 何を表すか | 構成例での値 |
|---|---|---|---|
| giaddr | リレー | 要求を受け取ったリレー側インターフェースのアドレス | 192.168.10.1 |
| 配布するデフォルトゲートウェイ | サーバーのスコープ設定 | クライアントが別サブネット宛てに使う転送先 | 192.168.10.1 |
| DHCP Server Identifier | サーバー | 応答したサーバー自身のアドレス | 192.168.100.2 |
| IP ヘッダーの送信元アドレス | 各区間の送信機器 | そのパケットを実際に送り出した機器のアドレス | 区間ごとに異なる |
ゲートウェイを冗長化していて、クライアントに配る値が SVI の実アドレスではなく仮想アドレスになる構成では、giaddr と配布するゲートウェイは別の値になります。値が一致するのは構成例の条件によるもので、常に同じになるわけではありません。
更新時の要求はリレーを経由するとは限らない
すでにアドレスを持つ端末がリース期間の途中で更新を試みる場合、要求は割り当て元のサーバーへユニキャストで送られます。このときはブロードキャストではないため、通常のルーティングでサーバーまで届きます。リレーの中継が前提になるのは、宛先を特定できない初回取得などの場面です。
この違いを押さえておくと、「取得はできないが、すでに取得済みの端末は問題なく使えている」という状況を理解しやすくなります。リース時間や更新タイミングの考え方は本記事では扱いません。
Cisco Catalyst 9300 での設定
設定そのものは 1 行ですが、入れる場所を誤ると動作しません。前提となる設定とあわせて確認します。
成立に必要な前提
- クライアント VLAN とサーバー VLAN が作成されている
- クライアントを接続するポートが、対象の VLAN に所属している
- 各 VLAN の SVI にアドレスが設定され、有効になっている
ip routingが有効で、VLAN 間のルーティングができている- リレー機能を含む
service dhcpが有効になっている
ip helper-address はクライアント側の SVI に設定する
設定先は、クライアントに最も近い L3 インターフェースです。構成例では interface Vlan10 と interface Vlan20 が該当します。
参考: Cisco IP Addressing Services Configuration Guide, IOS XE 17.15.x(Catalyst 9300)
“configure the command on the Layer 3 interface closest to the client”
(クライアントに最も近いレイヤー 3 インターフェースへ設定します。)
https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst9300/software/release/17-15/configuration_guide/ip/b_1715_ip_9300_cg/configuring_dhcp.html
! VLAN の作成
SW1(config)# vlan 10
SW1(config-vlan)# name CLIENT-VLAN10
SW1(config-vlan)# exit
SW1(config)# vlan 20
SW1(config-vlan)# name CLIENT-VLAN20
SW1(config-vlan)# exit
SW1(config)# vlan 100
SW1(config-vlan)# name SERVER-VLAN100
SW1(config-vlan)# exit
! VLAN 間ルーティングの有効化
SW1(config)# ip routing
! クライアント側 SVI(ここにリレー先を設定する)
SW1(config)# interface Vlan10
SW1(config-if)# ip address 192.168.10.1 255.255.255.0
SW1(config-if)# ip helper-address 192.168.100.2
SW1(config-if)# exit
SW1(config)# interface Vlan20
SW1(config-if)# ip address 192.168.20.1 255.255.255.0
SW1(config-if)# ip helper-address 192.168.100.2
SW1(config-if)# exit
! サーバー側 SVI(helper-address は設定しない)
SW1(config)# interface Vlan100
SW1(config-if)# ip address 192.168.100.1 255.255.255.0
SW1(config-if)# exit
! クライアント接続ポートの VLAN 所属
SW1(config)# interface GigabitEthernet1/0/1
SW1(config-if)# switchport mode access
SW1(config-if)# switchport access vlan 10
SW1(config-if)# exitDHCP サーバーを複数台用意する場合は、同じインターフェースにサーバーの数だけ ip helper-address を並べて設定できます。
設定場所を間違えやすい箇所
クライアントのブロードキャストを受け取るのは、そのクライアントと同じ VLAN の SVI です。設定先はクライアント側の SVI であり、サーバー側 SVI やアクセスポートではありません。
| 設定場所 | 結果 | 理由 |
|---|---|---|
| クライアント側 SVI(Vlan10、Vlan20) | 中継される | クライアントのブロードキャストを受け取る L3 インターフェースのため |
| サーバー側 SVI(Vlan100) | 中継されない | クライアントの要求が届かない VLAN のため |
| L2 のアクセスポート | 設定対象外 | L3 インターフェースではないため |
helper-address は DHCP 以外の UDP にも影響する
ip helper-address を設定すると、DHCP で使うポート以外にも、既定で転送対象となる UDP ポートがあります。公式資料では、Time(37)、IEN-116 Name Service(42)、TACACS(49)、DNS(53)、BOOTP のクライアントとサーバー(67、68)、TFTP(69)、NetBIOS Name Server(137)、NetBIOS Datagram Server(138)が既定の転送対象として挙げられています(IP Addressing Configuration Guide, Cisco IOS XE 17.x)。
不要な転送を抑えたい場合は、no ip forward-protocol udp <port> をグローバル設定で指定して個別に無効化します。DHCP だけを目的に helper-address を設定した場合でも、他のブロードキャストが中継される可能性がある点は把握しておくことをおすすめします。
service dhcp は DHCP サーバー機能とリレー機能の両方を有効にする設定で、既定で有効です。リレー装置でサーバー機能を使わないという理由で no service dhcp を入れると、リレーも動作しなくなります。
サーバー側に必要な準備
リレーの設定だけでは配布は成立しません。サーバー側に、クライアント VLAN ごとのスコープと、応答を返すための経路が必要です。
| 準備する項目 | 構成例での値 | 役割 |
|---|---|---|
| VLAN 10 用スコープ | 192.168.10.100〜199 | giaddr が 192.168.10.1 の要求に使う |
| VLAN 20 用スコープ | 192.168.20.100〜199 | giaddr が 192.168.20.1 の要求に使う |
| 各スコープで配るゲートウェイ | 192.168.10.1/192.168.20.1 | クライアントが別サブネット宛てに使う |
| 各スコープで配る DNS サーバー | 192.168.10.53 | クライアントの名前解決の問い合わせ先 |
| サーバー自身のアドレス | 192.168.100.2/24 | 応答の送信元になる |
| サーバー自身のデフォルトゲートウェイ | 192.168.100.1 | クライアント側サブネットへ応答を戻すための経路 |
混同しやすいのは最後の 2 行です。192.168.100.1 はサーバー自身が使う経路であり、クライアントへ配る値ではありません。クライアントへ配るのは、そのクライアントがいるサブネットのゲートウェイです。この 2 つを取り違えると、スコープの設定は正しく見えても、クライアントが外部へ通信できない状態になります。
戻り経路は、サーバーから 192.168.10.0/24 と 192.168.20.0/24 へ到達できることが条件です。構成例のようにサーバーのデフォルトゲートウェイが SW1 であれば、その経路で戻れます。サーバーが別のルーターを既定の経路にしている環境では、クライアント側サブネット向けの経路を個別に確認します。
サーバー側を Cisco 機器で構成する場合のプール作成、除外設定、固定割り当ての手順は、『Cisco ルーター DHCP サーバー設定|固定 IP 割り当ての落とし穴と対処』で扱っています。
動作確認と、うまく動かないときの確認点
確認は、リレー装置側からクライアント側へ順に進めます。どの段階まで正常かが分かると、調べる範囲を絞れます。
show vlan brief でクライアント接続ポートの VLAN 所属を、show ip interface brief で SVI のアドレスと状態を確認します。対象の SVI が up で、想定したアドレスが設定されていれば、この段階は正常です。
show ip interface Vlan10 で、Helper address としてサーバーのアドレスが表示されるかを確認します。表示されなければ、設定が別のインターフェースへ入っている可能性があります。
SW1 から ping 192.168.100.2 source Vlan10 のように、クライアント側 SVI を送信元にして到達性を確認します。あわせて、サーバー側からクライアント側サブネットへ戻れるかも確認します。ここで分かるのは IP の到達性までです。
クライアント VLAN ごとのスコープが有効で、残りのアドレスがあるかを確認します。割り当ての記録はサーバー側にあるため、リレー装置でこれを確認することはできません。Cisco 機器をサーバーにしている場合は、そのサーバー機器で show ip dhcp binding を実行します(コマンドの詳細は『Cisco ルーター DHCP サーバー設定|固定 IP 割り当ての落とし穴と対処』を参照)。
Windows 端末で ipconfig /all を実行し、IP アドレス、サブネットマスク、デフォルトゲートウェイ、DNS サーバーが構成例の設計値と一致するかを確認します。DHCP サーバーの欄には、リレーではなく応答したサーバーのアドレスが表示されます。
確認時の表示例
次の表示は、構成例に合わせて作成した説明用のものです。実機で取得したログではありません。表示形式は機種やバージョンによって異なります。
SW1# show ip interface brief | include Vlan
Vlan10 192.168.10.1 YES manual up up
Vlan20 192.168.20.1 YES manual up up
Vlan100 192.168.100.1 YES manual up up
SW1# show ip interface Vlan10 | include Helper
Helper address is 192.168.100.2 DHCP 有効 . . . . . . . . . . . . : はい
IPv4 アドレス . . . . . . . . . . : 192.168.10.100(優先)
サブネット マスク . . . . . . . . : 255.255.255.0
デフォルト ゲートウェイ . . . . . : 192.168.10.1
DHCP サーバー . . . . . . . . . . : 192.168.100.2
DNS サーバー . . . . . . . . . . : 192.168.10.53クライアント側の表示で確認したいのは、アドレスが VLAN 10 の配布範囲に入っていること、ゲートウェイが 192.168.10.1 であること、DHCP サーバーが 192.168.100.2 になっていることの 3 点です。最後の 1 点は、別セグメントのサーバーから配布されたことを示します。
ping の成功だけでは判断できない
ping が通ることは IP の到達性の確認であり、DHCP が動作している証拠ではありません。到達性があっても、スコープが不足していれば配布されませんし、経路上で UDP 67 が遮断されていれば要求も応答も届きません。
同様に、クライアントがアドレスを取得できたことも、目的の通信ができることまでは保証しません。取得後は、配布された値が設計どおりか、そのゲートウェイや DNS サーバーへ到達できるかを分けて確認します。
キャプチャで giaddr を確認する
どこまで届いているか判断できない場合は、サーバー側でキャプチャを取得し、dhcp でフィルターして要求が到達しているかを確認します。到達していれば、Relay agent IP address(giaddr)の値から、どの VLAN からの要求かを判別できます。
要求が届いているのに応答がない場合はサーバー側の設定を、要求自体が届いていない場合はリレーの設定と経路を疑う、という切り分けになります。
うまく動かないときの確認点
| 確認箇所 | 起きやすい状態 | 確認方法 |
|---|---|---|
| helper-address の設定場所 | サーバー側 SVI や別の VLAN に設定している | クライアント側 SVI の設定を確認する |
| VLAN と SVI | ポートの VLAN 所属違い、SVI が down、ip routing が無効 | VLAN 所属と SVI の状態、ルーティングの有効化を確認する |
| スコープ | 対象サブネットのスコープがない、枯渇、除外設定の誤り | サーバー側でスコープの有無と残数を確認する |
| 戻り経路 | サーバーからクライアント側サブネットへの経路がない | サーバーのルーティング設定とリレー宛ての到達性を確認する |
| ACL・ファイアウォール | UDP 67 の往復が遮断されている | 経路上の ACL とサーバーのホストファイアウォールを確認する |
DHCP Snooping や Option 82 が入っている環境
すでに DHCP Snooping を導入している環境では、信頼するポートの設定や、リレーが付与する情報の扱いによってメッセージが破棄される場合があります。該当する環境では、これらの設定もあわせて確認します。
Option 82 は、リレーが要求へ付与する追加情報です。すべてのリレー構成で必要になる設定ではありません。
参考: RFC 3046(DHCP Relay Agent Information Option)
“SHOULD be configurable, and SHOULD be disabled by default.”
(設定で切り替えられるようにし、既定では無効とすることが推奨されます。)
https://www.rfc-editor.org/rfc/rfc3046
Catalyst 9300 の公式ガイドでも、Option 82 の挿入は DHCP Snooping を有効にした環境での機能として説明されています。基本的なリレー構成を組む段階では、まず helper-address とスコープの対応を確認し、Option 82 は必要になった時点で扱う方法をおすすめします。
まとめ
DHCP リレーは、クライアントのブロードキャストをユニキャストへ変換してサーバーへ中継する機能です。サーバーはリレーが書き込んだ giaddr からクライアント側サブネットを判断するため、1 台のサーバーで複数の VLAN へ配布できます。設定は 1 行でも、成立にはクライアント側 SVI、スコープ、戻り経路の 3 つがそろっている必要があります。
- 初回の要求はブロードキャストのため別サブネットへ届かない
- VLAN 間通信の可否と初回取得の可否は別の条件
- リレーは中継役で、割り当てを決めるのはサーバー
- giaddr を手掛かりにクライアント側のスコープが選ばれる
- ip helper-address はクライアント側の L3 インターフェースへ設定
- サーバー側はスコープと戻り経路の両方を準備
- ping の成功は到達性の確認で、配布の確認にはならない
以上、最後までお読みいただきありがとうございました。


