こんにちは、フルスタックエンジニアのryuです。
今回の記事では、DHCPリレーの仕組みと設定方法を解説します。
DHCPサーバーとクライアントが同じネットワークにいれば、基本的にDHCPリレーは必要ありません。しかし、VLANやサブネットを分けると、クライアントのブロードキャストがDHCPサーバーまで届かなくなります。
この問題を解決するのがDHCPリレーです。
この記事では、DHCPのDORA、giaddr、CiscoルーターやL3スイッチのip helper-address、Linuxのdhcrelayまで順番に解説します。
DHCPリレーとは?¶
今回の記事では、DHCPリレーの概要と設定方法について解説します。DHCPリレーとは、異なるネットワークにあるDHCPサーバーに通信を中継する技術です。
DHCPクライアントは、IPアドレスを取得する前には自分のネットワーク情報を持っていません。
そのため、最初の問い合わせをブロードキャストで送信しますが、ルーターは通常、そのブロードキャストを別ネットワークへ転送しません。
DHCPリレーが必要になる構成¶
たとえば、次のような構成を考えます。
| 機器・ネットワーク | 設定例 |
|---|---|
| クライアント用VLAN | 192.168.10.0/24 |
| クライアント側ゲートウェイ | 192.168.10.1 |
| DHCPサーバー | 192.168.1.10 |
| DHCPサーバー側ネットワーク | 192.168.1.0/24 |
クライアントはVLAN 10へ接続されていますが、DHCPサーバーは別のネットワークにあります。
このままでは、クライアントが送信したDHCPDISCOVERをDHCPサーバーが受信できません。
そこで、クライアント側のデフォルトゲートウェイとなるルーターやL3スイッチへDHCPリレーを設定します。
DHCPの通信の仕組み¶
DHCPリレーを理解するには、クライアントがIPアドレスを取得する流れを知る必要があります。
DHCPの代表的な通信は、頭文字を取ってDORAと呼ばれます。
| 順番 | メッセージ | 内容 |
|---|---|---|
| 1 | DHCPDISCOVER | クライアントがDHCPサーバーを探す |
| 2 | DHCPOFFER | DHCPサーバーが利用可能なIPを提案する |
| 3 | DHCPREQUEST | クライアントが使用したいIPを要求する |
| 4 | DHCPACK | DHCPサーバーが割り当てを確定する |
DHCPの通信の仕組み¶
DHCPサーバーは、クライアントへIPアドレスを自動で配布します。
クライアントはネットワークに接続したら、ブロードキャストでDHCPに問い合わせを行います。ブロードキャストで問い合わせを行うということは、同一ネットワーク全てに通信を行うということです。
しかし、異なるネットワークにDHCPサーバーが存在する場合、クライアントからの問い合わせのブロードキャストが届かないという問題があります。
この問題を解決するのがDHCPリレーです。
クライアントからDHCPサーバーに問い合わせするイメージは以下のような感じです。
DHCPサーバーへの問い合わせを「DHCP DISCOVER」と言います。DHCPサーバーとクライアントの通信の詳しい内容はこちらの記事で解説しています。
DHCPでは、クライアントからサーバーへの通信にUDP 67番、サーバーからクライアントへの通信にUDP 68番が使われます。
ファイアウォールを設定している場合は、単にpingが通るかだけではなく、DHCP通信が許可されているかも確認しましょう。
DHCPリレーはDHCPの通信を中継する仕組み¶
DHCPリレーは、ブロードキャストで通信が届かない異なるネットワークに存在するサーバーへ中継するための設定です。
クライアントと同一ネットワークにあるルーターやサーバーへDHCPリレーの設定を行います。中継先のDHPCサーバーを指定することで、DHCPリレーは異なるネットワークのサーバーへ通信を行うことができます。

DHCPリレーが中継するときの動作¶
DHCPリレーは、クライアントから受信したブロードキャストを、そのまま別ネットワークへばらまくわけではありません。
DHCPサーバーのIPアドレスを宛先にして、通常はユニキャストで転送します。
giaddrでクライアント側のネットワークを伝える¶
DHCPリレーは、DHCPメッセージのgiaddrというフィールドへ、自分のクライアント側インターフェースのIPアドレスを設定します。
今回の例なら、192.168.10.1です。
DHCPサーバーはgiaddrを確認し、どのサブネット用のアドレスプールからIPを払い出せばよいか判断します。
そのため、DHCPサーバー側にはクライアントネットワーク用のスコープが必要です。
subnet 192.168.10.0 netmask 255.255.255.0 {
range 192.168.10.100 192.168.10.200;
option routers 192.168.10.1;
}
リレーを設定しても、DHCPサーバーに192.168.10.0/24用のスコープがなければ、適切なIPアドレスを返せません。
DHCPサーバーからの応答もリレーが戻す¶
DHCPサーバーは、giaddrに記録されたDHCPリレーへDHCPOFFERやDHCPACKを返します。
DHCPリレーは、その応答をクライアントが存在するネットワークへ転送します。
この流れによって、クライアントとDHCPサーバーが異なるネットワークにあっても、IPアドレスを取得できます。
DHCPリレーの設定方法¶
ここからは、DHPリレーの設定方法について解説します。DHCPリレーはRouterやサーバーで設定することができます。どちらも簡単に設定することができます。
実務では、クライアントのデフォルトゲートウェイになっているルーターやL3スイッチへ設定する構成が一般的です。
Linuxサーバーを中継機として使うこともできますが、使用するソフトウェアの保守状況まで確認しましょう。
RouterでDHCPリレーを設定する方法¶
まず、RouterでDHCPリレーを設定する方法についてです。DHCPリレーはRouterやL3スイッチなどのデフォルトゲートウェイとなるネットワーク機器に設定します。
Cisco IOSやIOS XEでは、クライアント側インターフェースへip helper-addressを設定します。
Ciscoの設定例¶
今回の例では、VLAN 10のゲートウェイが192.168.10.1、DHCPサーバーが192.168.1.10です。
Router> enable
Router# configure terminal
Router(config)# interface GigabitEthernet0/1
Router(config-if)# ip address 192.168.10.1 255.255.255.0
Router(config-if)# ip helper-address 192.168.1.10
Router(config-if)# no shutdown
Router(config-if)# end
L3スイッチのSVIへ設定する場合は、次のようになります。
Switch(config)# interface vlan 10
Switch(config-if)# ip address 192.168.10.1 255.255.255.0
Switch(config-if)# ip helper-address 192.168.1.10
Switch(config-if)# no shutdown
ip helper-addressは、DHCPクライアントからブロードキャストを受け取る側のインターフェースへ設定します。
DHCPサーバーへ接続している側のインターフェースへ設定するものではありません。
設定時の注意点¶
Cisco IOSでは通常DHCPサービスが有効ですが、過去にno service dhcpが設定されている場合はリレーが動作しません。
また、ip helper-addressはDHCP以外の一部UDPブロードキャストも転送するため、既存環境ではip forward-protocol udpの設定も確認してください。
CiscoでDHCPリレーを確認する方法¶
設定後は、running-config、インターフェース、DHCPサーバーへの経路を順番に確認します。
Router# show running-config | include helper-address
Router# show ip interface brief
Router# show ip route 192.168.1.10
Router# ping 192.168.1.10
ip helper-addressが表示され、クライアント側インターフェースがup/upで、DHCPサーバーまで到達できることを確認します。
Windowsクライアントでは、次のコマンドでIPを再取得できます。
ipconfig /release
ipconfig /renew
割り当てられたIP、サブネットマスク、デフォルトゲートウェイ、DNSサーバーが想定どおりか確認してください。
LinuxでDHCPリレーを設定する方法¶
次にLinuxでDHCPリレーを設定する方法です。LinuxでDHCPリレーを設定するためには、「dhcrelay」のインストールを行います。
Ubuntuでは現在もisc-dhcp-relayパッケージが提供されていますが、開発元のISCではDHCPクライアントとリレーを保守終了としています。
学習環境や既存環境の理解には利用できますが、新規の本番環境では、ルーターやL3スイッチ、ベンダーが保守するリレー機能を優先して検討してください。
isc-dhcp-relayをインストールする¶
Ubuntu・Debian系では、次のコマンドを実行します。
sudo apt update
sudo apt install isc-dhcp-relay
「isc-dhcp-relay」をインストールすると、DHCPのIPアドレスを入力する画面が表示されます。続いて、インターフェースの入力画面が表示されます。
コマンドで設定する場合は、以下のように設定します。
sudo dhcrelay -i eth0 192.168.1.10
元記事の192.168.1.1は構成例によってはDHCPサーバーではなくゲートウェイになるため、ここではDHCPサーバーの192.168.1.10を指定しています。
-iには、DHCPメッセージを送受信するインターフェースを指定します。
Ubuntuで設定ファイルを編集する¶
継続して動作させる場合は、通常/etc/default/isc-dhcp-relayを設定します。
SERVERS="192.168.1.10"
INTERFACESv4="ens160 ens192"
INTERFACESv6=""
OPTIONS=""
インターフェース名はip -br addressで確認します。設定後はサービスを再起動し、状態とログを確認してください。
sudo systemctl restart isc-dhcp-relay
sudo systemctl status isc-dhcp-relay
sudo journalctl -u isc-dhcp-relay -f
パケットの流れを確認する場合は、次のコマンドが役立ちます。
sudo tcpdump -ni any 'udp port 67 or udp port 68'
DHCPリレーが動かないときの確認方法¶
IPアドレスを取得できない場合は、クライアント・リレー・DHCPサーバーの順に切り分けます。
| 確認場所 | 主な確認内容 |
|---|---|
| クライアント | 接続VLAN、NIC状態、DHCP再取得 |
| リレー | 設定インターフェース、サーバーへの経路、ACL |
| DHCPサーバー | 対象サブネットのスコープ、空きアドレス、サービス状態 |
Ciscoスイッチでは、次のコマンドでVLANを確認できます。
Switch# show vlan brief
Switch# show interfaces trunk
DHCPサーバーには、giaddrで通知されるクライアントネットワーク用のスコープが必要です。
たとえばgiaddrが192.168.10.1なら、192.168.10.0/24用のプールと、デフォルトゲートウェイ192.168.10.1を用意します。
DHCP Option 82とは¶
大規模なネットワークでは、DHCPリレーがOption 82へ接続ポートなどの情報を追加する場合があります。
DHCPサーバーはCircuit IDやRemote IDを利用し、接続場所ごとに払い出し方を変えたり、不正なDHCP通信を制御したりできます。
まずは通常のip helper-addressを理解し、必要になった段階でOption 82を学ぶとよいでしょう。
DHCPリレーまとめ¶
今回の記事では、DHCPリレーについて解説しました。まとめると以下のようになります。
- DHCPリレーは、異なるネットワークにあるDHCPサーバーへ通信を中継する
- クライアント側のルーターやL3スイッチへ設定する
- Ciscoでは
ip helper-addressを使用する - DHCPサーバーは
giaddrからクライアント側のサブネットを判断する - DHCPサーバー側にも対象サブネット用のスコープが必要
- Linuxの
isc-dhcp-relayは利用できるが、開発元では保守終了している
DHCPリレーは、VLANを分割したネットワークでは頻繁に使われる機能です。
設定値を暗記するだけではなく、DHCPDISCOVERがどこで止まり、リレーがどの情報を付けて転送するのか理解しましょう。
当ブログでは、このようなITに関する知識を発信しているので興味のある方は是非ご覧ください。