IPv6リンクローカルアドレスを固定する

IPv6が有効になっている機器では、基本的にMacアドレスから自動的にリンクローカルユニキャストアドレスが生成されます。
しかし、サーバー管理などを行う上で扱いにくいので、覚えやすいアドレスに変更してみました。

# 想定事項
* Linuxサーバーを利用していて、IPv6で同一ネットワーク内のリンクローカルユニキャストアドレスを固定化したい
* `ip` コマンドが利用できる環境を想定

# ネットワークスインターフェースを確認
`ip addr`(`ip a`)コマンドでネットワークのIPアドレスを確認します。

```bash
$ 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: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 90:1b:0e:ff:aa:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eno2
       valid_lft forever preferred_lft forever
    inet6 fe80::921b:eff:feff:aabb/64 scope link 
       valid_lft forever preferred_lft forever
```

1番の`lo`はループバック用のネットワークインターフェースです。
2番の`eno2`が今回設定を変更するネットワークインターフェースです。
※メーカーによって名称は異なります。以降`eno2`は必ずご利用の環境にあった名前に置き換えてください。

# 目次
* [一時的に固定する（CentOS7・Ubuntu20.04共通）](#%E4%B8%80%E6%99%82%E7%9A%84%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8Bcentos7ubuntu2004%E5%85%B1%E9%80%9A)
* [CentOS7で恒久的に固定する](#centos7%E3%81%A7%E6%81%92%E4%B9%85%E7%9A%84%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B)
* [Ubuntu20.04で恒久的に固定する](#ubuntu2004%E3%81%A7%E6%81%92%E4%B9%85%E7%9A%84%E3%81%AB%E5%9B%BA%E5%AE%9A%E3%81%99%E3%82%8B)

# 一時的に固定する（CentOS7・Ubuntu20.04共通）

## 既に割り振られているアドレスを消去する
先ほどのコマンドで`eno2`には`fe80::921b:eff:feff:aabb/64`が割り当てられていました。
それを一旦消去します。

```bash
$ sudo ip a del fe80::921b:eff:feff:aabb/64 dev eno2
```

## 使用したいIPv6アドレスを設定する

```bash
$ sudo ip a add fe80::2/64 dev eno2
```
ローカルIPv4アドレスが`192.168.1.2`なので、リンクローカルIPv6アドレスは`fe80::2/64`にしてみました。
`２`の部分はお好みでどうぞ

## 再度ネットワークスインターフェースを確認

```bash
$ 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: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 90:1b:0e:ff:aa:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eno2
       valid_lft forever preferred_lft forever
    inet6 fe80::２/64 scope link 
       valid_lft forever preferred_lft forever
```

これでIPv6リンクローカルアドレスの一時的な固定化ができました。
しかし、このままではネットワークを再起動するとリセットされてしまうため、以下の設定をします。

# CentOS7で恒久的に固定する

## 設定ファイルを編集

```bash
$ sudo vim /etc/sysconfig/network-scripts/ifcfg-eno2
```

`eno2`の部分はお使いの環境に合わせてください。

`# IPv6`の箇所に以下の行を追加

```bash
IPV6ADDR="fe80::2/64"
```

## ネットワークをリロード

```bash
$ sudo systemctl restart network
```

## ネットワークスインターフェースを確認

```bash
$ 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: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 90:1b:0e:ff:aa:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eno2
       valid_lft forever preferred_lft forever
    inet6 fe80::２/64 scope link 
       valid_lft forever preferred_lft forever
```
リロードしてもIPアドレスが固定化されています。
これでCentOS7環境でのIPv6リンクローカルアドレスの恒久的な固定化ができました。

# Ubuntu20.04で恒久的に固定する

## 既に割り振られているアドレスを消去する
`$ ip a`で`eno2`には`fe80::921b:eff:feff:aabb/64`が割り当てられていました。
それを一旦消去します。

```bash
$ sudo ip a del fe80::921b:eff:feff:aabb/64 dev eno2
```

##デフォルトの設定ファイルを無効化
初期の設定ファイルの名前を変更して無効化し、新しい設定ファイルを作成します。
※IPv4設定のファイルを既に作成してあり、そこに追記したい場合はこの工程を飛ばしてください。

```bash
$ cd /etc/netplan/
$ sudo mv 00-installer-config.yaml 00-installer-config.yaml.disabled
$ sudo touch 99-netcfg.yaml
```

## 設定ファイルを編集
※IPv4設定のファイルを既に作成してある場合はそのファイル名

```bash
$ sudo vim 99-netcfg.yaml
```

中身は次のようにします。

```bash
network:
    version: 2
    ethernets:
        eno2:
            addresses: [
                192.168.1.2/24,
                fe80::2/64
            ]
            gateway4: 192.168.1.1
            nameservers:
                addresses: [
                    8.8.8.8,
                    8.8.4.4
                ]
                search: []
            optional: true
```
この環境では次のように設定していますので、お使いの環境に合わせた設定に置き換えてください。

| 名称            | 意味                          |
|:--------------:|:-----------------------------:|
| eno2           | 設定するネットワークインターフェイス    |
| 192.168.1.2/24 | 固定するIPv4アドレス              |
| fe80::2/64     | 固定するIPv6リンクローカルアドレス    |
| 192.168.1.1    | IPv4のデフォルトゲートウェイ（ルータ等） |
| 8.8.8.8        | DNSサーバ（プライマリ）             |
| 8.8.4.4        | DNSサーバ（セカンダリ）             |

※IPv4設定のファイルを既に作成してある場合は `addresses` に `fe80::2/64` （固定するIPv6リンクローカルアドレス）を追加するだけでOK

## ネットワークをリロード

```bash
$ sudo netplan apply
```

## ネットワークスインターフェースを確認

```bash
$ 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: eno2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 90:1b:0e:ff:aa:bb brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.2/24 brd 192.168.1.255 scope global eno2
       valid_lft forever preferred_lft forever
    inet6 fe80::２/64 scope link 
       valid_lft forever preferred_lft forever
```
リロードしてもIPアドレスが固定化されています。
これでUbuntu20.04環境でのIPv6リンクローカルアドレスの恒久的な固定化ができました。

# 参考
* [3つの手順で実現、サーバOSのIPv6対応：これから始めるIPv6（3）（2/2 ページ） - ＠IT](https://atmarkit.itmedia.co.jp/ait/articles/1111/28/news124_2.html)
* [ミラクル・リナックス：IPv6対応にするにはどのように設定すれば良いですか？](https://users.miraclelinux.com/asianux/about/data/21.html)