弱者は決して許すことができない。許しは強者の態度である── ガンディー
ネットワーク

住所を配る全員あてが、偽のサーバにも答える隙を与える

図 5 が「PC は自分の IP アドレスを知っている」ところから始めた、その手前を埋める。DHCP の 4 つのメッセージ、ルータを越えさせるリレー、配り口を守るスヌーピングと DAI を 1 枚で追う

ぴぐおv1人の校閲なし(AI のみ)訂正なし
ネットワークdhcpセキュリティconcept
目次

図 2 の PC-A も図 5 の PC-A も、自分の IP アドレスをすでに持っているところから始まっていました。その値がどこから来たのかは、まだ埋めていません。

図 17 でそこを埋めます。同時に、住所を配るために使う全員あてが、偽のサーバにも答える隙を与えることを見ます。

この連載は、ネットワークの言葉をもの(物理と論理)、結びつき(手動、自動、固定)、通信フロー(1 本の通信がこれらを順に通る流れ)の 3 層に置いています。ここで増えるのは、もの 2 つと、人が決める結びつき 2 つです。

登場するもの

貸出の台帳

DHCP サーバが持つ論理のものです。どの範囲(プール)から配るか、どの MAC アドレスにどの IP アドレスを貸したか、残り時間を持ちます。

DHCP スヌーピングの表

スイッチが持つ論理のものです。MAC アドレス、IP アドレス、物理ポート、VLAN 番号、貸出の残り時間が載ります。通信を見て自動で育ちます。

信頼する物理ポートの印

スイッチの物理ポートに人が付ける論理の印です。スヌーピングそのものが既定で無効で、有効にしたあとも物理ポートは既定で非信頼です。

ip helper-address

ルータのインターフェースに人が書く設定です。DHCP サーバの IP アドレスを 1 つ書きます。

結びつき

MAC アドレスと IP アドレスの対応は自動です。貸出で決まり、期限が切れると消えます。図 1〜5 では PC-A に手で 192.168.10.10 を入れていましたが、ここでは貸し出された 192.168.10.100 になります。

人が決めるのは、信頼する物理ポートと ip helper-address の 2 つだけです。表そのものは人が書きません。

偽の DHCP サーバは、この MAC アドレスと IP アドレスとデフォルトゲートウェイの結びつきを乗っ取ります。DAI(動的 ARP 検査)は、スヌーピングの表を照合先にして ARP を検査します。

通信フロー

① 住所の無い PC-A が、宛先 255.255.255.255、送信元 0.0.0.0 で Discover を出します。宛先ポート番号は 67(UDP)です。

② スイッチ 1 は全員あてなので VLAN 10 の全ポートへ流します。図 2 と同じ動きで、ルータ 1 のインターフェースにも届きます。

③ 全員あてはルータを越えません。ip helper-address を書いたインターフェースでは、ルータが外側の IP と UDP を作り直し、サーバあての 1 対 1 のパケットにして送ります。

④ ルータ 1 は DHCP のメッセージの中の giaddr に、受けたインターフェースの IP アドレスを書きます。サーバはそれを見てどのプールから配るかを決め、giaddr あてに Offer を返します。

⑤ PC-A は Request を全員あてで出します。選ばなかったサーバにも「使わない」が伝わるからです。サーバの Ack で住所が決まります。ここまでで 4 つのメッセージ、2 往復です。端末は自分側のポート番号 68 を使い、サーバとリレーはポート番号 67 を使います。

⑥ スイッチ 1 は通り道でこれを見ています。信頼する物理ポートから来た Offer と Ack だけを通し、決まった対応を表に書きます。その表と照らして合わない ARP を捨てるのが DAI です。

リレーがやっているのは、包み直しではありません。DHCP のメッセージはそのままに、外側の IP と UDP を作り直して giaddr を足し、hops を 1 増やして 1 対 1 で送るだけです。別のパケットの中に入れる話は図 10 で出てきます。

偽の DHCP サーバが非信頼の物理ポートから Offer を返しても、スヌーピングが有効ならそこで捨てられ、どの表にも載りません。

図 17

上が構成図、その下が 4 つのメッセージの並び、さらに下に守りの 2 つが並びます。いちばん下は各表の推移と、通信の中身の推移です。

DHCP:住所を配る仕組みと、配り口を守る仕組み 住所をもらう前の端末は、自分の住所も相手の住所も知らない。だから最初は「全員あて」で聞く。その同じ「全員あて」が、偽のサーバにも答える隙を与える VLAN 10(192.168.10.0/24) データセンター(192.168.3.0/24) PC-A 住所はまだ無い (0.0.0.0) スイッチ 1 VLAN 10 口 1 = 非信頼の口 口 8 = 信頼する口 口1 口8 ルータ 1 Gi0 192.168.10.1 Gi1 192.168.3.1 ip helper-address 192.168.3.200(手動) Gi0 Gi1 DHCP サーバ 192.168.3.200 VLAN 10 用のプールを持つ 全員あては、ここを越えない ip helper-address があると、1 対 1 に直して送る やり取りの並び(4 つのメッセージ=2 往復) PC-A スイッチ 1 ルータ 1 DHCP サーバ ① Discover(全員あて) 1 2 ③ 1 対 1 に直してサーバへ 3 ルータ 1 → PC-A ④ Offer(giaddr あてに返る) 4 ⑤ Request(全員あて) 5 同じくリレーを通る ルータ 1 → PC-A。ここで住所が決まる Ack Offer と Ack が全員あてで返るか 1 対 1 で返るかは、端末が立てる印(BROADCAST フラグ)で決まる(RFC 2131 §4.1) 全員あてなら宛先 MAC も全員あて、1 対 1 なら宛先 MAC は端末・宛先 IP は配る住所になる(下の帯の ④ は全員あての場合) ⑥ 守り 1:DHCP スヌーピング 信頼する口(上流)から来た Offer・Ack だけを通す 非信頼の口(PC 側)から来た Offer は捨てる  =偽の DHCP サーバを止める 通り道で Ack を読み、MAC・IP・口・VLAN・残り時間の表を作る ⑥ 守り 2:DAI(動的 ARP 検査) 非信頼の口に来た ARP を、左の表と照らして検査する 口・MAC・IP の対応が表と合わない ARP は捨てる  =偽の ARP 応答を止める 図 2 の ARP は受け取った側も覚えるので、嘘は表を汚す フロー ① 住所の無い PC-A は、宛先 255.255.255.255(全員あて)・送信元 0.0.0.0 で Discover を出す。宛先ポート番号は 67(UDP) ② スイッチ 1 は全員あてなので VLAN 10 の全ポートへ流す(図 2 と同じ)。ルータ 1 の口にも届く ③ 全員あてはルータを越えない。ip helper-address(手動)を書いた口では、ルータが外側の IP・UDP を作り直し、サーバあての 1 対 1 のパケットにして送る ④ ルータ 1 は DHCP のメッセージの中の giaddr に、受けた口の IP を書く。サーバはそれを見てどのプールから配るかを決め、giaddr あてに Offer を返す ⑤ PC-A は Request を全員あてで出す(選ばなかったサーバにも「使わない」が伝わる)。サーバの Ack で住所が決まる ⑥ スイッチ 1 は通り道でこれを見ている。信頼する口から来た Offer・Ack だけを通し、決まった対応を表に書く。その表と照らして偽の ARP を捨てるのが DAI 3 層で見ると もの:貸出の台帳(論理・サーバが持つ)/スヌーピングの表(論理・スイッチが持つ)/口ごとの「信頼する」の印(論理) 結びつき:MAC ⇄ IP は自動(貸出で決まり、期限が切れると消える)。信頼する口の印と ip helper-address は手動 フロー:図 2 の「全員あて」がそのまま使われる。越えられないルータの区間だけリレーが肩代わりし、通り道のスイッチが表を育てる ポートセキュリティ(口に MAC を覚えさせて 1 台だけ許す)も同じ「口を守る」だが、許す相手を人が決め打ちする。サーバに聞いて決める方法は図 18 各テーブルの推移(○番のフローで追加された行。青字) スイッチ 1: MAC アドレステーブル(VLAN 10) ① 追加: MAC A → 口 1(Discover が入った時) ④ 追加: MAC R1-Gi0 → 口 8(Offer が入った時) スイッチ 1: DHCP スヌーピングの表 ⑤ 追加: MAC A・192.168.10.100・口 1・VLAN 10  +貸出の残り時間(Ack を読んで自動で書く) ルータ 1: ルーティングテーブル 192.168.10.0/24 → Gi0(自動) 192.168.3.0/24 → Gi1(自動) DHCP サーバ: 貸出の台帳 ④ 仮押さえ: 192.168.10.100 を MAC A へ ⑤ Ack で確定。どのプールかは giaddr で決める PC-A: 自分の設定(もらった結果) 前: 何も無い(0.0.0.0) ⑤ 後: 貸し出された 192.168.10.100 が入る  (マスク・GW・DNS も一緒に届く) 図 1〜7 では手で 192.168.10.10 を入れていた スイッチ 1: 人が手で決めたこと スヌーピングを有効にする(既定は無効) 口 8 = 信頼する(既定は非信頼) 表は手で書かない。通信を見て育つ 通信の中身の推移(フローごとのフレーム/パケット) ① PC-A → 全員あて:Discover 宛先 MAC ff:ff:ff:ff:ff:ff(全員) 送信元 MAC MAC A 宛先 IP 255.255.255.255 送信元 IP 0.0.0.0 宛先ポート番号(UDP) 67 DHCP のメッセージ Discover フレーム=全部。ただしスイッチが見るのは MAC とタグの部分だけ パケット=この部分。ルータはここ(IP)を見る ③ ルータ 1 → サーバ:リレーが直したパケット(DHCP の中身は同じ) 宛先 MAC MAC SRV 送信元 MAC MAC R1-Gi1 宛先 IP 192.168.3.200 送信元 IP ルータ 1 の IP 宛先ポート番号(UDP) 67 DHCP のメッセージ Discover(giaddr 192.168.10.1) 全員あてが 1 対 1 になった。包み直した(中に入れた)のではなく、DHCP のメッセージはそのままに、外側の IP・UDP を作り直して giaddr を足しただけ。入れ子にする話は図 10 ④ サーバ → ルータ 1:Offer(giaddr あて) 宛先 MAC MAC R1-Gi1 送信元 MAC MAC SRV 宛先 IP 192.168.10.1 送信元 IP 192.168.3.200 宛先ポート番号(UDP) 67 DHCP のメッセージ Offer(配る住所 192.168.10.100) ④ ルータ 1 → PC-A:Offer を VLAN 10 側へ(全員あてで返す場合) 宛先 MAC ff:ff:ff:ff:ff:ff(全員) 送信元 MAC MAC R1-Gi0 宛先 IP 255.255.255.255 送信元 IP 192.168.10.1 宛先ポート番号(UDP) 68 DHCP のメッセージ Offer ⑤ Request と Ack 並びは ①③④ と同じ。Request を全員あてで出すので、選ばれなかったサーバにも「使わない」が伝わる。Ack で住所が確定する ⑥ 偽の DHCP サーバが非信頼の口から返した Offer 宛先 MAC ff:ff:ff:ff:ff:ff(全員) 送信元 MAC MAC 偽サーバ 宛先 IP 255.255.255.255 送信元 IP 192.168.10.50 宛先ポート番号(UDP) 68 DHCP のメッセージ Offer(GW を自分にする) スヌーピングが有効な口は既定で非信頼。ここから来た Offer・Ack は捨てられるので、この行はどの表にも載らない 端末は自分側のポート番号 68 を使い、サーバとリレーはポート番号 67 を使う(RFC 2131 §4.1) リレーは giaddr を書くほかに、通ったリレーの数を数える hops も 1 増やす(RFC 2131 §4.1) 出典(4 つのメッセージ・ポート番号 67/68・giaddr・Request を全員あてで出す理由): RFC 2131 §3.1・§4.1  https://www.rfc-editor.org/rfc/rfc2131.html 出典(リレー:ip helper-address・giaddr に受けた口の IP を書く・サーバへは 1 対 1 で送る): Cisco  https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_dhcp/configuration/15-s/dhcp-15-s-book/dhcp-relay-agent.html 出典(DHCP スヌーピング:非信頼の口では Offer・Ack を止める/表に載る中身/上流の口を信頼にする): Cisco  https://www.cisco.com/c/en/us/support/docs/ip/dynamic-host-configuration-protocol-dhcp-dhcpv6/217055-operate-and-troubleshoot-dhcp-snooping.html 出典(スヌーピングは既定で無効。有効にしたあとも、口の信頼は既定で「非信頼」): Cisco  https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst2960/software/release/12-2_55_se/configuration/guide/scg_2960/swdhcp82.html 出典(DAI:スヌーピングの表で ARP を検査し、合わない ARP は記録して捨てる): Cisco  https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst2960/software/release/12-2_55_se/configuration/guide/scg_2960/swdynarp.html 未検証: リレーが送信元 IP にどちらの口の IP を使うかは機器・設定によるため「ルータ 1 の IP」とだけ書いた(giaddr が受けた口の IP であることは Cisco 公式で確認) 未検証: スヌーピングの表と DAI の動きは実機で見ていない(勉強会で実機で触ったのはポートセキュリティと認証まで) ## 図 2・図 3・図 5 との接続

図 2 の ARP 要求と同じ全員あてを、ここでは住所そのものを聞くために使います。ARP は IP アドレスを知っていて MAC アドレスを知らない状態、DHCP は IP アドレスすら持っていない状態から始まります。

図 3 で見たとおり、全員あてが届く範囲は VLAN の中だけです。その制約のままなら DHCP サーバは VLAN ごとに要ることになりますが、リレーがルータの区間を肩代わりして制約を外します。図 5 の PC-A が持っていた IP アドレスとデフォルトゲートウェイは、この ⑤ で決まった値です。

配り口を人が決め打ちで守る方法が、勉強会で実機に入れたポートセキュリティです。物理ポートに MAC アドレスを覚えさせて 1 台だけを許します。許す相手をサーバ 1 か所に集める方法が次の図 18 になります。

未検証・注意

  • リレーが送信元 IP アドレスにどちらのインターフェースの IP アドレスを使うかは機器と設定によるため、「ルータ 1 の IP アドレス」とだけ書いています。giaddr が受けたインターフェースの IP アドレスであることは Cisco の公式ドキュメントで確認しました。
  • スヌーピングと DAI の動きは実機で見ていません。勉強会で実機に入れたのはポートセキュリティと認証までで、図の表の中身は公式ドキュメントの記述に合わせています。
  • ip helper-address が既定で中継する UDP のポート番号の一覧(67 と 68 以外)は確認していないため、書いていません。
  • 貸出時間の更新(残り時間が半分になったところで延長を頼む動き)は、1 枚に入れると焦点がぼけるため省いています。
  • Offer と Ack が全員あてで返るか 1 対 1 で返るかは、端末が立てる BROADCAST フラグで決まります(RFC 2131 §4.1)。図の帯の ④ と ⑥ は全員あてで返す場合で、1 対 1 なら宛先 MAC アドレスが端末のもの、宛先 IP アドレスが配る住所になります。
  • リレーの細かい動き(hops の上限や、返ってきたメッセージを端末へ渡すときの宛先の決め方)は RFC 1542 が正本ですが、本文を読んでいません。RFC 2131 §4.1 で確認できた範囲だけを書いています。
  • 図に出した 192.168.10.100 と 192.168.3.200 は説明用の値で、勉強会の資料の値とは関係ありません。

出典

  • 勉強会での本人の観察。2026-09-13 の実機ハンズオン(資料は非公開)。本記事で観察が支えるのは、配り口を守る設定としてポートセキュリティを実機に入れたことだけで、DHCP の動きとスヌーピングと DAI は以下の文書による
  • RFC 2131 Dynamic Host Configuration Protocol — 4 つのメッセージ、ポート番号 67 と 68 の使い分け(§4.1)、Request を全員あてで出す理由(§3.1)、giaddr が 0 でなければリレーのポート番号 67 あてに返すこと、BROADCAST フラグ(§4.1)
  • Cisco IOS DHCP Relay Agent — ip helper-address を書いたインターフェースの IP アドレスを giaddr に入れること、全員あてを 1 対 1 でサーバへ送ること
  • Cisco Operate and Troubleshoot DHCP Snooping — 非信頼のインターフェースでサーバ側のメッセージを止めること、表に載る項目、上流を信頼にして利用者側を非信頼にすること
  • Cisco Catalyst 2960 Configuring DHCP Features — 既定値の表。スヌーピングは無効、インターフェースの信頼は非信頼
  • Cisco Catalyst 2960 Configuring Dynamic ARP Inspection — DHCP スヌーピングの表を照合先にして ARP を検査すること、信頼と非信頼で扱いが変わること

関連

この記事の校閲記録

誰が・いつ・どの版の・どの段落を・何の観点で見て、何と言ったかを全件そのまま出す(追記のみ・削除しない)。

段落 37 のうち出典つき 13・出典なし 24

v1 2 件
  • AIAI (claude-fable-5) が AI 確認未解決

    出典 5 件を WebFetch で取得して確認した。ポート番号 67 と 68 の使い分け、Request を全員あてで出す理由、返事が全員あてか 1 対 1 かが BROADCAST フラグで決まることは RFC 2131 §3.1・§4.1 で確認した。リレーが giaddr に受けたインターフェースの IP アドレスを書くことと 1 対 1 で送ることは Cisco の DHCP リレーエージェントの記述で確認した。非信頼のインターフェースでサーバ側のメッセージを止めること、表に載る項目、上流を信頼にすることは Cisco のスヌーピングの文書で確認した。スヌーピングが既定で無効・インターフェースが既定で非信頼であることは Catalyst 2960 構成ガイドの既定値の表で確認した。DAI がスヌーピングの表を照合先にすることは同ガイドの DAI の章で確認した。リレーの送信元 IP アドレス、helper-address が中継する UDP のポート番号の一覧、貸出時間の更新、RFC 1542 の本文は確認しておらず未検証として本文に明記した。スヌーピングと DAI は実機で見ていないことも明記した。校正チェックリストを全項目回し、図の『口』を本文では物理ポートとインターフェースに書き分け、ポート番号は UDP の番号にだけ使った。守秘検査(人名、社名、会場名、地名、連絡先の機械検査)で該当なし

  • AIAI (claude-fable-5) が 編集未解決

    公開前の校閲。「この 17 本目」は連載の通し数(この記事は 21 本目)とずれる自己参照なので「図 17」に直した。関連を、図 8〜16 と同じ形(連載の入口・前の記事・次の記事・関連記事に /notes/ のパスを添える)に揃えた。全員あての Offer と Ack を MAC アドレスまで全員あてで描く点と BROADCAST フラグの断りは RFC 2131 §4.1 の記述と一致しているので、そのままにした。

参考文献

更新履歴

  • 連載のトピックを「ネットワーク基礎」から「ネットワーク」へ改名(32 本+目次。slug と URL は不変)
  • 公開: 連載「ネットワーク基礎」図 8〜24 の記事 17 本と目次の更新

機械可読の記録