この記事は、ニューノーマル ぴょこりんクラスタ Advent Calendar 2020 のために書いたものです。 このAdvent Calendarが何なのかについては、主催者による紹介記事を見てください。
はじめに
今年の5月まで、インターネットプロバイダはIPv6対応しているにも関わらず、機器設定をサボってIPv4のみで生活をしていた。 我が家はEdgeRouter Xを使っていて、先人がIPv6対応のためにいろいろやった記事が転がっているので、 ともかくも使えるようになったわけだけど、IPv6については相変わらずよくわからない。 なので、IPv6について勉強したことを何回かに渡ってまとめることにする。
目標
ルータの設定で困らないくらいにはIPv6を理解する。
まとめる予定の内容
自分がEdgeRouter設定してよくわからなくて、都度調べたのはこんなところ。 前半3つを今回の記事、最後の1つを次回の記事で記載する。
余談:IPv6ってそもそも何で作ったんだっけ
IPv4アドレスは32bitで表現されるので、合計40億個くらいのアドレスが定義できる。 これが足りなくなった*1ので、 128bitで表現されるIPv6アドレスにして、もっとたくさんのアドレスを定義できるようにした。 *2
IPv6アドレスの表記法
まずは目に見えるところから入ることにする。
表記方法まとめ
- IPv6アドレスは、16bitごとに
:で区切って、16進数で表記する - 長いので、省略して書くことが推奨されている
細かいところ
IPv4では、8bitごとにドット(.)で区切り、10進数で表記をする。
例えば、192.168.0.1 のようなものである。
IPv6では、16bitごとにコロン(:)で区切り、16進数で表記をする。
JPNICのウェブページに
記載の例を引用すると、こんな感じ。
2001:0db8:1234:5678:90ab:cdef:0000:0000
見てわかる通り、IPv6アドレスは人間が扱うには大変長いので、 表記する際に省略が許されている。RFC4291で省略のルール、 RFC5952で推奨の書き方が定められている*3。
省略のルールは以下の通り。
- ルール1:
:で区切られた内部を16bitフィールドと呼び、16bitフィールド内がすべて0になるものを16bit 0フィールドと呼ぶ。 16bit 0フィールドが2個以上連続する場合、その部分を::と省略して書いてもよい。 ただし、2個以上連続する区間が複数ある場合は、1個だけ省略可能(2個以上省略するとアドレスがわからなくなるため)。 - ルール2: 16bitフィールドの中で、先頭から連続する0は省略しても良い。ただし、
ルール1で
::と書けない部分に関しては、0を1個記載する必要がある。
16進数のa~fは大文字小文字どちらでもよいことになっているようなので、 このルールに従うと、以下のような例になる。
元のIPアドレス→2001:0db8:0000:0000:3456:0000:0000:0000 こう書いても良い→2001:0db8::3456:0000:0000:0000 ※前半の0を省略 こう書いても良い→2001:0db8:0000:0000:3456:: ※後半の0を省略 こう書いても良い→2001:db8:0:0:3456:: ※後半の0を省略して、前半は0を1つだけ書く こう書いても良い→2001:db8::3456:0:0:0 こう書いても良い→2001:db8:0:0:3456::0 これはダメ→2001:0db8::3456:: ※3456の前後がいくつ省略しているか一意に定まらないため こう書いてもよい→2001:DB8:0:0:3456:: ※大文字に変えた
見てもらうと分かる通り、1つのアドレスに対していろいろ表現してよいことになっているが、 これだと一致確認が大変なので、RFC5952で推奨の書き方が定められている。
- 16bitフィールド内の先頭の0は必ず省略すること
::で可能な限り省略すること- 16bit 0フィールドが1つだけの場合は、省略禁止
::で省略可能な部分が複数ある場合、最も多いものを選ぶこと。 同数の場合は、前方を優先する。- 小文字を使うこと
先に出した例だと、こうなる。
元のIPアドレス→2001:0db8:0000:0000:3456:0000:0000:0000 省略形→2001:db8:0:0:3456::
IPv6アドレスの構造と種類
IPv4アドレスには、ネットワークを表すサブネットマスクがあったり、 127.0.0.1のような自分自身を表す特別なアドレスがあったり、 ブロードキャストできるアドレスなど、いろいろなタイプのアドレスあった。 IPv6ではどうか?
サマリ
細かいところ1:アドレスの構造
IPv4アドレスもIPv6アドレスも、アドレスのうち、 前半n bitをネットワーク、残りをネットワークにつながる装置を表すものとして考える。
例えば、我が家では、192.168.0.XがIPアドレスで、255.255.255.0がサブネットマスクになっている。 192.168.0.の部分までがルータが管理するネットワークを表し、最後のXがネットワークにつながる装置を表す。 サブネットマスクは、アドレスの先頭何bitまでがネットワークのID的なものになっているかを示すもので、 255.255.255.0だと、先頭24bit(255 = 8つのbitが全部1)。 固定されているbit長だけわかればよいので、単に192.168.0.X/24と書くこともある。
IPv6も基本的には同じ考え方で、前半n bitがサブネットプレフィックス、 後半128-n bitがインタフェース識別子(=ネットワークに繋がる装置を識別する番号)となっている。インタフェース識別子についてはまたのちほど。
IPv4のようなサブネットマスク表記はせず、単に/<サブネットプレフィックスのbit数>という表記をする。
IPv6アドレスの種類
サマリ
- IPv6アドレスは、ユニキャストアドレス(1対1)、エニーキャストアドレス(1対グループ内の誰か1人)、マルチキャストアドレス(1対多)の3種に大別できる。インターネット接続に必要なのは、ユニキャストアドレス。
- IPv4でグローバルIPアドレスと呼んでいたのが、グローバルユニキャストアドレス。 これが設定されれば、インターネットと通信ができる。
- IPv4にはないリンクローカルユニキャストアドレスというのもあるが、これは ルータを超えない通信に使うもので、ルータを超える必要があるインターネットとの通信には使えない。
- IPv6では、ユニキャストアドレスはインタフェース識別子のbit長が64bitとなる。
細かいところ2:アドレスの種類
IPv6アドレスは、ユニキャストアドレス(1対1)、エニーキャストアドレス(1対グループ内の誰か1人)、 マルチキャストアドレス(1対多)の3種に大別できる。 インターネットに繋ぐのに必要なのはユニキャストアドレス。
ユニキャストアドレスは、リンクローカルユニキャストアドレスと、グローバルユニキャストアドレスに 分類できる。インターネット接続に必要なグローバルユニキャストアドレスは、 xx以外みたいな定義をしているようなので、 本記事であまり重要でないものまで含めてアドレス表記をまとめると、以下の表の通り。
| アドレス名 | アドレス表記 | メモ |
|---|---|---|
| 未指定 | ::/128 | 全部0 |
| ループバック | ::1/128 | IPv4でいうところの127.0.0.1。最後のbitだけ1 |
| 文書用 | 2001:db8::/32 | こういう文書用に確保しているアドレス |
| マルチキャストキャストアドレス | ff00::/8 | |
| リンクローカルユニキャストアドレス | fe80::/10 | |
| グローバルユニキャストアドレス | 上記以外全部 |
例えばWindowsでipconfigコマンド叩いたり、Linuxでipコマンド叩いたりすると、 ルータでIPv6設定を何もしていなくても、場合によってはIPv6アドレスが見えることもあるが、 これはリンクローカルユニキャストアドレスである。
# Linuxの場合。scope linkになっていて、リンクローカルユニキャストアドレスであることを示している。
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link dynamic
valid_lft forever preferred_lft forever
# Windowsの場合は普通にそう書いてある。
リンクローカル IPv6 アドレス. . . . .: fe80::xxxx:xxxx:xxxx:xxxx
リンクローカルユニキャストアドレスは、上記表のとおり、サブネットプレフィックスが決まっているので、 インタフェース識別子が決まればアドレス設定できる。
インタフェース識別子は、少なくとも同一のリンク(同じルータの配下にいること)で一意である必要がある。先頭3bitが0とならないIPv6ユニキャストアドレスの場合、インタフェース識別子のbit長は64bitにすることがRFC4291で求められている。
インタフェース識別子の生成方法は2つあって、MACアドレス等から生成する方法と、乱数で生成する方法。 前者については、48bitのMACアドレスを64bitのModified EUI-64形式に変換することで生成される。固定値になるので、プライバシーとか セキュリティ的にどうなのよ的議論があるようで、https://www.geekpage.jp/blog/?id=2020-7-21-1 に詳しく書かれている。 後者については、例えばWindowsだと一時IPv6アドレスという名前で生成されている。
インタフェース識別子は、乱数なりMACアドレスで決められるので、リンクローカルユニキャストアドレスは、何も設定していなくても決まる。
ここまでのまとめ
次回
次回、ステートレスなIPv6アドレス設定方法(Stateless address auto configuration: SLAAC)について。
参考文献
- https://www.nic.ad.jp/ja/basics/terms/ipv6-text-representation.html
- https://www.nic.ad.jp/ja/newsletter/No32/090.html
- https://www.nic.ad.jp/ja/mailmagazine/backnumber/2010/vol779.html
- https://www.nic.ad.jp/ja/newsletter/No30/022.html
- https://www.geekpage.jp/blog/?id=2020-7-21-1
*1:40億個は人間の数よりも少ない
*2:ただ、IPv4とv6の差はアドレスのビット幅だけではないので、大変難しいわけですね・・・
*3:https://www.nic.ad.jp/ja/mailmagazine/backnumber/2010/vol779.html