IPv6の優先度の変更
なかなか普及しないIPv6ですが、気付かずに使っている方も多いかと思います。
訪問先でIPv6や、IPv6 over IPv4等でおかしな挙動が出たりして困ること2014年から10回ほど。
どうにもならない時は、今の所IPv6で困っても、IPv4で困ることはないので、IPv4を優先して使うよう設定しましょう。
WEBで検索ると、よくIPv6自体を無効にしてしまうような解説がありますが、IPv6でしか提供していないサイトやサービスなどが出てきた場合、また問題になってしまいますので、優先度を変更するほうが良いと思います。
そもそもこれは、お使いのインターネット回線がIPv6に対応していなければ関係のない話です。
Windowsで現在のポリシーを確認
現在のIPv6の設定を確認するコマンド
> netsh interface ipv6 show prefixpolicies
出力されたデフォルト設定
C:\Windows\system32>netsh interface ipv6 show prefixpolicies アクティブ状態を照会しています... 優先順位 ラベル プレフィックス ---------- ----- -------------------------------- 50 0 ::1/128 40 1 ::/0 35 0 ::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
詳しくは後で書きますが、ここで必要なのは、
プレフィックスが::ffff:0:0/96 というのがIPv6表記で書くIPv4のアドレスで、::1/0 がIPv6のアドレスで、::1/128 がIPv6のlocalhostのループバックです。
IPv6のアドレスの優先度が40 でIPv4の優先度が35 なので、IPv6が使える場合は優先してIPv6で通信するようになっています。
試しにコマンドプロンプトで、localhostへpingを打ってみましょう。
> ping localhost DESKTOP-CNK97OV [::1]に ping を送信しています 32 バイトのデータ: ::1 からの応答: 時間 <1ms ::1 からの応答: 時間 <1ms ::1 の ping 統計: パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 0ms、最大 = 0ms、平均 = 0ms Ctrl+C
::1 からの応答となっていますのでIPv6で通信しています。
127.0.0.1からの応答だった場合はIPv4で通信しています。
IPv4の優先度を上げる
優先度を40以上にしてあげればいいのですが、ループバックはIPv6で、他はIPv4なんてすると気持ち悪いし、何か問題あるといけないので、60 に設定して一番優先度を高くしてみます。
C:\Windows\system32> netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 60 0 OK
再度確認してみましょう
C:\Windows\system32>netsh interface ipv6 show prefixpolicies アクティブ状態を照会しています... 優先順位 ラベル プレフィックス ---------- ----- -------------------------------- 60 0 ::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
60になっていますね。
一応pingでも確認してみましょう。
>ping localhost DESKTOP-CNK97OV [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 の ping 統計: パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、 ラウンド トリップの概算時間 (ミリ秒): 最小 = 0ms、最大 = 0ms、平均 = 0ms Ctrl+C
127.0.0.1で通信していますね。これでIPv4の優先は完了です。
IPv4優先を元に戻す場合
おわかりかと思いますが、優先度を元に戻してあげればOKです。
C:\Windows\system32> netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 35 0 OK
netsh interface ipv6 show prefixpolicies 確認してみましょう。
Linuxの場合
Linuxの場合は /etc/gai.conf に設定ファイルがあります。
glibcで書いたプログラム内でgetaddrinfoを使っていると、この設定が読まれます。
(詳しくは man getaddrinfo で)
デフォルト状態だと全てコメントされていると思います。
説明は書いてあるとおりなのですが、
# precedence <mask> <value> # Add another rule to the RFC 3484 precedence table. See section 2.1 # and 10.3 in RFC 3484. The default is: # #precedence ::1/128 50 #precedence ::/0 40 #precedence 2002::/16 30 #precedence ::/96 20 #precedence ::ffff:0:0/96 10 # # For sites which prefer IPv4 connections change the last line to # #precedence ::ffff:0:0/96 100
これをコメントを外して
# precedence <mask> <value> # Add another rule to the RFC 3484 precedence table. See section 2.1 # and 10.3 in RFC 3484. The default is: # precedence ::1/128 50 precedence ::/0 40 precedence 2002::/16 30 precedence ::/96 20 #precedence ::ffff:0:0/96 10 # # For sites which prefer IPv4 connections change the last line to # precedence ::ffff:0:0/96 100
の様にすればOKです。
pingも
ss@debian9:~$ ping localhost PING localhost(localhost (::1)) 56 data bytes 64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.060 ms 64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.084 ms 64 bytes from localhost (::1): icmp_seq=3 ttl=64 time=0.089 ms
が
ss@debian9:~$ ping localhost PING localhost (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.034 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.038 ms 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.041 ms
となりなります。
OS Xでは未確認。
IPv6アドレスの説明
念の為出てきたIPv6アドレス表記の説明です。
::/0 IPv6アドレス全般 ::1/128 IPv6でのループバック(localhost) 2002::/16 6to4トンネリング(2002:以下がIPv4アドレスと変換され保持される) 2001:0:/32 Teredoトンネリング(6to4とは別のトンネリング方式) fc00::/7 リンクローカルのユニキャストアドレス fec0::/10 サイトローカルのユニキャストで廃止予定 3ffe::/16 実験用で廃止 ::/96 IPv4互換アドレスで廃止 ::ffff:0:0/96 IPv4のエイリアスの様なアドレス