中国のパブリッククラウド上でIPv6を使うには

# はじめに
##モチベーション
これまでほとんど利用されていなかった中国のIPv6界隈で大きな動きがある。それでは実際触ってみよう、と思ったら予想以上に敷居が高かった。というか、普通の日本にいる日本人には無理だ。如何にそれが無理かも含めてここにメモしとく。
以下は2019年2月11日に調べた結果だ。去年末から各社すごいスピードでIPv6対応始めてるので、もしかしたら数日後には陳腐化しているかもしれない。

##調査
メジャーなパブリッククラウドのそれぞれのIPv6対応状況を調べてみた。NAT64やロードバランサーは受け身としてしか使えない。やっぱりIPv6アドレスを持った仮想Linuxが欲しい。KingSoft Cloudの北京リージョンでも使えるには使えそうだ。実際にVPCにIPv6 addressを付与出来たけど、この先はベアメタルインスタンスが必要だった。高額すぎる。結論からいうとお手軽にIPv6ネイティブなインスタンスが使えるのは**中国アカウントのAlibaba Cloudのみ**。中国アカウントを使うことが中国人以外では著しく困難なので、中国人の協力者を見つけよう。各クラウドの対応状況は以下の通り。

|  | 仮想サーバ | NAT64 | ロードバランサー |
|:--|:--|:--|:--|
| Alibaba Cloud | ◯内モンゴル | ◯<br>(Gateway型) | ◯ |
| Tencent Cloud | × | × | ◯ |
| Baidu Cloud | × | ◯<br>(ElasticIP型) | × |
| KingSoft Cloud | ◯北京<br>(ベアメタルのみ) | × | ◯ |
| Ucloud | × | ◯(?型) | × |
KingSoft Cloud(金山云)はベアメタルサーバインスタンスであるEPCのみ。最低6万円ぐらいから。家庭内稟議通りません。

# 中国に環境を作る
## 中国でIPv6を使えるLinux instanceを作成するには
VPCがネイティブにIPv6に対応していて、気軽にさわれそうなのはAlibaba Cloudの中国向けアカウントの内モンゴルリージョンのみ。つまりAlibaba Cloudの中国向けアカウントが必要。そしてAlibaba Cloudの中国人向けアカウントを使うためには中国の電話(+86)と中国の銀行口座が最低必要。日本人でも現地に行けば取得できますが、持っている人は少ないですね。。。この二つを取得するか、持ってる協力者が必要。以下、中国アカウントを使えるという前提です。

##Alibaba Cloudの中国アカウントとは 
Alibaba Cloudには3種類ある。1)中国、2)International、そして日本のSBクラウドが運用する3)日本アカウントだ。IPv6が使えるのはAlibaba Cloudの中国アカウントである**中国站**にログインできるアカウントのみだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/fd62eb50-0c45-44b3-ce9c-87810b45f952.png)


## VPCの作成
内モンゴル(Hohhot Region)のVPCのみがIPv6対応なのでここにVPCを作成。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/8298e46a-f1b5-8eb3-0d7d-00530e249588.png)

IPv6をAllocate。初めての場合はIPv6の利用申請の画面に案内されるので、利用申請する(2018年12月)。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/0bd6750c-b410-ec0c-7c1c-279f62358814.png)

VPCには/56が割り当てられる。同時にVSwitchを作成してIPv6 CIDRを割り当てる。VSwitchへの割り当ては/64単位固定みたい。十進法で0-255までを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/fc0cc164-c4ca-924c-4fe1-46107c4041d1.png)

## ECSの作成
次に内モンゴルリージョンの今作ったVPC/VSwich上にECSインスタンスを作成する。詳細は割愛するけど購入する際にネットワークのところで"Assign IPv6 Address Free of Charge"というのがでてくるのでチェックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/14b52355-2bd3-355f-45f2-a61b5c0f8481.png)

ECSが起動したらログインしてみよう。期待に反してIPv6 Adressが無いことに気付くはずだ。

```
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.82/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
```

LinuxのインスタンスでIPv6を有効にするにはスクリブトをダウンロードして実行し、IPv6を有効にする必要がある。下記はubuntu16の例だ。そしてダウンロードされたスクリプトのファイル名が微妙だ。

```
# wget http://ecs-image-utils.oss-cn-hangzhou.aliyuncs.com/ipv6/debian/ecs-utils-ipv6?spm=a2c4g.11186623.2.18.4c2237da4VXvzL 
# chmod +x ecs-utils-ipv6\?spm\=a2c4g.11186623.2.18.4c2237da4VXvzL 
# ./ecs-utils-ipv6\?spm\=a2c4g.11186623.2.18.4c2237da4VXvzL 
```

するとIPv6 addressが降ってくる

```
# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    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 00:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.82/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2408:4004:100:2400:xxxx:xxxx:xxxx:xxxx/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::216:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
# route -6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
2408:4004:100:2400::/64        ::                         U    256 0     1 eth0
fe80::/64                      ::                         U    256 0     0 eth0
::/0                           2408:4004:100:2400:ffff:ffff:ffff:fff7 UG   1024 1   199 eth0
::/0                           ::                         !n   -1  1   206 lo
::1/128                        ::                         Un   0   2     4 lo
2408:4004:100:2400:xxxx:xxxx:xxxx:xxxx/128 ::                         Un   0   2     1 lo
fe80::216:xxxx:xxxx:xxxx/128   ::                         Un   0   2    12 lo
ff00::/8                       ::                         U    256 0     0 eth0
::/0                           ::                         !n   -1  1   206 lo
```
Next hopがGUAになってるあたりがちょっと微妙だ。
以上でこのインスタンス自体のIPv6は有効になったが、実際に外部通信するにはもう一手間必要で、IPv6 Internet帯域を購入する必要がある。VPCのコメニューからIPv6 Gatewayを選択してManageのリンクに飛ぶ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/22d7fd8d-00e0-0bf0-8a6a-dcd68b28e86b.png)

メニューからIPv6 Internet Bandwidthを選び、今作ったECSのCreate IPv6 Internet Bandwidthに飛ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/4ba6f4d3-8c92-2b8c-fcd9-ca9b37cc48a7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132165/b94b5fc5-5fed-6fd1-7824-65f8f1e07c43.png)

これでIPv6 Internetとつながる。

```
# ping6 v6pc.jp
PING v6pc.jp(2400:6700:ff00::36f9:e38d) 56 data bytes
64 bytes from 2400:6700:ff00::36f9:e38d: icmp_seq=1 ttl=250 time=239 ms
64 bytes from 2400:6700:ff00::36f9:e38d: icmp_seq=2 ttl=250 time=240 ms
64 bytes from 2400:6700:ff00::36f9:e38d: icmp_seq=3 ttl=250 time=240 ms
64 bytes from 2400:6700:ff00::36f9:e38d: icmp_seq=4 ttl=250 time=241 ms
```

#最後に
これは私の趣味の活動です。所属する団体の考え方は全く反映していません。

#2019/2/22追記 ubuntu 18について
本日2019/2/22時点でUbuntu 18版のツールが公開されていないようだ。ubuntu16と色々違うので上記ubuntu 14/16版のツールではIPv6が動かない。というわけで、以下、手動で設定する方法

## 情報取得
IPv6を設定する該当インスタンスから下記実行

### ipv6 address取得
```
# curl -L -s 100.100.100.200/latest/meta-data/network/interfaces/macs/[eth0の
Mac Address]/ipv6s
[2408:4004:100:xxxx::1]
```

### ipv6 cidr取得
```
# curl -L -s 100.100.100.200/latest/meta-data/network/interfaces/macs/[eth0の
Mac Address]/vswitch-ipv6-cidr-block
[2408:4004:100:xxxx::/64]
```

### ipv6 gateway取得
```
# curl -L -s 100.100.100.200/latest/meta-data/network/interfaces/macs/[eth0の
Mac Address]/ipv6-gateway
[2408:4004:100:2400:ffff:ffff:ffff:fff7]
```

### ipv6有効化
```
# cat /etc/sysctl.conf
~~~　省略
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0
net.ipv6.conf.eth0.disable_ipv6 =0
~~~　省略

#cat /etc/default/ufw 
~~~　省略
IPV6=yes
~~~　省略

#sysctl -p
```

### ipv6 interface設定
ubuntu18からnetplanがnetwork interface設定の標準的方法となった。
下記下から３行、IPv6のアドレスに関連する部分を追記する

```
# cat /etc/netplan/99-netcfg.yaml 
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: yes
      dhcp6: no
      addresses:
        - 2408:4004:100:xxxx::1/64
      gateway6: 2408:4004:100:xxxx:ffff:ffff:ffff:fff7

# netplan apply
```