Amazon AWS EC2 VPCのIPv6対応 インスタンスからのIPv6アドレス通信

# やったこととサマリ

## 構築した環境と疎通を試したIPv6通信

オハイオリージョンの同一サブネット内に ubuntu 16.04 LTS のインスタンスを２つ立てて、下記のIPv6通信をしてみた。

1. 同一サブネット内のインスタンス間の直接IPv6通信
    - グローバルユニキャストアドレス経由
    - リンクローカルユニキャストアドレス経由
1. All Node Address (ff02::1) リンクローカルマルチキャストアドレスあての通信
1. stateful DHCPv6に頼らず勝手IPv6アドレスをインスタンスに付与しての通信

## サマリ

- インスタンス間の直接IPv6通信はグローバルアドレス, リンクローカルアドレスともに制限なくできた。
- All Node Address (ff02::1) へのping6 (ICMP echo request送信) で近隣ノード(デフォルトルータを含む)を見つけられない。
- 勝手にIPv6アドレスを割り当てても使えずAWSのインフラが割り当てたIPv6アドレスだけしか使えない。現時点(2017.1.15)ではVPN用途でユーザが自前のグローバルIPv6アドレスを持ち込んだり、プライベートIPv4アドレスの感覚で、ユニークローカルIPv6アドレス(ULA)を付けられない様子。


# 構成図

VPCの同一サブネット内にインスタンスを２つ立てた。

```
                                             +---------+
                                             |    GW   |
                                             +----+----+
                                                  |RA fe80::4fd:d1ff:fec8:f9cf
                                                  |↓
   2001:1f16:XXXX:YYYY::/64([P1]と表記)            |
   --+------------------------------------+-------+--------
     |                               |
     |     [P1]:f557:112e:f9bd:c7f3  |     [P1]:d326:143a:2015:79fa
     |eth0 fe80::4df:a5ff:fe6c:5d57  |eth0 fe80::4f0:13ff:feeb:c61d
+----+----+                     +----+----+
| ubuntu1 |                     | ubuntu2 |
+---------+                     +---------+
```

# インスタンス間の直接IPv6通信

## ubuntu1 to ubuntu2 (グローバルユニキャストアドレス)

OK

```
ubuntu1# ping6 2600:1f16:XXXX:YYYY:d326:143a:2015:79fa
PING 2600:1f16:8df:XXXX:YYYY:112e:f9bd:c7f3(2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f3) 56 data bytes
64 bytes from 2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f3: icmp_seq=1 ttl=64 time=0.523 ms
64 bytes from 2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f3: icmp_seq=2 ttl=64 time=0.603 ms
^C
```

## ubuntu1 to ubutu2 (リンクローカルユニキャストアドレス)

OK

```
ubuntu1# ping6 fe80::4f0:13ff:feeb:c61d%eth0
PING fe80::4f0:13ff:feeb:c61d%eth0(fe80::4f0:13ff:feeb:c61d) 56 data bytes
64 bytes from fe80::4f0:13ff:feeb:c61d: icmp_seq=1 ttl=64 time=0.466 ms
64 bytes from fe80::4f0:13ff:feeb:c61d: icmp_seq=2 ttl=64 time=0.553 ms
^C
```

# ubuntu1 to All Nodes Address (リンクローカルマルチキャスト)

```
ubuntu1# ping6 ff02::1%eth0
64 bytes from fe80::4df:a5ff:fe6c:5d57: icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from fe80::4df:a5ff:fe6c:5d57: icmp_seq=2 ttl=64 time=0.032 ms
```

同一リンク内にいるはずの、ubuntu2からもデフォルトルータからECHO replyは来ず、自分自身からのみ返事がくる。ubuntu2側のeth0を見ていてもECHO requestが来ないので、インスタンス間にある仮想スイッチで止められている動きだった。

## ubunut1の近隣キャッシュを見ると

```
ubuntu1# ip -6 nei
fe80::4f0:13ff:feeb:c61d dev eth0 lladdr 06:f0:13:eb:c6:1d STALE
fe80::4fd:d1ff:fec8:f9cf dev eth0 lladdr 06:fd:d1:c8:f9:cf router STALE
```

ICMP ECHO requst/reply は疎通しないもののの、ubuntu2,デフォルトルータいずれも近隣探索は成功しておりMACアドレスの解決はできている。仮想スイッチは近隣探索は通している。


## RAで通知されたデフォルトルータへのアクセス

```
ubuntu1# ip -6 route
fe80::/64 dev eth0  proto kernel  metric 256  pref medium
default via fe80::4fd:d1ff:fec8:f9cf dev eth0  proto ra  metric 1024  expires 1799sec hoplimit 64 pref medium

ubuntu1# ping6 fe80::4fd:d1ff:fec8:f9cf%eth0
^C
```

リンクローカルユニキャストアドレスでデフォルトルータへICMP ECHO requstを飛ばしても返事なし。

# インスタンスに勝手IPv6アドレスをつける

## prefix::1 (グローバルユニキャストアドレス)をつける

stateful DHCPv6で割り当てられるIPv6アドレス（マネージメントコンソールで確認できるIPv6アドレス）ではないアドレスを手動でつけて通信を試みる。

### ubuntu1 to Internet (インスタンス to Internet)

```
ubuntu1# ip -6 addr add 2001:1f16:XXXX:YYYY::1/64 dev eth0

DADの重複検知がないことを確認して

# ping6 ipv6.google.com
PING ipv6.google.com(2607:f8b0:4001:c09::71) 56 data bytes
^C
```

結果: IPv6インターネットへの通信不可


### ubuntu1 to ubuntu2 (インスタンス同士)

```
ubuntu1# ping6 2600:1f16:XXXX:YYYY:d326:143a:2015:79fa
PING 2600:1f16:XXXX:YYYY:d326:143a:2015:79fa(2600:1f16:XXXX:YYYY:d326:143a:2015:79fa) 56 data bytes
^C
```

近隣要請に対して近隣通知が返ってこず近隣探索に失敗している。

```
ubuntu1# ip -6 nei
2600:1f16:XXXX:YYYY:d326:143a:2015:79fa dev eth0  INCOMPLETE
```


結果: 通信不可

## 管理されているアドレスに近いグローバルユニキャストアドレスをつける

DHCPv6で取れるアドレス (2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f3) + 1 をつける

```
ubuntu1# ip -6 addr add 2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f4/64 dev eth0
```

### ubuntu1 to Internet

```
ubuntu1# ping6 ipv6.google.com
PING ipv6.google.com(in-in-x8a.1e100.net) 56 data bytes
^C
```

結果: 通信不可

### ubuntu1 to ubuntu2

```
ubuntu1# ping6 2600:1f16:XXXX:YYYY:d326:143a:2015:79fa
PING 2600:1f16:XXXX:YYYY:d326:143a:2015:79fa(2600:1f16:XXXX:YYYY:d326:143a:2015:79fa) 56 data bytes
From 2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f4 icmp_seq=1 Destination unreachable: Address unreachable
From 2600:1f16:XXXX:YYYY:f557:112e:f9bd:c7f4 icmp_seq=2 Destination unreachable: Address unreachable
^C
```

結果: 通信不可

グローバルユニキャストアドレス(ULAを含む)はユーザが勝手持込IPv6アドレスを付けられない様子。

## リンクローカルユニキャストアドレス

ubuntu1 のリンクローカルアドレスとして手動で fe80::1234 を付ける

```
ubuntu1# ip addr del fe80::4df:a5ff:fe6c:5d57/64 dev eth0
ubuntu1# ip addr add fe80::1234/64 dev eth0
```

ubuntu2のリンクローカルアドレスへICMP ECHO requestを飛ばすが返事はない。ubuntu2の近隣探索にも失敗している。

```
ubuntu1# ping6 fe80::4f0:13ff:feeb:c61d%eth0
PING fe80::4f0:13ff:feeb:c61d%eth0(fe80::4f0:13ff:feeb:c61d) 56 data bytes
From fe80::1234 icmp_seq=1 Destination unreachable: Address unreachable
From fe80::1234 icmp_seq=2 Destination unreachable: Address unreachable
^C

ubuntu1# ip -6 nei
fe80::4f0:13ff:feeb:c61d dev eth0  INCOMPLETE
```

リンクローカルアドレスも勝手アドレスを付けらず、インフラ（仮想スイッチ）がアドレス(/128)単位でアクセス制限をしているようである。個々のインスタンスを管理するためにstateful DHCPv6を使うのが合理的であるし、ネットワークも割り当てたIPv6アドレスでない勝手IPv6アドレスによる通信を抑止しているようだ。

# 関連記事
■ Amazon EC2 VPCのIPv6対応 インスタンスへのIPv6アドレス付与は m-flagつきRA + stateful DHCPv6
http://qiita.com/ip6/items/5c307af204ea83097755