そろそろ自鯖をIPv6化するかね(IPv6時代のIP固定方法)

#はじめに
Network ManagerをインストールしたLinux向けです。
現状、有名所のディストリなら標準で入ってます(CentOSやDebian,Ubuntu)
RaspberryPiには標準では入っていませんが、aptでインストールすれ問題なく動くことが確認できています

この記事通り設定するとIPv6のグローバルIPが固定され、かつ自動設定のおよそ半分の長さになる

macOSやWindowsではこの方法でIPは設定できません

#IPv6アドレスの設定パターン

```
━┳Static (固定)━━━━━━完全固定(プレフィックスとインターフェースIDを固定)・・・・①
　┃
　┣Semi-Static (半固定)━━インターフェースIDのみ固定━┳macアドレスから自動生成・・・②
　┃　　　　　　　　　　　　　　　　　　　　　　　　　　　┗手動で固定・・・・・・・・・・③
　┃
　┗Dynamic(自動)━━━━━━匿名(一時)アドレス・・・・・・・・・・・・・・・・・・・・・④

```
WindowsやmacOSでIPv6を自動設定した場合、②と④が設定される
Network ManagerをインストールしたLinuxでもGUIやnmtuiコマンドで自動設定を選択した場合も②と④が設定される
②と④は同時に割り当てられることもあり、その場合はどちらを優先するかも設定できる

同様にWindowsやmacOSやLinuxのGUIやnmtuiコマンドで手動や固定を選択すると①が設定される

しかし、Linuxでは③が設定可能である。③の利点は後に示す


#ちょっと補足(IPv6のプレフィクスとインターフェースID)
IPv6は128bitで表現され、日本では概ねプレフィクスが64bit、インターフェースIDが64bitと考えて頂いて構わない。(ひかり電話とか一部例外はあるが)

|プレフィクス|インターフェースID|
|:-----:|:---------:|
|64bit|64bit|

プレフィックスはIPv4で言うところのネットワークID、インターフェースIDはホストIDと思って構わない
プレフィックスが固定できるかはIPv6接続方式によって変わる

|       |IPoE|PPPoE|
|:-----:|:---------:|:------------:|
|プレフィックスの固定|半固定のみ(変動は数年に1回程度?)|完全固定が選択可|
|プロバイダ月額|1,000円程度|14,000円程度|
|最大理論速度|10Gb|???|

#IPv6アドレスの設定パターン毎の短所
④匿名(一時)アドレスは起動する毎にIPアドレスが変わるため、サーバーとしては使えない
①完全固定は接続方式がPPPoEv6などでプレフィックスが固定された環境であれば使えるが、プレフィックスが変動してしまうとメンテすらできなくなる
②インターフェースIDをmacアドレスから自動生成するということは名前の通りmacアドレスをインターネットに晒すことになる。
③インターフェースIDを手動設定するはプレフィクスが変動してもプレフィクスを知ることさえできればアクセスは可能である。もちろんプレフィックスを固定できる環境であれば、①と同様に使える

#インターフェースIDを手動設定する方法
NICをいじるため、SSHなどネットワーク越しでは失敗するかもしれません。

まず、Network Managerのnmtuiコマンドを使い、全てauto(または自動と)でEthernet connection 1を作る

```
nmtui
```
![Screenshot from 2019-06-01 18-31-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/b871c866-e17b-70d5-cd42-5009d9ef03d7.png)
「接続の編集」を選択

![Screenshot from 2019-06-01 18-35-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/9f3ef63b-6a89-75b2-0d3e-0ff52bac513c.png)
<追加>でEthernetを選択

![Screenshot from 2019-06-01 18-35-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/9018c7b5-815e-e367-bd7d-0ad6292c7adb.png)
デフォルトでは全て自動になっているため、そのまま<OK>を選択
作ったプロファイル名は覚えておく

![Screenshot from 2019-06-01 18-38-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/fcd070d4-c76a-8f02-9ca9-d9e013079ac9.png)
「接続をアクティベートする」を選択

![Screenshot from 2019-06-01 18-38-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/ded1c642-861f-d67c-c102-007ffe7c972f.png)
先程作ったプロファイルを選択し、<アクティベート>を選択

![Screenshot from 2019-06-01 18-33-45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/332a0d4e-6b4d-d621-34df-ff78fd2d872e.png)
終了を選択

nmtuiコマンドで作ったプロファイルをnmcliコマンドを使いカスタマイズする
"有線接続 1"はプロファイル名なので適宜読み替えてください
ipv6.token ::1:1の設定値も適宜設定してください

```
nmcli c m "有線接続 1" ipv6.ip6-privacy 0
nmcli c m "有線接続 1" ipv6.addr-gen-mode eui64
nmcli c m "有線接続 1" ipv6.token ::1:1
```

コマンドの意味は、以下の通りです

|設定値|意味|デフォルト値|
|:-----:|:---------:|:---------:|
|ipv6.ip6-privacy 0|匿名(一時)アドレスを無効化する|-1|
|ipv6.addr-gen-mode eui64|IPv6アドレス生成モードをEUI-64にする|privacy-stable|
|ipv6.token ::1:1|インターフェースIDを::1:1に固定する|--|

ipv6.addr-gen-modeのprivacyは上記の④匿名(一時)アドレスを表します
ipv6.addr-gen-modeのstableは上記の②インターフェースIDをmacアドレスから自動生成する
デフォルトの設定はprivacy-stableとなっていますので、④匿名(一時)アドレスを優先して使うようになっています
ディストリによってはstable-privacyがデフォルトになっているものもあるようです

#設定結果確認
設定結果は以下の方法で確認してもらえばOKだが、IPv6のグローバルIPが固定され、かつ自動設定のおよそ半分の長さになる
直接IPを入力する機会はmDNSなどのプロトコルが出てきたため減ってはいるのだか短いアドレスは利点がある

また、DNSに登録するにはIPには以下で確認できるIPを登録すれば良い

プレフィクスをどう固定するか、変動したらどうするかは別途議論する

##ローカルの端末を設定したならip aで確認

```
$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.17/32 brd 192.168.1.17 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2100:a:a::1:1/64 scope global noprefixroute dynamic 
       valid_lft 13594sec preferred_lft 11794sec
    inet6 fe80::aabb:ccff:fedd:eeff/64 scope link 
       valid_lft forever preferred_lft forever
```

##リモート端末ならmDNSで確認したほうが簡単
手前味噌ながらAndroidでmDNSでグローバルIPv6を引けるソフトを作ったため、使ってみてほしい
https://play.google.com/store/apps/details?id=com.dokoden.dotlocalfinder
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253664/752cb15e-8534-c3df-9018-c8c8ce567272.png)

その他のOSでの検索方法は、別途記事にした
https://qiita.com/maccadoo/items/48ace84f8aca030a12f1

ip aの結果からもわかりますがリンクローカルアドレス(fe80から始まるアドレス)は別途生成されているし、今回の設定では変更されていないこともわかる

#注意
NTTフレッツ光を使われているかた、NTTがレンタルで貸し出しているONUのIPv6周りのセキュリティはザルなので注意してほしい
https://qiita.com/maccadoo/items/41e4cde50d1a288a19d6