こんにちは、Windows プラットフォーム サポートの田村です。
本稿では DHCP サーバーからリースしていない IP アドレスが一時的に確保される (リースできなくなる) 事象についてご説明いたします。
概要
分割スコープによる DHPC サーバーの冗長構成で [DHCP OFFER メッセージの遅延時間] の設定を使用している場合、遅延を設定しているサーバーでリース要求に対して確保された IP アドレスがリースされなかった場合も 10 分間確保されたままになります。
対象 OS
Windows Server 2008 R2
Windows Server 2012
Windows Server 2012 R2
Windows Server 2016
Windows Server 2019
詳細
DHCP サーバーは DHCP OFFER を送信するタイミングで、IP アドレスをリース用に確保します。
この DHCP OFFER に対して、何らかの理由によりクライアントから DHCP REQUEST が送信されない場合、IP アドレスが確保されたままとなります。
Windows Server 2008 R2 以降に実装された [分割スコープ] 機能を利用して冗長化を行っている環境では、[DHCP OFFER メッセージの遅延時間] が設定されている場合が多く、次の DHCP トランザクションが想定されます。
- クライアントからの DHCP DISCOVER が 2 台の DHCP サーバーに到達します。
- 遅延を設定して “いない” DHCP サーバーから DHCP OFFER が送信されます。
- クライアントが DHCP REQUEST を送信します。
- 遅延を設定して “いない” DHCP サーバーから DHCP ACK が送信されます。
- 遅延を設定して “いる” DHCP サーバーから DHCP OFFER が送信されます。
このとき、5. のタイミングで送信された DHCP OFFER への応答が無いため、遅延を設定している DHCP サーバーは IP アドレスを確保したままとなります。
確保された IP アドレスは “使用中” の扱いになり、別の DHCP トランザクションに対してリースできません。
このため、上記のトランザクションが短時間に多数発生すると、[アドレスのリース] では確認できない IP アドレスが多数確保され、アドレス プールの枯渇が発生する可能性があります。
なお当該 IP アドレスの確保期間は 10 分となっており、解放された後は通常通りリースが可能となります。
また、IP アドレスが確保された状態で [整合性] の確認を行うと、確保された IP アドレスは [一意な ID] が “IP アドレスを ASCII コード (16 進数表記) に変換した値” となって [アドレスのリース] に表示されます。
回避策
Windows Server 2008 R2
下記操作で 10 分を待たずに DHCP OFFER 用に確保された IP アドレスの解放が可能となります。
- [整合性] を選択すると [整合性] ウィンドウが開きます。
- [整合性] ウィンドウの [確認] をクリックします。
- ウィンドウ内に IP アドレスが表示された場合は一時的に確保された IP アドレスが存在します。
- 前述の手順で [整合性] ウィンドウ内に IP アドレスが表示された状態で、ウィンドウ内の [整合性] をクリックします。
- [キャンセル] で [整合性] ウィンドウを閉じます。
- [アドレスのリース] を右クリックし、[最新の情報に更新] をクリックします。
- 中央ペインに表示される、[一意な ID] が “3139322e” で始まるレコードを選択し、右クリック メニューから [削除] します。
Windows Server 2012 以降
スコープ フル状態を示すイベント ID 20287 をトリガーとし、自動で DHCP OFFER 用に確保された IP レコードを削除するタスクを作成することができます。
- 現象発生サーバーに管理者アカウントでログオンします。
- 管理者権限でコマンド プロンプトを起動し、以下 3 つのコマンドを実行します。
1
2
3
4md c:\temp
echo powershell -command "Reconcile-DhcpServerv4IPRecord -ScopeId 192.168.1.0 -Force | Remove-DhcpServerv4Lease" > c:\temp\dhcp-script.bat
:: -ScopeId の値をご利用のスコープに合わせて変更ください (本例では 192.168.1.0 のスコープを対象としています。)
schtasks /create /tn "dhcp-tryfix" /ru system /sc onevent /ec DhcpAdminEvents /mo "*[System[Provider[@Name='Microsoft-Windows-DHCP-Server'] and (EventID=20287)]]" /tr c:\temp\dhcp-script.bat - [Windows] キー + [R] キー を押下し、taskschd.msc を入力、[OK] ボタンを押下します。
- 左ペインの [タスク スケジューラ ライブラリ] を選択し、中央ペインに dhcp-tryfix タスクが存在することを確認します。
特記事項
本記事は 2019 年 4 月 14 日に公開された記事を本ブログに移行した記事になります。
また本情報の内容 (添付文書、リンク先などを含む) は、作成日時点でのものであり、予告なく変更される場合があります。