Home > Windows にまつわる e.t.c.

IPv4 を IPv6 より優先にする


Windows 7(Vista も同様)は、IPv4 より IPv6 が優先されるようになっているので、IPv4 Only 環境では(結果的に)通信が遅くなるケースがあります。

この対処方法として、IPv6 を OFF にするって手が良く使われますが、Windows 7 で提供されたホームネットワーク等の IPv6 で提供されているサービスが使えなくなる弊害が起きますし、IPv4 アドレスが枯渇して知らない間に IPv6 サービスの提供が始まっていたって時にその恩恵を受けられないことになります。

遅かれ早かれ、IPv6 がインターネットのスタンダードプロトコルになるので、IPv6 Only の Web サーバーやインターネットサービスが順次始まります。その時に、IPv6 が OFF になっているとそれらを使えないって事になります。

なので、 僕のおすすめは、IPv6 を OFF にするのではなく、IPv4 を優先にする設定です。

IPv4 を IPv6 より優先にするには、RFC4291 IPv6 Addressing Architecture で定義されている IPv4-Mapped IPv6 Address(::ffff:0:0/96)を最優先にすればよい訳です。

現在設定されている優先順位を見るには「netsh interface ipv6 show prefixpolicies」で確認できます。(カッコ内は僕が追記)

 

優先順位     ラベル  プレフィックス
----------  -----  --------------------------------
             50        0  ::1/128  (ループバック)
             40        1  ::/0  (IPv6通信全般)
             30        2  2002::/16  (6to4)
             20        3  ::/96  (IPv4互換)
             10        4  ::ffff:0:0/96  (IPv4マップ)
              5         5  2001::/32  (Teredo)

 

これを見ると、IPv4通信は Teredo より優先されている程度で、その他の IPv6 および 移行プロトコルより優先順位が低い設定されていることがわかります。

試にこの状態で localhost に対して ping を飛ばすと、IPv6 での応答になります。

 

C:\>ping localhost

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

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

 

IPv4 を IPv6 より優先させるには、::ffff:0:0/96 の IPv4 マップの優先順位を、::1/128 のループバックより上位に変更すれば良い訳です。

 

<変更コマンド(要管理権限)>
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 50 0
netsh interface ipv6 set prefixpolicy ::1/128 40 1
netsh interface ipv6 set prefixpolicy ::/0 30 2
netsh interface ipv6 set prefixpolicy 2002::/16 20 3
netsh interface ipv6 set prefixpolicy ::/96 10 4

 

この状態で netsh interface ipv6 show prefixpolicies を使って優先順位を確認すると...

 

優先順位     ラベル  プレフィックス
----------  -----  --------------------------------
             50        0  ::ffff:0:0/96
             40        1  ::1/128
             30        2  ::/0
             20        3  2002::/16
             10        4  ::/96
              5         5  2001::/32

 

期待通りに ::ffff:0:0/96 が最優先になっていますね。

この状態で localhost に対して ping を飛ばすと、IPv4 での応答になります。

 

C:\>ping localhost

mura-LooxP70YN [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 の再起動をします。

 

<デフォルトに戻すコマンド>
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 ::/96 20 3
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 10 4

 

 

Copyright © MURA All rights reserved.