Amazon VPCでIPv6をさくっとテストするためにISATAPトンネルを掘る

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。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を許可します。

isatap01

この設定は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についても試してみたいと思います。