Windows Server 2012 や Windows Server 2012 R2では、2 つ以上の IP アドレスを持っている場合、バインド順やメトリックを変更しても使用する IP アドレスを変更できない、という仕様があります。
詳細は以下のサイトに記載されています。
「使用する IP アドレスを変更できない」とは、OSI 参照モデルで 3 層 (ネットワーク層) はルーティングに従うため、スタティックルートの追加等で動作を制御することが可能ですが、7 層 (アプリケーション層) で gethostbyname 関数や getaddrinfo 関数を使用しているソフトウェアがあれば、その際に仕様する IP アドレスを明示的に変更できない、という意味になります。
バインド順やメトリックを変更してもダメ、ということは仕様なので仕方がないとしても、それなら、そもそもどんな順番で IP アドレスを選択しているのか?、という疑問が出てきます。
で、検証してみました。
その結果は、「後で追加した NIC (アダプター) が優先される」という規則があるようです。
但し、NIC チーミングで作成した仮想 NIC (アダプター) を再作成しても、この法則に当てはまらないこともあり、よく分からない。。。という結論です。
この規則を逆手にとって、明示的に使用したい IP アドレスがあれば、そのアダプターを後で作成する(すでに作成しているのであれば再作成する or IP アドレスをアダプター間で入れ替える) ことで解決策とできる可能性があります。
確実な回避策としては、LAN ケーブルを差し替え、IP アドレスも入れ替える、ということになりそうですが。。
以下に NIC を追加した際に PowerShell の GetHostByName がどの順番で、IP アドレスを返すか検証した結果を記述していきます。
Ethernet0 と Ethernet1 の 2 つのアダプターが存在し、アダプターは Ethernet0 を先に作成し、Ethernet1 を後に作成しています。
C:\> ipconfig
Windows IP 構成
イーサネット アダプター Ethernet0:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.152.130
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.152.2
イーサネット アダプター Ethernet1:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 172.168.152.111
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .:
C:\>
Powershell で GetHostByName を使用して IP アドレスを返す順番を確認すると、Ethernet1 が最初に返されています。
PS C:\> [System.Net.DNS]::GetHostByName("") | foreach { $_.AddressList.IPAddressToString }
172.168.152.111
192.168.152.130
PS C:\>
この状態でも、後で追加したアダプターが 1 番目に取得されていることが確認できますが、さらに 3 つ目のアダプター Ethernet2 を追加し、バインド順は一番最後 (3番目) にします。
C:\> ipconfig
Windows IP 構成
イーサネット アダプター Ethernet0:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 192.168.152.130
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.152.2
イーサネット アダプター Ethernet1:
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 172.168.152.111
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .:
イーサネット アダプター Ethernet2:
接続固有の DNS サフィックス . . . . .: localdomain
リンクローカル IPv6 アドレス. . . . .: fe80::4474:79fc:b42a:938e%18
IPv4 アドレス . . . . . . . . . . . .: 192.168.152.134
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: 192.168.152.2
C:\>
Powershell で GetHostByName を実行すると、バインド順が最後の Ethernet2 が一番最初に返されていることが分かります。
PS C:\> [System.Net.DNS]::GetHostByName("") | foreach { $_.AddressList.IPAddressToString }
192.168.152.134
172.168.152.111
192.168.152.130
PS C:\>
以上、Windows Server 2012 以降でIPv4 アドレスが返される順番について、でした。