IP version 6

iPhoneがiOS9からIPv6(Internet Protocol version 6)が必須となるらしいです。これまでIPv4アドレスの枯渇から何度も、今年はIPv6元年だ、なんて言われつづけてきましたが、なかなかメリットが見えないことから、ブームごとに学習はするものの、使うことはあまりありませんでした。(機器は対応済なのに) インフラ開発の現場でもNATがあるからそれほど不便でもないし、特に要望もなければ、使う機会もありませんでした。iPhoneの影響力がIPv6移行をさらに進めることで、使う機会が増えるかも(?)、ということで、IPv6に慣れておくためにも、Ubuntu 14.04 とRaspberry PiとのIPv6通信をテストしてみました。

ipv6_rpi
ラズパイは、/etc/modules に ipv6 を追加すると、IPv6対応になります。
また、サーバとしてApache2は走らせておきます。(apt-get install apache2でインストール。IPv6対応済)

Ubuntu側は、以下のプログラムを使います。

ホスト名からIPv4, IPv6のアドレスを取得して、それぞれのアドレスでサーバにアクセスします。/etc/hostsは下のようになっています。

ipv6_host
localhostのテストのため、Ubuntu側もApache2を立ち上げておきます。
index.htmlの内容は、”Index Page”です。
ホスト名localhost、rpiで接続してみます。
ipv6_conn
rpiの場合は、アドレスは引けるのですが、IPv6の接続がうまくいきません。これは、リンクローカルアドレスになっているためと思われます。そこで、IPv6アドレスにネットワークインターフェイス名を追加して接続しました。netcatでも同様の結果になりました。
下は、プログラム実行したときのパケットキャプチャです。
ipv6_wireshark

次に、参考までにping6、curlによる接続です。
ipv6_others
アドレスの記述方法に、随分トライ&エラーをしました。%25は、%をエスケープしたものです。eth0でなく2なのは、よくわかりませんでしたが、インターフェイスの順番指定なのでしようか。
環境が、グローバルユニキャストアドレスならば、もっと簡単にいきそうです。
一番興味があるのは、マルチキャストなのですが、環境がそろったらトライしてみたいです。

参考 : http://www.v6pc.jp/jp/upload/pdf/socket-sample-20121203.pdf