VMware上のWindows仮想マシンを利用している場合に、仮想マシンを起動するとIPアドレスが正常に割り当てられず、「169.254.x.x(APIPA)」になってネットワークへ接続できない現象が起こります。
・毎回発生するわけではありません。再起動でも発生します。
・サーバなどに固定IPを割り当てている場合に発生します。
・Windows以外(Linuxなど)では発生しません。
その場合はVMwareコンソールからOSへログオンして、ネットワークアダプタを再起動することで正常にネットワークに接続できます。
今回はこの現象が起こる原因の説明を行い、対応方法としてWindowsレジストリを変更する方法について紹介します。
Windowsのレジストリを変更による影響についてはあくまで自己責任でお願いします。
WindowsでIPが169.254.x.x(APIPA)になる原因
原因は以下にある通り、 Cisco デバイスを使用していると、ESX/ESXi 上の Microsoft Windows仮想マシンで重複した IP アドレスが誤って検出されて、169.254.x.x の IP アドレスが割り当てられてしまうようです。
Cisco スイッチで Gratuitous ARP が有効であるか、ArpProxySvc がすべての ARP 要求に誤って返信される場合に発生するようです。
要はCiscoがあるとVMwareだけでなくHyper-Vでももちろん発生しますし、物理サーバでも発生する事象になります。
対応方法
Ciscoデバイス側でGratuitous ARPを無効にする方法もありますが、大企業になるとなかなか難しいかと思います。
そこで今回は以下のVMwareのKBにあるようにレジストリに値を追加します。
実際にやることは以下となります。「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters」にDWORD 値で「ArpRetryCount」キーを作成して値を「0」に設定して、PCを再起動
通常は各PCでレジストリエディタから値を追加していく方法をとるかと思いますが、レジストリを変更は慎重に行う必要があります。
そこで、今回は複数の仮想マシンへ設定を配布するために、PowerShellスクリプト化しました。
レジストリを変更するPowerShellスクリプト
以下のスクリプトを適当な名前で保管します。
私は「ChangeRegArpRetryCount.ps1」というファイルで保存しました。
$RegPath = "Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters"
$RegKey = "ArpRetryCount"
$RegKeyType = "DWord"
$RegKeyValue = 0
# Registory Keyの確認
$Result = Get-ItemProperty $RegPath -name $RegKey -ErrorAction SilentlyContinue
# もしRegistoryがあればなにもしない、ない場合には登録する
if ( $result ) {
Write-Host "Already Exists Registory ... $RegKey"
}
else {
Write-Host "Add New Registory ... $RegKey"
New-ItemProperty $RegPath -name $RegKey -PropertyType $RegKeyType -Value $RegKeyValue
}
PowerShellコンソールを開いてスクリプトを実行します。
※必ず管理者権限で開いてください
実行すると以下のように登録された結果が表示されれば成功です。
PS C:\Users\user\Desktop\ChangeRegArpRetryCount> powershell.exe .\ChangeRegArpRetryCount.ps1
Add New Registory ... ArpRetryCount
ArpRetryCount : 0
PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip
PSChildName : Parameters
PSProvider : Microsoft.PowerShell.Core\Registry
念のため、レジストリエディタからも確認します。
今回は以上となります。
コメント