Windows OS の構成を考える際に、IPv6 の設定をどうするかはちょっとした悩みの種だ。
Windows は割と昔から(具体的に言うと Vista 以降)デフォルトで IPv6 が有効化されている。更に IPv4 よりも優先度が高く設定されているため、トラブルの原因になることも多い。
クライアント OS はともかく、Windows Server の構築を行う際は IPv6 のチェックボックスを外して、無効化することが多いのではないだろうか。
入門用の書籍などでも IPv6 のチェックを外すことで IPv6 を無効化する方法は普通に書かれる。
使用するネットワークで IPv6 を使用していない場合や、使用していても IPv6 を禁止したい場合には、[インターネットプロトコルバージョン 6] チェックボックスをオフにする。
この手順で行っている IPv6 の禁止は、行わなくても問題となることはほとんどない。ただしネットワークの構成が原因でインターネットのアクセスが遅い場合や接続できない場合に、IPv6 を禁止すると改善されることもある。
ひとり情シスに贈るWindows Server 2008/2008 R2からのサーバー移行ガイド より引用
ひとり情シスに贈るWindows Server 2008/2008 R2からのサーバー移行ガイド
posted with ヨメレバ天野 司 日経BP 2019年07月05日
しかし、実はこの「インターネット プロトコル バージョン 6 (TCP/IPv6)」のチェックを外したからといって、IPv6 が完全に無効化されるわけではない。
いくつかのシステムでは、この操作(NICのプロパティで IPv6 のチェックを外す)だけを行うと逆に問題が発生することがあります。システム全体で IPv6 を完全に無効にするためにはレジストリの設定を変更します。
Windowsインフラ管理者入門 より引用
上記の通り、IPv6 を完全に無効化するためにはレジストリを編集しなければならない。
Contents
IPv6 の優先度を下げる
しかし、そもそも IPv6 を無効化することは Microsoft 的にNGだ。
重要 インターネット プロトコル バージョン 6 (IPv6) は、Windows Vista および Windows Server 2008 以降のバージョンで必須の部分です。 マイクロソフトは、IPv6 またはそのコンポーネントを無効にすることは推奨しません。 無効にすると、一部のコンピューターは機能しなくなることがあります。
Microsoft サポート – 上級ユーザー向けに Windows で IPv 6 を構成するためのガイダンス
現在の Microsoft の IPv6 に関する推奨は「無効化」ではなく、「IPv6 よりも IPv4 を優先する」となっている。
以下のキャプチャのとおり、「IPv6 よりも IPv4 を優先する」のコメントには「無効にする代わりに推奨されます。」と記述されている。
当該ドキュメントによると、「HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥TCPIP6¥Parameters」にある「DisabledComponents」のレジストリ値を変更することで IPv6 に関する設定が行えるとのことだ。
下図は Windows Server 2012 R2 で実際にレジストリを参照したものだが、デフォルトでは存在しなかった。
IPv4 の優先度の上げ方
「DisabledComponents」は手動で作成することも可能だが、Microsoft が提供しているツールを使用するのが最も簡単で確実だ。
先ほどのドキュメント内に「IPv6 またはそのコンポーネントを自動的に無効化または再有効化する」という項目がある。
この中の「プレフィックス ポリシーで IPv6 よりも IPv4 を優先する」というツールを利用すれば簡単に IPv4 を優先できるので、「Download」をクリックしてダウンロードする。
すると、「MicrosoftEasyFix20166.mini」というファイルがダウンロードされる。
「MicrosoftEasyFix20166.mini」を実行する前に、以下のコマンドで現在の IPv4 の優先度を確認しておく。
>netsh interface ipv6 show prefixpolicies
「::ffff:0:0/96」が IPv4 に関するプレフィックスだが、優先順位が “35 ” なので、上から3番目の優先度となる。
優先順位が確認できたので「MicrosoftEasyFix20166.mini」をダブルクリックで実行する。
「簡易修正ツール ID: 20166」と表示されるので、「次へ」をクリックする。
「簡易修正ツール (ID: 20166) 解決済み」となるので、「閉じる」をクリックする。
下図から分かる通り、「MicrosoftEasyFix20166.mini」の実行後は再起動が必要なので、再起動を実施する。
先ほどは優先順位 “35” だった「:::ffff:0:0/96」が、優先順位 “50” になっている。つまり、最も優先される。
IPv6 の優先度の上げ方
「MicrosoftEasyFix20166.mini」を実行したはいいものの、元の設定に戻す必要が出てくる可能性もある。
そんな時は「プレフィックス ポリシーで IPv4 よりも IPv6 を優先する」のリンクから「MicrosoftEasyFix20171.mini」をダウンロードし、実行する。
「簡易修正ツール ID: 20171」と表示されるので「次へ」をクリックする。終了後は「閉じる」をクリックし、再起動を行う。
上記の手順を実施することで、元の設定に戻すことが可能だ。
レジストリで設定する
冒頭では存在しなかった「DisabledComponents」だが、MicrosoftEasyFix を実行していくうちに作成されている。もちろん、手動で作成してもいい。
この「DisabledComponents」をダブルクリックすることでも設定を変更することができる。
Microsoft サポートの情報を抜粋すると、以下のように設定すれば期待する設定になるようだ。
IPv6 よりも IPv4 を優先する
- Dec 32
- Hex 0x20
- Bin xx1x xxxx
IPv6 を無効にする
- Dec 255
- Hex 0xFF
- Bin 1111 1111
Tips ~ Dec、Hex、Bin ~
Dec(Decimal)は10進数、Hex(Hexadecimal)は16進数、Bin(Binary)は2進数をあらわす。
下図は16進数(Hex)で “20” なので、「IPv6 よりも IPv4 を優先する」が設定されている。
例えばこれを “FF” にすれば、「IPv6 を無効にする」になる。
手動で設定した場合も、設定が反映されるのは再起動後だ。
イーサネットのプロパティによる IPv6 の無効化
レジストリで IPv6 を無効にしても、イーサネットのプロパティの「インターネット プロトコル バージョン 6 (TCP/IPv6)」のチェックボックスは外れない。
Microsoft サポートに以下の記述がある。
DisabledComponents レジストリ値はチェック ボックスの状態に影響がありません。 そのため、DisabledComponents レジストリ キーで IPv6 を無効にする設定でも、各インターフェイスの [ネットワーク] タブのチェック ボックスをオンのままにすることができます。 この動作は仕様です。
Microsoft サポート – 上級ユーザー向けに Windows で IPv 6 を構成するためのガイダンス
プロパティによる IPv6 の無効化で何が変わるのか
レジストリで無効化しても、NICのプロパティの IPv6 のチェックボックスが外れないのであれば、このチェックボックスってなんなの?といった疑問が生じるかもしれないが、これについては、Microsoft Technet に簡潔にまとめられている。
IPv6 トンネル インタフェースについては、物理 NIC の IPv6 チェック ボックスを OFF にしても無効化されません。
Microsoft Technet – 連載 IPv6 入門 – 第三回 IPv6 の無効化方法
プロパティの IPv6 のチェックボックスを外しても IPv6 トンネル インタフェースについては無効化できないらしい。
レジストリから無効化する場合、IPv6 トンネルインタフェースを含めた全てのIPv6 コンポーネントを無効化することができる。
※ただし、Windows Vista 以降は IPv6 の完全アンインストールが不可能なため、自分自身である Loopback インタフェースを無効化することはできない。
IPv6 トンネルインタフェースとは
IPv6 トンネルインターフェイスとは、IPv4の中に作られている仮想的なIPv6用のネットワークのことだ。
「トンネリング」とは、2つのホストや拠点間に仮想的なトンネル(パイプ)を作成し、その中にネットワークトラフィックを流す方式である。
離れた場所にある2つのIPv4ネットワーク同士をIPv6上に構築したトンネルを経由してつないだり、逆に、2つのIPv6ネットワーク同士をIPv4上に構築したトンネルを経由してつないだりする。
エンド・トゥ・エンドではIPv4もしくはIPv6同士で通信するが、異なるプロトコルのネットワーク上で通信するために使われる。
@IT – 最終回 IPv4とIPv6の相互運用
トンネリングは、IPv4ネットワークを経由してIPv6の通信を行う通信方式です。
IPv4ネットワークを経由するためにIPv6パケットはIPv4パケットにカプセル化した上で転送されます。
ネットワークエンジニアとして – IPv6 Tunnel – ipv6ip / gre ip / 6to4 / isatap
「FF」と「11」の違い
トンネルインターフェイスを理解したところで気になるのが、DisabledComponents の「FF」と「11」の違いだ。
16進数で “FF” の「IPv6 を無効化する」と、16進数で “11” の「非トンネル インターフェイス (ループバックを除く) および IPv6 トンネル インターフェイスで IPv6 を無効にする」は、どちらもやっていることは同じに見える。
少し分かり辛いが、その答えは同サイトに存在する以下の表だ。
それぞれ以下の意味を持つ。
なお、Windows はリトルエンディアン方式なので、Binary の値は逆になる。
Bit 0 | このビットを1に設定すると、ISATAP、Teredo、6〜4、およびIP-HTTPSを含むすべてのIPv6トンネルインターフェイスが無効になる。 |
Bit 1 | このビットを1に設定すると、すべての6to4トンネルインターフェイスが無効になる。 |
Bit 2 | このビットを1に設定すると、すべてのISATAPベースのインターフェイスが無効になる。 |
Bit 3 | このビットを1に設定すると、すべてのTeredoベースのインターフェイスが無効になる。 |
Bit 4 | このビットを1に設定すると、LANおよびPPPインターフェイスを含むすべてのIPv6非トンネルインターフェイスが無効になる。 |
Bit 5 | このビットを1に設定すると、既存のプレフィックスポリシーでIPv4を優先する。 |
Bit 6 | 将来使用するために予約されているため、0に設定したままにする。 |
Bit 7 | このビットを1に設定すると、すべてのIP-HTTPSベースのインターフェイスが無効になる。 |
Reference:Installing and Configuring Windows Server 2012 Training Guide: Network Administration
つまり、大元の IPv6 トンネルインターフェイスと IPv6 非トンネルインターフェイスのみを無効化している「11」に対し、「FF」は個別のインターフェイスもすべて無効化している。
もし IPv6 を完全に無効化したいということであれば「FF」を設定した方が無難なのかもしれない。
IPv6 を無効化した結果こういうことも・・・
Windows の名前解決において、LLMNR(Link-Local Multicast Name Resolution)というものが存在する。
本来 LLMNR は同一ネットワーク内の IPv4・IPv6 名前解決をマルチキャストで実行するプロトコルだが、Windows Server 2016 で IPv6 を無効化した結果、LLMNRのパケットが飛ばなくなった。Windows Server 2008 でも同様の結果が得られた。
つまり、本来は実行されるはずの LLMNR による同一ネットワーク内の名前解決が実行されなくなる。
IPv6 を無効化するのではなく、IPv4 の優先度を高くすることで LLMNR の名前解決も実行され、IPv4 を優先とした通信を実行することができる。
※ LLMNR の詳細は以下の記事を参照。
LLMNRとNBTとは – DNS サーバが無いのに名前解決ができる理由
まとめ
最後は IPv6 の無効化の話になってしまったが、Microsoft の推奨が IPv4 の優先度を上げることである以上、それに従った方がいいだろう。
IPv6 を無効化してしまうと LLMNR が動作しないなど、Windows の一部の機能が利用できなくなることもある。(上記の LLMNR のような予想外の見落としが発生する可能性もある)
ただし、「IPv4 の優先度を上げる」という設定変更は目に見えて分かりづらいので、設定内容を記録しておくことが重要だ。