IPv6の優先度の変更

2017年7月3日Linux,server,Windows,Windows,ブログ

なかなか普及しない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のエイリアスの様なアドレス