OCI上でWindows DHCPサーバを動かしてみた

 2021.07.05  株式会社テリロジー 技術統括部

みなさまこんにちは。Tachanです。

今回は、OCI上にDHCPサーバを構築し、ホストにIPアドレス等が正しく割り振られるか検証してみました。

オンプレで動かしているDHCPサーバがあるけど、
クラウド上でそもそもDHCPサーバは安定して動作するのか……

そんな不安を解消するため検証してみました!
お役に立てれば幸いです。

DHCPとは

DHCPとは、Dynamic Host Configuration Protocolの略でネットワーク接続するために必要なIPアドレスなどの情報を自動で割り振る機能を持ったプロトコルです。
必要な情報というのは、主に以下の4つを指します。

  • IPアドレス
  • サブネットマスク
  • デフォルトゲートウェイ
  • DNSサーバーの情報

端末に自動で設定できるため、管理者・利用者の負担を減らすことができます。
このプロトコルはUDP上で動作します。

検証に使ったもの

OCI側

  • Windowsインスタンス(DHCPサーバ)
  • WireShark

オンプレ側

  • ルーターまたはFW(今回はFWを使用)
  • WireShark
  • Windows端末(DHCPクライアント)

今回は以下のような構成で検証します。

構成図

構築手順① 環境構築

①FW側で以下の設定を行います。

  • インターフェース作成
  • DHCPリレー設定
  • OCIセグメントへのスタティックルート追記
  • ポリシー追加

②OCI側で以下を作成します。

  • 新規インスタンス、ネットワーク・セキュリティ・グループの作成

インスタンス作成方法はこちら!
今回はWindows-Server-2019-Standardのイメージを使用しました。
※DHCPサーバは、サーバ自身のIPアドレスがスタティックで設定されている必要があります。
通常通りOCIでインスタンスを作成すると、Oracle側で自動的にIPが割り振られ、スタティックの設定ができません。
作成する際は、オプションでIPアドレスを固定で設定し、インスタンスにも同様に固定で割り当てましょう。

構築手順① 環境構築

ネットワーク・セキュリティ・グループは以下のポートを許可します。

イングレス:UDP67番
エグレス:UDP68番

構築手順② DHCPサーバの構築

Windowsインスタンスが起動したら、DHCPサーバの機能を設定していきます。

①Windows サーバー マネージャを立ち上げる

②サーバーマネージャーの右上のmanageから「Add Roles and Features」を選択

構築手順② DHCPサーバの構築

③追加ウィザード画面が出てくるので画面に沿って設定を行います。

  • インストールの種類:「役割ベールまたは機能ベースのインストール」を選択
  • サーバーの選択:「local」を選択
  • サーバーの役割:「DHCP」を選択
  • DHCP サーバーに必要な機能を追加しますか?:「管理ツールを含める」にチェック
  • インストールオプションの確認:必要に応じて「必要に応じて対象サーバーを自動的に再起動する」を選択

インストールが完了したら、ウィザード画面を閉じます。

④サーバーマネージャーの右上(構築手順②のmanageの右)に ⚠マーク付きのフラッグが確認できます。
フラッグをクリックして「DHCP構成を完了する」を選択します。

⑤インストール後のウィザード画面がでてきます。
コミットで承認するだけでOKです。

以上でDHCPサーバの構築が終わりました!

構築手順③ DHCPサーバーの設定

DHCPサーバを構築したら、実際に払い出される情報の設定を行っていきます。

①Windows管理ツールからDHCPを起動

②IPv4を右クリックし、「新しいスコープの作成」を選択
スコープとは、DHCPを利用する端末のIP アドレスを管理するためのグループで、
端末にIPアドレスを配布する際には、スコープを設定する必要があります。

③ウィザードを開始し、以下の設定を行います。

■必須項目

  • スコープ名:任意のスコープ名を入力
  • IPアドレスの範囲:DHCPサーバから端末に払い出す、実際のIPアドレスの範囲を設定
  • リース期間:払い出したIPアドレスの使用期限を設定
  • DHCPオプションの構成:「今すぐオプションを構築する」を選択
  • ルーター:配布するデフォルトゲートウェイの入力
    ※IPアドレスを払い出された端末は、このデフォルトゲートウェイのアドレスを使用して
    インターネットに接続されます
  • ドメイン名およびDNSサーバー:端末に配布するDNSサーバーのアドレスを設定

■オプション設定

  • 除外と遅延の追加:除外したいIPアドレスがある場合
  • WINS:WINSサーバーを使用する場合

スコープは「今すぐアクティブにする」を選択して
すぐ使えるようにします。

以上で新しいスコープを作成することができました!

DHCP動作検証

FWで作成したインターフェースに端末を接続し、
WireSharkでDHCPによりIPアドレスが取得されるか確認します。

まずはアドレス取得できるか見てみます。

DHCP動作検証 画像01

端末のパケットキャプチャをみたところ、DHCPサーバを見つけるところからIPアドレスの取得まで正しく動作していました!

次にアドレスのリリースとIPアドレスの更新を確認していきます。

■IPアドレスリリース

DHCP動作検証 画像02

■IPアドレス更新(ユニキャストでの更新)
端末側のパケットキャプチャ

DHCP動作検証 画像03

DHCPサーバ側のパケットキャプチャ

DHCP動作検証 画像04

WireSharkで確認したところ、端末側、サーバー側共に、IPアドレスの新規取得、IPアドレスリリースとユニキャストでのIPアドレス更新が正しく動作しています!
OCI上でもDHCPサーバの構築・運用が問題なくできました!

NATの設定に注意

FW側でインターフェースにNATの設定が有効になっていると、DHCPの動作がうまくいかない場合があります。
今回の検証では、当初、DHCPリクエストとリリースは正しく動作したのですが、
IPアドレスの更新では、IPアドレスの取得ができていませんでした。
原因はFW側でNATの設定が有効になっていたことでした。

■DHCPの詳細な仕組み
DHCPで取得したIPアドレスはDHCPサーバ側で設定するリース時間が切れるまでの間、利用することができます。
例えばリース時間が24時間に設定されている場合、IPアドレス取得から24時間利用することができます。
取得から24時間を超えるとそのIPアドレスは使用できなくなるため、引き続き同じIPアドレスを使用するためにはIPアドレスを更新する必要があります。
DHCPクライアントはIPアドレスを継続して利用するために、使用しているIPアドレスのリース時間(例として24時間)の中でDHCPサーバにIPアドレスの更新を要求します。

更新は最大で2回行われます。

1回目の更新は、IPアドレスの使用が始まってからリース時間の1/2(今回の例では12時間後)に行われます。
IPアドレスを新規取得する際はブロードキャスト通信で行いますが、
1回目の更新ではクライアントからDHCPサーバへ、ユニキャストの通信が行われます。

2回目の更新は、IPアドレスの使用が始まってからリース時間の7/8(今回の例では21時間後)に行われます。
2回目の更新では1回目とは異なり、ブロードキャスト通信でDHCPサーバと通信を行います。

NATの話に戻ります。
今回失敗したIPアドレスの更新は1回目の更新にあたるものでした。
IPアドレスの新規取得・リースは、クライアントからはブロードキャスト通信されるため問題はありませんでしたが、 アドレス1回目の更新処理はユニキャスト通信なので、これがFWでNATされてしまうと、戻りの通信パケットが破棄されます。
と言いますのもDHCPでは、DHCPサーバ宛に通信する際、ポートは67番を使用し、
DHCPクライアント宛の場合はポート68番を使う仕様になっているので、
NATに使われたポート番号で通信を返すことができず、端末側は新しいアドレスを受け取ることができません。

DHCP動作検証 画像05

上記の実際のパケットがこちらです。

DHCP動作検証 画像06

DHCP動作検証 画像07

本来のポート番号で返されていないことがわかります。
NATされていたとしても2回目の更新がブロードキャスト通信なので、IPアドレスが使えなくなる!といことは無いかと思いますが、
クライアントとサーバの経路でNATの設定(動的NAT)が有効になっていないか確認しましょう!

今回の検証は以上になります。
最後までお読みいただきありがとうございました。

お問い合わせはこちら

 


RECENT POST「OCIで作ってみた」の最新記事


OCIで作ってみた

OCVS・Horizon構築してみた③

OCIで作ってみた

OCVS・Horizon構築してみた②

OCIで作ってみた

OCVS・Horizon構築してみた①

OCIで作ってみた

OCVSにブロック・ボリュームをアタッチして、vSphereのデータストアに追加してみた

OCI上でWindows DHCPサーバを動かしてみた