【実務・中級編】 DHCP(UDP/67, 68)のDORAプロセス – ネットワーク基礎とWebセキュリティ実践ガイド

はじめに:カフェのWi-Fiで繋がる「あの瞬間」の裏側

新しいカフェに入り、ノートPCを開いてWi-FiのSSIDを選択する。数秒後、何事もなかったかようにブラウザが開き、お気に入りのWebサービスへのアクセスが始まる――。Webエンジニアやインフラエンジニアである私たちにとって、この「IPアドレスが降ってきて通信ができるようになる瞬間」はあまりにも日常的すぎて、意識することはほとんどありません。

しかし、この魔法のようなプロセスの裏側では、レイヤー2(データリンク層)からレイヤー7(アプリケーション層)までをまたぐ、非常に泥臭く、そして美しい通信のダンスが繰り広げられています。それが DHCP(Dynamic Host Configuration Protocol) による DORAプロセス です。

今回は、数々のネットワークトラブルの現場をくぐり抜けてきたシニアエンジニアの視点から、DHCPのパケットがワイヤー上(あるいは電波空間)をどのように駆け巡り、私たちのデバイスをネットワークの住人へと仕立て上げるのか、その実務的な真実を紐解いていきましょう。

—

1. DHCPとDORAプロセスの基本仕様:なぜ「ブロードキャスト」が必要なのか?

IPアドレスを持っていない端末が、どうやって通信するのか?

Web APIを設計する際、私たちは https://api.example.com/v1/users のようなエンドポイントを叩きます。DNSがホスト名を解決し、TCPの3ウェイハンドシェイクを経てHTTPリクエストが飛ぶ。この世界が成り立つ前提条件は、クライアント自身がすでに「自分自身のIPアドレス(IPv4)」を持っていることです。

しかし、OSを起動したばかりの端末や、まっさらなコンテナ、あるいは新しくリブートされたルーターの配下に繋がれたデバイスは、自分のIPアドレスすら知りません。当然、宛先IPアドレスを指定したユニキャスト通信などできるはずもない。

ここで登場するのが、UDPのポート番号 67(サーバー側)と 68(クライアント側)を使用する DHCP です。そして、IPアドレスを持たない端末がネットワーク全体に向けて助けを求めるために使う唯一の手段が ブロードキャスト(255.255.255.255) なのです。

DORAプロセスの4つのステップ

DHCPによるアドレス割り当ては、英語の頭文字を取って DORAプロセス と呼ばれる4つのフェーズで完結します。

1. Discover(発見):「誰かIPアドレスをくれ!」(クライアント → ブロードキャスト)
2. Offer(提示):「このIPアドレスはどうい?」 (サーバー → ブロードキャストまたはユニキャスト)
3. Request(要求):「そのIPアドレスを借ります!」(クライアント → ブロードキャスト)
4. Acknowledge(確認/応答):「毎度あり!貸出完了!」(サーバー → ブロードキャストまたはユニキャスト)

なぜステップ3(Request)でも再びブロードキャストを使うのか? ここにネットワークエンジニアなら知っておくべき実務上の理由があります。それは、「同一セグメント内に複数のDHCPサーバーが存在する場合、自分がどのサーバーのオファーを受諾したかをネットワーク全体のサーバーに知らせる(他を断る)ため」です。

—

2. パケットの動き:DORAの全シーケンスとパラメーター

では、実際にパケットがどのような構造で流れているのか、シーケンスと各メッセージの肝となるパラメーターを見ていきましょう。

[Client (MAC: AA:AA...)]               [DHCP Server (IP: 192.168.1.1)]
       |                                       |
       | ----- 1. DHCP Discover -------------> | (Broadcast: 255.255.255.255:67)
       |       (俺のMACアドレスはこれだ、誰かIPちょうだい)
       |                                       |
       | <---- 2. DHCP Offer ----------------- | (Broadcast / Unicast)
       |       (192.168.1.100はどうだい?)      |
       |                                       |
       | ----- 3. DHCP Request --------------> | (Broadcast: 255.255.255.255:67)
       |       (192.168.1.100を正式に要求する!) |
       |                                       |
       | <---- 4. DHCP ACK ------------------- | (Broadcast / Unicast)
       |       (承認!リース期間は24時間ね)     |
       |                                       |

各ステップにおける重要パラメーター

実務でパケットキャプチャツール(Wiresharkなど)を開いたとき、DHCPパケットの中身(BOOTP/DHCPプロトコルフィールド)で確認すべきポイントは以下の通りです。

  • op(メッセージ種別):リクエストなら 1(BOOTPREQUEST)、レスポンスなら 2(BOOTPREPLY)
  • xid(トランザクションID):クライアントが生成するランダムな32ビットの識別子。複数のリクエスト・レスポンスのペアを識別するために使われます。これが一致しないパケットはゴミとして捨てられます。
  • yiaddr(Your IP address):サーバーがクライアントに割り当てるIPアドレス(OfferおよびACKで設定される)。
  • chaddr(Client hardware address):クライアントのMACアドレス。ここを見てサーバーは誰宛か判断します。
  • DHCPオプション(Option Field):
  • Option 53(DHCP Message Type):Discover(1), Offer(2), Request(3), ACK(5) などの種別を指定。
  • Option 1(Subnet Mask):サブネットマスク。
  • Option 3(Router / Default Gateway):デフォルトゲートウェイのIP。
  • Option 6(DNS Server):DNSサーバーのIP。
  • Option 51(IP Address Lease Time):IPの有効期限(秒)。

—

3. 実務での設定・運用Tips:Linux(dnsmasq)によるDHCPサーバー構築

クラウド環境やコンテナネットワーク(Dockerのブリッジなど)では背後で自動処理されますが、物理オンプレミス環境や検証用の閉域網(エッジネットワーク)でミニマムなDHCPサーバーを構築する場合、dnsmasq や isc-dhcp-server を使うことが多々あります。

ここでは、実務でよく使われる軽量な dnsmasq の設定例を見てみましょう。自宅の検証ラボやオフィスのローカル環境でDHCPを立てる際の設定ファイル(/etc/dnsmasq.conf)のサンプルです。

設定ファイル例: /etc/dnsmasq.conf

# インターフェースの指定(外部のパブリック側に誤ってDHCPパケットを漏らさないための鉄則)
interface=eth0

# DHCPで割り当てるIPアドレスのレンジとリース時間(ここでは24時間)
dhcp-range=192.168.10.50,192.168.10.150,255.255.255.0,24h

# デフォルトゲートウェイ(Option 3)の指定
dhcp-option=3,192.168.10.1

# DNSサーバー(Option 6)の指定。社内DNSやパブリックDNS(1.1.1.1等)を指定
dhcp-option=6,1.1.1.1,8.8.8.8

# ログを詳細に出力する(トラブルシューティング用)
log-dhcp

# 特定のMACアドレスに対して常に同じIPを割り当てる(静的IPマッピング)
# 開発用サーバーやプリンターなど、変わっては困る機器に必須の設定
dhcp-host=52:54:00:12:34:56,192.168.10.100,dev-server-01

> シニアからの実務Tips:
> 本番環境や社内LANでDHCPサーバーを構築・運用する際、最も恐ろしいのは「ローグDHCPサーバー(不正なDHCPサーバー)」の混入です。テスト用に個人のPCで立ち上げたDHCPサーバーが誤って社内LANに繋がり、正当なサーバーよりも先にOfferを返してしまうと、社内全体のネットワークがデタラメなIPアドレスを割り当てられて阿鼻叫喚の地獄絵図(通信障害)になります。ポートセキュリティやDHCPスヌーピング(DHCP Snooping)をスイッチ側で有効化することは、インフラエンジニアの必須の防衛策です。

—

4. トラブルシューティング:DHCPが通らないときのデバッグ手順

「新しいデバイスを繋いだのに、IPが取れない(API叩くどころか通信ができない)」という障害は、インフラ・ネットワークエンジニアにとって定番のトラブルです。現場でどのように原因を切り分けるか、そのステップを共有します。

ステップ1: クライアント側でパケットが飛んでいるか確認する

まずは、クライアント側でDHCPのDiscoverが実際に送信されているかを tcpdump でキャプチャします。

# eth0インターフェースで、UDPのポート67および68のトラフィックをキャプチャする
sudo tcpdump -i eth0 -nn -vvv "port 67 or port 68"
  • 現象A:パケットが全く飛んでいない
  • 原因:物理レイヤーの断線、Wi-Fiの認証失敗、あるいはネットワークカードのドライバ不具合、リンクアップしていません。
  • 現象B:Discoverは飛んでいるが、Offerが返ってこない
  • 原因:

1. 同一セグメント内にDHCPサーバーが存在しない。
2. サーバー側のファイアウォール(iptables / firewalld / ufw)でUDP/67やUDP/68がブロックされている。
3. レイヤー2の障害(VLANのミスマッチ):クライアントが所属しているVLAN IDと、DHCPサーバーが待ち受けているポートのVLANが異なっている。

ステップ2: ルーターをまたぐ場合の「DHCPリレーエージェント」の確認

もしDHCPサーバーが「別のセグメント(別VLAN / 別サブネット)」にある場合、ブロードキャストであるDiscoverパケットはルーターを越えられずにルーターのインターフェースで破棄されます。

ここで必要になるのが DHCPリレーエージェント(IPヘルパーアドレス) です。
ルーター側で次のような設定が入っているか確認します(Cisco IOSの例)。

# ルーターのクライアント側インターフェースコンフィグ
interface GigabitEthernet0/0
 description Client-Side-VLAN
 ip address 192.168.10.1 255.255.255.0
 # ブロードキャストをユニキャストに変換してDHCPサーバーへ転送する設定
 ip helper-address 10.0.0.100

ルーターはこの設定により、受信したブロードキャストのDiscoverパケットを宛先 10.0.0.100(DHCPサーバーのIP)宛てのユニキャストパケットに包み直して(giaddr フィールドに自身のインターフェースIPを付与して)転送します。これが正しく動作していないと、遠隔のDHCPサーバーにはリクエストが届きません。

—

おわりに:基盤の裏側を知ることで、Webの挙動がより深く見えてくる

今回は、ネットワークの基礎でありながら、すべての通信の起点となるDHCPのDORAプロセスについて解説しました。

普段私たちが何気なく記述しているWeb APIのコードや、クラウド上のオートスケーリング構成、コンテナのネットワーク設定。それらのすべては、この「最初の一歩」であるDHCPやブロードキャスト通信という土台の上に成り立っています。

「なぜこのAPIリクエストがタイムアウトするのか?」
「なぜコンテナがIPを取得できないのか?」

そんなトラブルに直面したとき、頭の中でパケットのフロー(DORAプロセスやブロードキャストの挙動)をスラスラと描き出せること。それこそが、優れたWeb・インフラエンジニアの最大の武器となります。今日の帰りがてら、あるいはカフェでWi-Fiに繋いだとき、「今、DORAのパケットが駆け抜けたんだな」と少しだけ思い出していただければ幸いです。

コメント

タイトルとURLをコピーしました