最低限押さえておきたい、IPv6アドレスのお話  

# はじめに

この記事は [IPv6 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ipv6) の 17日目の記事として投稿しています。


# このページについて

最低限、IPv6アドレスについてはこれを知ってれば困らないかな？というのを適当に書きました。正確性？気にすんな。

# IPv6アドレスってこんなの

IPv4は32ビットのアドレス空間を8bit毎に .  で区切り、十進数で、

`192.0.2.1`

みたいに表記しますが、IPv6アドレスは、128ビットのアドレス空間を、16bit毎に ":" で区切り、

`2001:db8:1:2:8:800:dead:beaf`

こんな感じで表記します。とにかくアドレス空間が広いため、16進数表記したりして、IPv6 アドレスを短く表記しようとしていますが、結局長いので、なんとか短くしようと、短略表記の手法がいくつか用意されてます。

`::`

は、連続する 0 をできるだけまとめて省略した書き方だと思ってもらえればいいです[^1]

[^1]: 詳しい省略方法は [RFC5952-IPv6アドレスの推奨表記](https://tools.ietf.org/html/rfc5952)を参照してください。

`2001:db8::1` = `2001:db8:0:0:0:0:0:1`

こんな感じ。まぁ、どうあがいても結局 IPv6アドレスは長い。

# 呼び方いろいろ

IPv6アドレスは、挙動や適用範囲によって、呼び方がいろいろあります。これが混乱を招いている気がしますが、同じクルマを見ても、人によって「スポーツカー」と呼ぶか、「セダン」、「FF車」と呼ぶかは、どういった側面から車を眺めているかによりますよね？ IPv6アドレスも、同じです。この記事では

- 挙動
- スコープ
- 特殊アドレス

で分けたいと思います。

## 挙動による分類
こんな感じ

- ユニキャストアドレス
    - 1対1で使われるアドレス。特に、グローバルアドレスを指して、グローバルユニキャストアドレスと呼ばれることもあります。IPv4でいうところの、プライベートアドレスはユニークローカルアドレス(ULA:ゆーえるえー)[^2]と呼ばれています。ユニークローカルIPv6ユニキャストアドレスと呼ぶこともありますが、まぁ短い方で。

- マルチキャストアドレス
    - あるグループを表すアドレス。このアドレス宛に投げると、そのグループに属しているすべてのノードに届けられる。1対多の通信で利用される。IPv4でいうところのブロードキャストアドレスは廃止され、マルチキャストアドレスに統合されている。
- エニーキャストアドレス
    - まぁ、気にすんな


[^2]: かつてのサイトローカルアドレスは廃止になったので、忘れてください。

## スコープについて

そのアドレスがどのスコープ（範囲）で有効なのか、で区別します。

- グローバルアドレス (現状は 2000::/3)
    - 世界に一意に決まるアドレス。2からはじまるようなIPv6アドレスは、いわゆるグローバルアドレスだと思ってればだいたいOK（嘘だけど[^3]）
- ユニークローカルアドレス(ULA： fc00::/7）
    - ユニークローカルIPv6ユニキャストアドレスともいう（実質的には fd00::/8[^4])
- リンクローカルアドレス(fe80::/10)
    - ノードが直接つながっているリンク内でのみ有効なアドレス。リンクがあがると、問答無用でノードに付与される。
        - fe80::a00:27ff:fef2:2a39 みたいに、fe80 から始まるアドレスがそれ。

[^3]: 2001から始まっていても、2001:0000::/23 は特殊用途なアドレス空間な気がしますが、まぁ空間的にはグローバル。細かいことを知りたい人は [IPv6 Global Unicast Address Assignments](https://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xhtml)を参照してみてください。

[^4]: 詳細は[RFC4193](https://tools.ietf.org/html/rfc4193)を参照。使えるアドレスは、ある条件でランダムに生成して使います。IPv4のプライベートアドレスと違って、基本的にアドレスが衝突しないないことが特徴。なので、おれおれルールで生成しないように注意！。使いたいときは、`ULA generator`とかでググるといいよ！

あと、リンクローカルアドレスはちょこっと注意が必要。リンク内だけで有効なアドレスなので、eth0, eth1, eth2 があった場合、どのインタフェース上のアドレスを指すのかがアドレスだけを見てもわからない。なので、必ずスコープIDを伴って使います

```
$ ssh fe80::a00:27ff:fef2:2a39%eth1
```

上記の例では %eth1 がスコープID を表してます。


## 特殊なアドレス

- 未指定アドレス
    - ::/128
        - IPv4でいうところの 0.0.0.0/32 みたいなやつ。bind アドレスとかで使うよね！
    - ::/0
        - IPv4でいうところの 0.0.0.0/0 みたいやつ。default gw とかで使うよね！
- loopbackアドレス
    - ::1
        - IPv4でいうところの 127.0.0.1 みたいなやつ
- 同一リンク上の全ノード宛マルチキャスト
    - ff02::1
        - IPv4でいうところの、192.0.2.255 みたいなやつ
- 同一リンク上の全ルータ宛マルチキャスト
    - ff02::2
        - IPv4では類似のものはないかなー
- IPv4射影アドレス(IPv4-mapped アドレスともいう）
    - ::ffff:192.0.2.1
        - IPv6のアドレス空間って広いので、思わずIPv4アドレスを埋め込んじゃった系
        - IPv6の socket でもIPv4アドレスを内部でIPv6アドレスとして扱って通信できちゃう。でも IPv6で通信してるわけじゃない。
        - 全部のOSがサポートしてるわけでもない。
        - まぁたまにログとかで目にするかもしれないけど、「あーこのアドレス吐くってことは、IPv6サポートしてるんだなー」ぐらいで思ってればいいんじゃない？

# このアドレスはなんと呼ぶ？

- 2001:db8::1
    - グローバルアドレスであり、ユニキャストアドレスでもある。
- ff02::1
    - マルチキャストアドレスであり、またリンクローカルアドレスでもある。
- fe80::a00:27ff:fef2:2a39
    -  ユニキャストアドレスであり、またリンクローカルアドレスでもある。

# Linux でどう見えるの？

```
# ip -6 addr show dev eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8::cafe/64 scope global
       valid_lft forever preferred_lft forever
    inet6 2001:db8::a00:27ff:fef2:2a39/64 scope global dynamic
       valid_lft 86124sec preferred_lft 14124sec
    inet6 fe80::a00:27ff:fef2:2a39/64 scope link
       valid_lft forever preferred_lft forever
```

ちょこっと説明を付け足すと、こんな感じ。

<img width="738" alt="IPv6-addr.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31956/53006e10-103b-25da-89f2-53e06804f134.png">


# その他
## Qiitaで IPv6アドレスを入力する

### 残念な入力例

IPv6アドレス入力してると、たまに

2001:db8:abcd:defg::1

こんな感じで、絵文字が入力されたりします。IPv6アドレスの区切り文字である : による絵文字記法とバッティングしてるためです。本来なら、`\` によるエスケープが効くはずなんだけど、Qiitaでは、うまくいかないので、

\``2001:db8:abcd:defg::1`\`

こんな感じで、` で括って入力するのがお手軽でストレスがなく入力できてよいかと思います。


# 最後に

もっと詳しく IPv6 について知りたいと思う人は [すごいIPv6本を無料配布！](https://www.geekpage.jp/blog/?id=2018-7-4-1)から、「プロフェッショナルIPv6」をダウンロードするか、購入するといいと思うよ！IPv6について網羅したオススメできる書籍は、おそらく今後もこれを越えるものは、現れないと思われ。