近頃はスマートフォンやスマートウォッチ、スマートスピーカなど、ユーザの消費するIPアドレスは爆発的増加の一途。それでもうちのオフィスは人口密度は低い方だと思うので、あまり目くじら立てずにいますが、ふとあるサブネットのリースの集計値を確認すると、配布可能IPが枯渇とありますが、しかしリース詳細リストはどうみても使い切っているようには見えません。
Windows Server 2012 で運用されているDHCP Serverサービスは、フロア毎にサブネットを区切っていて、その末尾範囲を概ね次の要領で使い分けています(192.168.26.0/24の例)。
- 21〜 99 : DHCP Serverのランダム配布用IPプール範囲 ←【ココが枯渇】
- 100〜199 : 据え置きPC向けにDHCP Serverがを予約IP配布
- 200〜254 : プリンタやAP、スイッチなどネットワーク機器が固定IPで使用
MMCコンソールから手動で現在のリース(プール範囲)を削除すると、消した分が余剰に上積みされるだけで、つじつまの合わない状態に変わりはありません(全部消したのに35個使用中扱いのまま)。サービスを再起動させても、OSの再起動でも解消されず。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
MIBCounts: Discovers = 2381. Offers = 85. Delayed Offers = 0. Requests = 852. Acks = 1270. Naks = 5. Declines = 0. Releases = 1. Scopes with Delay configured= 0. Subnet = 192.168.26.0. No. of Addresses in use = 35. No. of free Addresses = 43. No. of pending offers = 0. Server Database Properties : DatabaseName = dhcp.mdb DatabasePath = C:\Windows\system32\dhcp DatabaseBackupPath = C:\Windows\system32\dhcp\backup DatabaseBackupInterval = 60 mins. DatabaseLoggingFlag = 1 DatabaseRestoreFlag = 0 DatabaseCleanupInterval = 10 mins. Server Status: Server Attrib - Rogue Authorization Succeeded :TRUE Server Attrib - Dynamic BootP Support Enabled :TRUE Server Attrib - DHCP Server Part Of DS :TRUE Server Attrib - DHCP Server Bindings Aware :TRUE Server Attrib - Administrative Rights :TRUE |
同じような現象が無いか調べてみると、海外でちらほら見受けられますが、決定的な解決策は見つからないものの、こちらのQ&Aサイトの回答を見たときに、昔自分でやった対処法を思い出しました。
それはおかしくなったスコープをExportの後に削除、そしてExportしたスコープを元通りImportするというもの。netsh dhcp serverで行うその処理は、昔はスコープ単位での処理は出来ずに丸ごと処理せざるをえなかったものの、Windows Server 2008になった辺りで IPv4 / IPv6 に細分化されてからは、スコープ処理が可能となりました。
保存されるのはスコープのプロパティ、ReservationやScope Optionなどの他、そのスコープの状態(アクティブor非アクティブ)も保存され、復元時に即反映されるので、稼働中のDHCP Serverに対して実行する際は注意が必要でしょう。
1 2 3 4 5 6 7 8 9 10 11 |
## EXPORT SCOPE > netsh dhcp server v4 export dhcp26.db 192.168.26.0 Command completed successfully. ## DELETE SCOPE > netsh dhcp server v4 delete scope 192.168.26.0 dhcpfullforce Command completed successfully. ## IMPORT SCOPE > netsh dhcp server v4 import dhcp26.db 192.168.26.0 Command completed successfully. |
PowerShellでは次のように行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
## EXPORT SCOPE PS> Export-DhcpServer -File dhcp26_scopeandlease.xml -ScopeId 192.168.26.0 -Leases ## DELETE SCOPE PS> Remove-DhcpServerv4Scope -ScopeId 192.168.26.0 -Force ## IMPORT SCOPE PS> Import-DhcpServer -File dhcp26_scopeandlease.xml -BackupPath C:\dhcpbackup\ -ScopeId 192.168.26.0 -Lea ses Confirm The configuration (and leases) for following scopes will be imported from the file C:\dhcp26_scopeandlease.xml to server HCG05: 192.168.26.0.Do you want to perform this action? [Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): y |
PowerShellの方が明示的で細かな指定が可能になっています。生成されるファイルもnetshが.dbと言う拡張子のバイナリファイルなのに対し、こちらはXMLなので中身を容易に確認可能ですが、ファイルサイズもその分大きくなります。そしてImport時には必ず、データベースのバックアップ先を必須で指定する必要があります。
Reconcile(整合性)機能による修復
稼働中のスコープへ対処したい場合など、より安全な方法で解決する方法は、DHCP Server MMC上でスコープを右クリックすると出て来る「Reconcile(整合性)」機能を使う方法です。以前よりこの項目は目にしていたものの、何に使うのかずっと判らずにいましたが、使ってみてようやく理解。
Reconcileを押すと次のような小窓が開くので、Verifyしてデータベースとレジストリの差異を表示し、Reconcileします。
正直これだけなので、いまいち何がどうなったかわかりにくいのですが、リース中アドレス一覧を再更新すると飛び番になっていたIPアドレスが浮かび上がってきました。
Unique IDなどでうまくソートしてひとまとめに選択、さくっと削除してしまいます(よく見るとリース期限がReconcileした時間から再設定されているので、何もしなくても期限を過ぎれば自動的に消えて利用可能な状態になります)。
削除後、集計値を参照すると、合計、使用中、空きアドレスの値のつじつまが合う状態に戻りました。
このReconcile機能はPowershellにも用意されているので、これをタスクスケジューラと組み合わせ、定期的にIPリースのゴミ掃除を仕込むことも可能です(但し、Windows Server 2012 R2以降でのみ対応)。
1 |
PS> Repair-DhcpServerv4IPRecord -ScopeId 192.168.26.0 |
せっかくDHCP Serverに手をつけたので、次回はバックアップと復元について、ずっと使い続けているnetshベースのバッチをPowershell化して使いやすくしようと思います。
参考)