IPv4の常識 vs IPv6の常識＠家庭内LAN

この記事は[IPv6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ipv6)の24日目の記事です…が、完成が間に合いませんでした！:bow_tone1:~~後日加筆します！~~加筆訂正しました！タイトルも変更してます。（公開時のタイトル：非ネットワークエンジニア向けIPv6の扱い方）

# まえがき
先日もIPv4枯渇が話題となりじわじわとIPv6の浸透も進みつつあるものの、もはや「プロトコル」なんて言葉を知らずとも誰でも簡単にインターネットを使うことができる時代となりました。ほとんどの人がIPv4やIPv6を意識する必要すらなくなっている中でも、例えば自宅サーバなど、インターネットでちょっと凝ったことをしようと思えばある程度の知識はやはり必要です。

この記事は、ネットワークの専門家ではないが、一般的なインターネットユーザよりは「ちょっと凝ったこと」をしてきた人のために書きました。**IPv4で実現してきたことをIPv6でも実現できるように、IPv6の細かい仕様はとりあえず置いといてポイントとなりそうな点をまとめてみました。**なので、IPv6の基礎的な説明や、IPv6のより高度で技術的な内容については、他のサイトをあたってみてください。

なお、正確性については気をつけているつもりですが、なるべく理解のしやすさを優先するために厳密さを犠牲にしている部分がちらほらありますのでご了承願います。もし明らかな誤りや思い違いしている部分を見つけられたら、ご指摘いただけると幸いです。

## 想定の環境
「常識」などと大胆なことを言ってしまっていますが、限定的な条件での話となるため、本職のエンジニアの方にとっては非常識な内容もあるかもしれません。この記事では、以下のような一般の家庭のネットワーク環境を想定しています。

- 家庭用のインターネット回線（光回線、CATVなど）
- 家庭用ブロードバンドルータを利用
- LANにはパソコンやスマホ・タブレットなどが数台

この記事内では、特にことわりのない限り、「ルータ」とは家庭用ブロードバンドルータ、「LAN」とはルータ配下の家庭内のLAN、「端末」とはLAN内のパソコンやスマホ・タブレットなど、「ノード」とはネットワークに接続されたIPアドレスをもつ全機器のことを指しています。

# IPv4の常識 vs IPv6の常識

初っ端からこの記事のまとめです。せっかちな方は表内のリンクから本記事内の詳細説明に飛べますが、最初は上から読んでいくのがおすすめです。

| | IPv4の常識 | IPv6の常識 |
|---|-----------|-----------|
|**アドレス空間の利用**|節約してみっちり使う|[スカスカに使う](#ipv6アドレス空間はスカスカに使われる予定)|
|**LANで使うIPアドレスの種類**|プライベートIPアドレス|[グローバルIPアドレス](#ipv6ではプライベートipやnatnaptは使わなくていい)|
|**LANで使うIPアドレスの割り当て**|ルータがDHCPで若い番号順に割り当て|[端末自身が割り当て（若い番号順ではない）](#インタフェースidの値の決め方)|
|**LAN内端末の外部公開**|ルータのポートフォワーディング設定|[ルータのパケットフィルタリング設定](#ポートフォワーディングの設定は)|
|**利用可能なグローバルIPアドレス**|1つのみ|[最大2の64乗個](#プロバイダから割り当てられるグローバルipアドレスは1つではない)|

こんな感じで、IPv4では常識と思っていたことがIPv6で通用しないことがたくさんあります。ここから、順を追って説明していきます。

# 大前提：IPv6はIPv4とは似て非なるものである
IPv6を知る上でまず最初に理解しておく必要があるのは、**IPv6は単純に「枯渇したIPv4アドレスの桁を増やして補充するためのもの」ではない**ということです。

IPv6はIPv4とは設計思想から変更されています。この点は非常に重要で、IPv6のアドレスの表記方法くらいしか分かっていない状態で、IPv4の設定は朝飯前だし、手探りでできるだろうと思ってIPv6の設定などしようとするとハマります。（←経験済み）

アドレスが長くなって表記方法が変わる以外にも、これまでIPv4では当たり前だった常識が通用しないところがたくさんあるのはそのためです。

# IPv6アドレス空間はスカスカに使われる予定
IPv6がIPv4から変わったことで、一番大きくて有名なのがIPアドレスを表現するために必要な桁数でしょう。IPv4アドレスは32bitで表現するので、表現可能なアドレス数は$2^{32}$（≒43億）個です。これに対しIPv6アドレスは128bit。つまりIPv6アドレスで表現できるアドレス数は**43憶の塊がさらに$2^{96}$（≒1兆×1兆×8万）個（！）**あることになります。数字が大きすぎてピンとこないですが、これは将来のインターネットの拡大を考慮して余裕を持たせているにしても、IPv4アドレスの不足分を補うための数を大幅に超えた量と思われます。

IPv4では設計段階の想定よりも爆発的にIPアドレスが利用されることとなったため、結果的にアドレス空間には利用中のアドレスがみっちり存在し、カツカツに切り詰めて利用することになってしまいました。IPv6ではアドレス空間をあえてまばらに（別の表現で言うと「スカスカに」）使えるような作りとなっています。最初からキリよく全部使おうという気などさらさらなく、各ノード同士のアドレスが簡単にかぶってしまうことがないようにするため、そのようになっっていると考えられます。

# IPv6ではプライベートIPやNAT/NAPTは使わなくていい
IPv4では、「グローバルIPアドレス」と「プライベートIPアドレス」という概念がありました。通常、LAN内の端末にはプライベートIPアドレスを割り当て、端末がWAN側と通信する際にはNATによりルータに割り当てられたグローバルIPアドレスを介すことが一般的でした。

しかし、IPv6においては、**プライベートIPアドレス自体が定義されていません**[^1]。ルータのWAN側IPアドレスはグローバルIPアドレス、LAN内のノードのIPアドレスもグローバルIPアドレスです。
[^1]: 厳密にはプライベートIPアドレスの概念に近い「ユニークローカルアドレス」というものが存在しますが、一般的な家庭のLAN環境では利用されません。

IPv4の常識に囚われていると、このあたりで「？？？」となるので、もう少し詳しく説明します。

## そもそもなぜIPv4でNAT/NAPTが必要だったのか
WAN側がグローバルIP、LAN側がプライベートIPという「常識」が身にしみている人には意外かもしれませんが、実はNAT/NAPTは「IPv4が枯渇しそうだったから」後になって出てきた仕様です。本来はIPv4も、インターネットにアクセスできる全ノードが一意のグローバルアドレスをもち、それぞれが一対一で通信できるような思想でした。しかし43億個じゃ足りなさそうということが後から見えてきたので、仕方なく``192.168.0.0/16``などのプライベートIPをグローバルIPにNATして使うことでグローバルIPを節約するということが「常識」になっていきました。（参考: [ネットワークアドレス変換 - Wikipedia](https://ja.m.wikipedia.org/wiki/ネットワークアドレス変換#技術の概要)、[プライベート網のアドレス割当(RFC 1918) - JPNIC](https://www.nic.ad.jp/ja/translation/rfc/1918.html)）

## プライベートIPじゃないのにセキュリティは大丈夫なの？
「グローバルIP=WAN側からの脅威にさらされる、プライベートIP=WAN側からの脅威から（ある程度）守られる」というイメージを持っている人もいると思います。すると、IPv6ではグローバルIPを持つLAN内の端末もWAN側からの脅威にさらされ、IPv4よりもセキュリティレベルが低くなってしまうのではないかと思われるかもしれません。

しかし、ポイントとなるのは「WAN側から来た意図しないパケットをルータで止める」ということであり、プライベートIPを使うことではありません。プライベートIPを使わずともパケットのフィルタリングは可能です。ルータの実装にも拠るものの、基本的には恐らく一般的な家庭用ルータではIPv6でもIPv4と同等レベルのセキュリティは確保されているものと思います[^2]。
[^2]: 各社のIPv6対応の家庭用ルータを持っているわけではなく、調べたわけでもないので根拠はありません。少なくとも日本の主要メーカーの製品ならそれくらいのことは考慮されているだろう、という希望的観測:sweat_smile:情報求ム。

## ポートフォワーディングの設定は…？
IPv4ではLAN内の端末（の特定のポート）を外部に向けに公開したい場合は、ルータでポートフォワーディングの設定を行い、特定のポートをWAN側のグローバルIPにマッピングする必要がありました。

一方IPv6ではLAN内もグローバルIPなので、ポートフォワーディングの設定は不要です。ただし、先述のとおりセキュリティを確保するため、外部からの着信はデフォルトでは破棄するようになっていると思います。そのため、ルータではポートフォワーディングの設定の代わりに、IPv6パケットのフィルタリング設定により、目的の端末およびポートへの着信を許可してやる必要があるのがポイントとなります。

# プロバイダから割り当てられるグローバルIPアドレスは1つではない
IPv4では、プロバイダから割り当てられるグローバルIPアドレスは1つだけ、というのが基本でした[^3]。ではLAN側の全端末がグローバルIPアドレスのIPv6は、プロバイダからどのようにIPアドレスをもらえるのでしょうか。それを説明するために、先にIPv6におけるアドレスの構造について説明します。
[^3]: IPv4において、そもそもグローバルIPは与えられないプロバイダやプランも存在しますし、オプションによって複数のグローバルIPアドレスをもらうことができる場合もあります。

## ネットワークプレフィックスとインタフェースID
128bitで表現されるIPv6のアドレスですが、実は境界があり、原則は前半64bitと後半64bitに分けることができます。この前半64bit部分を「**ネットワークプレフィックス**」、後半64bit部分を「**インタフェースID（インタフェース識別子）**」と呼びます。

ここで少し唐突な話ですが、「インターネットはネットワークのネットワーク」と言われます。その意味は、

1. 複数のノードを相互に接続して通信できるようにしたひとかたまりを「ネットワーク」と呼ぶ
2. 複数の1.のネットワークを相互に接続して通信できるようにしたものが「インターネット」

…ということを表しています。この1.の中にあなたの家のLANも含まれていて、「ネットワークプレフィックス」は、インターネット内に無数に存在する各ネットワークを識別するためのもの、と言えるでしょう。そして、さらにインターネット内に存在する各ノード（のインタフェース）を識別するのが「インタフェースID」です[^4]。
[^4]: ネットワークにもう少し詳しい人向けにシンプルに説明すると、IPv6ではサブネットマスクが原則ど真ん中の``/64``固定となり、IPv4における「ネットワーク部」=「ネットワークプレフィックス」、IPv4における「ホスト部」=「インタフェースID」、だといえます。

## プロバイダから与えられたネットワークプレフィックス+インタフェースID→IPアドレス完成
ここで話を戻しましょう。IPv6では通常、**プロバイダからは単一のグローバルIPアドレスではなく、単一のネットワークプレフィックスが与えられます**。

IPv6アドレスの前半の64bit部分はプロバイダが指定するので、後半の64bit部分は各々のユーザでご利用のノードにインタフェースID割り当てて使ってね、ということです。つまり、ユーザひとりあたりが使えるグローバルIPアドレスの数はなんと約$2^{64}$個[^5]…！43億×43億個のグローバルIPアドレスが自宅で使えるなんて、IPv4のことから考えるといかに非常識なことか。
[^5]: あくまでIPv6の仕様による論理的な上限数であって、実際には様々な制約からそんなに大量のノードを接続することは普通できません。

## インタフェースIDの値の決め方
これで、LAN内のノードに割り当てるIPv6アドレスの前半部分（ネットワークプレフィックス）はプロバイダから指定されて決まりました。あとは後半部分（インタフェースID）を決めれば、IPv6アドレスは完成しそうです。

IPv4のLANでは、プライベートアドレスの``192.168.0.``など前半の第1〜第3オクテットまでは決まっていて（``/24``の場合）、残りの第4オクテット部分の値はルータがDHCPで割り当て、その値は空いている若い番号から順番に…というのが一般的でした。「IPアドレスの前半部分が決まっていて、後半部分の値を割り当てることでIPアドレスを構成する」という流れはIPv4のLANにおけるプライベートIPアドレスの割り当てとそっくりですが、**IPv6では、DHCPも必要ないし、若い番号順に割り当てもしません**。DHCPを使わず、ノード自身がインタフェースIDを決めて、IPアドレスが出来上がります[^6]。
[^6]: 厳密には、ノード自身が勝手に判断するのではなくルータ（自宅の家庭用ブロードバンドルータのこともあれば、プロバイダの設備のこともある）との「RS (Router Solicitation)」や「RA (Router Advertisement)」といったメッセージに相互に必要な情報を乗せてやり取りすることになります。また、DHCPが無くなったわけではなく、DHCPv6というものが存在し、そちらが利用される環境もあります。

このインタフェースIDの決め方（形式）には色々な方法がありますが、最も一般的なものが「Modified EUI-64」です。また、ランダムな値を使うこともあります。

### Modified EUI-64
IPアドレスは、他のホストとかぶらない、一意な値をインタフェースに割り当てる必要があります。インタフェースで一意な値といえば…そう、MACアドレスがあるじゃないか。

ということで、MACアドレスをある規則によって変形することで生成される値の形式を「Modified EUI-64形式」と言います。変形の規則はググればたくさん出てきますのでここでは説明しません。

簡単に一意なIDが生成できるものの、ほとんどMACアドレスそのものをそのまま使うに近く、もとのMACアドレスがバレバレなのが難点です。

### ランダムな値
プライバシー確保のため、単純にランダムな値をインタフェースIDとして利用し、一定時間ごとに別のランダムな値を再度割り当てるということも一般的なようです。

# IPv6では1つのインタフェースに複数のIPアドレスが付与されるのが普通
IPv4では、1つのインタフェースに1IP、が基本です。複数IPを割り当てることもできますが、利用シーンは一部のサーバ用途など、限られた要件で必要となる場合のみでした。

一方IPv6の場合、ただWebブラウジングするだけの端末でも、一般的な構成のネットワークに繋がっていれば、**少なくとも2つ以上のIPv6アドレスがインタフェースに割り当てられている**はずです。手元のPC、スマホでIPv6ネットワークに接続されているものがあれば、IPv6アドレスを確認してみてください。

Windowsの場合、その端末をつないでいるルーターと回線がIPv6に対応していれば、デフォルトでも恐らく以下の3つのIPv6アドレスが割り当てられていると思います。

- IPv6アドレス
- 一時IPv6アドレス
- リンクローカルIPv6アドレス

ちなみに、もしリンクローカルIPv6アドレスしかないのであれば、その端末はインターネットにIPv6ではアクセスできません。

それでは、これらの役割と使い分けについて見てみましょう。

## IPv6アドレス、一時IPv6アドレス
IPv6アドレスは、「プロバイダから割り当てられたネットワークプレフィックス」+「Modified EUI-64形式のインタフェースID」となっていると思います。そして、一時IPv6アドレスは「プロバイダから割り当てられたネットワークプレフィックス」+「ランダムな値のインタフェースID」となっています。

どちらもグローバルIPアドレスなので、インターネットには繋がっています。プライバシーへの配慮のためか、デフォルトでは一時IPv6アドレスが使われるようで、通信相手にはこの一時IPv6アドレスが見えることになります。（[ipv6-test.com](https://ipv6-test.com/)などで確認できます）

IPv6アドレスのほうの使い所ですが、LAN内の端末をサーバとして利用したいようなときは、（ネットワークプレフィックスやNICのMACアドレスが変わらない限りは）IPアドレスが変化しない、こちらのアドレスを使うのがよいかと思います。ただし不特定多数に公開する場合はMACアドレスがバレバレな点に注意が必要です。

## リンクローカルアドレス
残るはリンクローカルIPv6アドレスですが、ネットワークプレフィックス``fe80::/64``+「Modified EUI-64形式のインタフェースID」となります。

IPv6のリンクローカルアドレスについて言及する前に…IPv4のリンクローカルアドレスはご存知でしょうか？IPv4のリンクローカルアドレスは、同ネットワーク上にある他のリンクローカルアドレスと重複しない``169.254.0.0/16``（範囲は``169.254.1.0`` ~ ``169.254.254.255``）のアドレスとなります。IPv4においてこのリンクローカルアドレスが登場するシーンと言えば、最もポピュラーなのはIPアドレスを自動取得設定にしているにもかかわらず、何らかの理由でDHCPによるIPアドレス割り当てができなかったときでしょう。Windowsにおいて、PCか家庭用ルーターの調子が悪く「インターネットなし」となった際にこのリンクローカルアドレスを見たことがある方もいらっしゃるのでは？「インターネットにはつながらないものの、自動設定なので一応付いたアドレス」というような脇役的なイメージを持たれているかもしれません。

IPv6のリンクローカルアドレスも、周囲と重複しない、インターネットにはつながらないアドレス（同ネットワーク内にある他のリンクローカルアドレスとは通信できる）、という点はIPv4のそれと同じ特徴を持っています。

しかしIPv6におけるリンクローカルアドレスは、脇役のような位置付けだったIPv4のそれとは異なり、インタフェースが有効化されている限り**常に**インタフェースに割り当てられるようになっています。

IPv6におけるリンクローカルアドレスは、「LAN内の機器同士がネットワークを維持・構成するために利用されるアドレス」という役割を持っていると考えてよいと思います。IPv6では、先に述べたとおり、DHCPのような機構がなくとも端末を接続するだけでそのネットワークに参加できるような仕組みがIPv6のプロトコルの中に包含されています。それを実現するために、このような内部専用のアドレスが必要不可欠な存在となっています。主役ではないものの、常に存在感を放つ最優秀助演俳優くらいに大躍進を遂げました。

リンクローカルアドレスは外部公開などには使えませんが、MACアドレスさえ分かれば割り出すことができるアドレスなので、LAN内でのノードの管理やテストなどには使いやすいアドレスと言えると思います。例えば、IPv6対応の機器であれば、何の設定もしてなくてもLANケーブルを繋いでリンクアップした直後からリンクローカルアドレスへはPingを飛ばせられるはずです。

# あとがき
思ったよりボリュームのある内容となってしまいました。

徐々に世間から意識・認知されつつあるIPv6ですが、まだまだ出回っている情報の量も質もIPv4とは比べ物にならず、一般ユーザレベルにはハードル高い感が否めません。Web上のIPv6についての情報は、私が勉強した頃は大抵、概要程度のことしか載ってないサイトと、バリバリのネットワークエンジニア向けっぽいサイトのいずれかに偏っていました。（今はもっとちょうどいいのがあるのかもしれませんが…）

いまIPv4で色々なことができているのにIPv6は食わず嫌いしている、以前の自分のような方が一歩踏み出せるきっかけとなればと思い、この記事を書きました。IPv6の普及に少しでも貢献できれば幸いです。（LinuxインストールしてまずSELinuxとIPv6無効にするのはもう昔の話…ですよね！）

最後に、この記事を書くにあたり大いに参考にさせていただいた、無料で読める電子書籍をご紹介します（有償版、紙版もあります）。専門書なので難しいところもあると思いますが、ここまでしっかりまとまった内容が無料なのは読まない手はありません。超おすすめです。作者の方、関係者の方々にこの場を借りて御礼申し上げます。

[すごいIPv6本を無料配布！:Geekなぺーじ](https://www.geekpage.jp/blog/?id=2018-7-4-1) （作者の方のBlog）

窓の杜からPDFでさくっとダウンロードできます。

[「プロフェッショナルIPv6」IPv6の解説書 - 窓の杜](https://forest.watch.impress.co.jp/library/software/proipv6/)