覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Windows - IPv6 より IPv4 を優先させたい

現在 Windows 10 を利用してる状況にあります。

この環境で ping localhost とやると

C:\WINDOWS\system32>ping localhost

DESKTOP-PC001 [::1]に ping を送信しています 32 バイトのデータ:
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms
::1 からの応答: 時間 <1ms

::1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms

上記のような結果になり、localhost へのping は、 IPv6 での応答になっていることが分かります。

これは、IPv4よりもIPv6 が優先されているから ということなんですが、

netsh interface ipv6 show prefixpolicies コマンドを実行することで優先順位が確認できます。
(以下の結果では IPv6の通信が優先されています)

C:\WINDOWS\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        50      0  ::1/128
        40      1  ::/0
        35      4  ::ffff:0:0/96
        30      2  2002::/16
         5      5  2001::/32
         3     13  fc00::/7
         1     11  fec0::/10
         1     12  3ffe::/16
         1      3  ::/96
プレフィックス 説明
::1/128 IPv6 ループバックアドレス
::/0 IPv6 デフォルトルート
::ffff:0:0/96 IPv4-mapped IPv6 address


IPv4を優先させる

::ffff:0:0/96 (IPv4-mapped IPv6 address) を最も優先順位が高い状態にすれば、IPv4での通信が優先されるようになります。

そのために優先順位を変更する必要があります。
管理者権限で、コマンドプロンプト(or Windows Termianl)を起動して以下を実行します。

netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 55 4
netsh interface ipv6 set prefixpolicy ::1/128 50 0
netsh interface ipv6 set prefixpolicy ::/0 40 1
netsh interface ipv6 set prefixpolicy 2002::/16 30 2
netsh interface ipv6 set prefixpolicy 2001::/32 5 5
netsh interface ipv6 set prefixpolicy fc00::/7 3 13
netsh interface ipv6 set prefixpolicy fec0::/10 1 11
netsh interface ipv6 set prefixpolicy 3ffe::/16 1 12
netsh interface ipv6 set prefixpolicy ::/96 1 3


netsh interface ipv6 show prefixpolicies コマンドを実行して優先順位が変更されていることを確認します。

C:\WINDOWS\system32>netsh interface ipv6 show prefixpolicies
アクティブ状態を照会しています...

優先順位   ラベル  プレフィックス
----------  -----  --------------------------------
        55      4  ::ffff:0:0/96
        50      0  ::1/128
        40      1  ::/0
        30      2  2002::/16
         5      5  2001::/32
         3     13  fc00::/7
         1     11  fec0::/10
         1     12  3ffe::/16
         1      3  ::/96

::ffff:0:0/96 が一番上(最優先)になっていることが分かります。


この状態で ping localhost を実行してみると以下の通り IPv4 での応答 になっていることが分かります。

C:\WINDOWS\system32>ping localhost

DESKTOP-PC001 [127.0.0.1]に ping を送信しています 32 バイトのデータ:
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128
127.0.0.1 からの応答: バイト数 =32 時間 <1ms TTL=128

127.0.0.1 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms


優先順位を元に戻す

仮に優先順位を元に戻す場合は 管理者権限で netsh interface ipv6 reset を実行して PC を再起動します。