Amazon VPCでIPv6をさくっとテストするためにISATAPトンネルを掘る
ども、大瀧です。Amazon VPCに接続するEC2インスタンスでIPv6をテストすることになり、そのためにAmazon LinuxでISATAPトンネルを試してみました。そのメモを残しておきます。
前提
現在のVPCでは、インスタンス間のネットワーク通信でIPv6をサポートしません。そこで今回は、IPv6 over IPv4のトンネル技術であるISATAP(Intra-Site Automatic Tunnel Addressing Protocol)を利用します。v6/v4トンネルはISATAP以外に6to4や6rdなどがありそれぞれ試してみましたが、いずれもWAN向けでv6対応ルーターを前提した作りのため、VPC内で試すにはそれなりの手間がかかりました。
ISATAPはノード同士の通信であればルーターの設定が不要で、簡単に構成することができました。
IPv6アドレスの設計
ISATAPのv6アドレスは、IPv6プレフィックスと::5efe:<v4アドレス>
のインターフェース識別子の組み合わせで決まります。今回はプレフィックスを2002:ca0c:1e01::/64
とし、1台目のインスタンスのv4アドレスが172.31.14.146
、2台目のインスタンスのv4アドレスが172.31.14.147
とすると、それぞれのインスタンスのISATAPアドレスは以下になります。
- インスタンス1 : 2002:ca0c:1e01::5efe:172.31.14.146/64
- インスタンス2 : 2002:ca0c:1e01::5efe:172.31.14.147/64
設定
最近のAmazon LinuxのLinuxカーネルは既定でISATAPサポートが有効なので、事前の設定は必要ありません。ただ、現在の/etc/sysconfig/network-scripts/ifup-*
スクリプトにはISATAPに関する設定が無いため、iproute2のip
ユーティリティで直接設定します。
$ sudo ip tunnel add sit1 mode isatap local 172.31.14.146 $ sudo ip addr add 2002:ca0c:1e01::5efe:172.31.14.146/64 dev sit1 $ sudo ip link set sit1 up
$ sudo ip tunnel add sit1 mode isatap local 172.31.14.147 $ sudo ip addr add 2002:ca0c:1e01::5efe:172.31.14.147/64 dev sit1 $ sudo ip link set sit1 up
これでOKです。インターフェース名sit1
でISATAPトンネルが構成されます。
$ ifconfig sit1 sit1 Link encap:IPv6-in-IPv4 inet6 addr: fe80::5efe:ac1f:e93/64 Scope:Link inet6 addr: 2002:ca0c:1e01::5efe:ac1f:e92/64 Scope:Global UP RUNNING NOARP MTU:1480 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) $
$ ifconfig sit1 sit1 Link encap:IPv6-in-IPv4 inet6 addr: fe80::5efe:ac1f:e92/64 Scope:Link inet6 addr: 2002:ca0c:1e01::5efe:ac1f:e93/64 Scope:Global UP RUNNING NOARP MTU:1480 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) $
v6表記に合わせて16進で表示されていますね。
また、忘れてはいけないのが、セキュリティグループでIPv6を許可する設定です。通信相手に対してカスタムプロトコル
を選択、IPv6のプロトコル番号41
を許可します。
この設定は6rdでは不要だったので、v6/v4トンネルの実装によって必要なセキュリティグループの対応はまちまちなようです。
では、 インスタンス1からインスタンス2のIPv6アドレスに向けてpingを打ってみましょう。
$ ping6 2002:ca0c:1e01::5efe:172.31.14.147 PING 2002:ca0c:1e01::5efe:172.31.14.147(2002:ca0c:1e01::5efe:ac1f:e93) 56 data bytes 64 bytes from 2002:ca0c:1e01::5efe:ac1f:e93: icmp_seq=97 ttl=64 time=1.26 ms 64 bytes from 2002:ca0c:1e01::5efe:ac1f:e93: icmp_seq=98 ttl=64 time=0.727 ms 64 bytes from 2002:ca0c:1e01::5efe:ac1f:e93: icmp_seq=99 ttl=64 time=0.719 ms ^C $
リプライが返ってきました!IPv6での通信ができていますね。
まとめ
VPCでIPv6を手軽に試す方法として、IPv6 over IPv4トンネルの一つであるISATAPトンネルをAmazon Linuxで利用する方法をご紹介しました。 今回は同一のプレフィックス内なので不要でしたが、外部のv6ネットワークと通信するためにはPRLの構成が必要です。機会があれば、PRLについても試してみたいと思います。