続 カッコの付け方

AWSを始めとしたクラウドコンピューティング全般と、唯一神emacsにおける()の付け方についてだらだら書きます

ipv6とAWS 繋がるから、運用まで

世の中の全てのデバイスがipv6グローバルIPアドレスを持つ時代が来る。そんな時代が来ると考えていた頃が私にもありました。

f:id:iga-ninja:20150815105712p:plain

2015年になった今も、残念ながらipv4が主流のままです。また、足らないグローバルIPやら、本当はグローバルIP同士でやるべき通信をipv4で何とかしようとする技術は沢山あります、が
小手先の技術ではなく、本当に膨大なグローバルIPを割り当てる方法および実装は、ipv6以外に2015年時点では存在せず
djbが書いた大昔の予言どおりの現在であったとしても、v4との互換性がないのがアレだといわれても、2015年の今日、でデバイスレベルで実装があるのはipv6だけです。良い、悪いは置いといて、ipv6以外の代替案が無く、結果的にダメな点が多いと言われるipv6に変わるテクノロジーを作り、協議/策定することが15年たっても誰一人出来なかったというのが、今です。おかげでipv4で何とかする技術は発展したと言えますが。。

壮大な話になってしまいました。
歴史に関してはググればいくらでもでてくるので、興味があれば調べてください。また私個人はdjbの予言は的確であったと思うし、当時の私には大変分かりやすかった。djbと翻訳者ともに尊敬、感謝しています。
http://www.unixuser.org/~euske/doc/ipv6ex/

モチベーション

djbの言葉を借りますが、ipv4 -> ipv6 マイグレーションには相当な覚悟 という名のモチベーションが必要です。

2012年のipv6 dayを経て、
「やっぱりipv6はまだ人類には早すぎた」
と私は思いました。それ以前にも、大手のISPは、なんだかよくわからないサービスをipv6限定にして展開し、何とかipv6キラーコンテンツをつくろうとしていましたが、まあ、結果失敗してます(現状をみれば一目瞭然) しかし最近になって、少しずつモチベーションが高まりつつ有ります。1つは Docomo / AU におけるスマートフォンipv6 IPアドレスを本当にしゃべる時代が来たという点です。しかもその端末が何と私の手元にあるのです! Next5です!
http://trendy.nikkeibp.co.jp/article/pickup/20131209/1053986/?P=3

それともう一つ、最近、iOS9 からのアプリ審査には、ipv6対応にしておけ、ニュアンスとしては、ipv4縛りをするな!という方針が組まれるようです。
http://www.internetsociety.org/deploy360/blog/2015/06/apple-will-require-ipv6-support-for-all-ios-9-apps/

急にipv6対応とはご無体な話ですが、実際に「はい、明日からipv6でないアプリはNGね」って話ではなく、「インフラ側がipv6になっても動くようにしとけ」ということだと思います(そうじゃないと困る)。ちなみにiPhoneDocomo & AUはすでに ipv4 & ipv6両方いける、softbankipv6非対応のはず、2015/08/14現在。

AWSにおけるipv6

単刀直入にいうと、ipv6非対応です。
EC2-Classic & ELBでは可能だったらしいのですが、私はClassicを触ったことがないので分かりません。現在、新規アカウントでClassicは出来ないので、実質非対応です。また、この点については、Asure, GCP(GCE), も同様です。ぱっと思い当たるので対応しているのは softlayerです、あくまで2015/08/14時点の話。

ELBはipv4/6 dualstack?

EC2-Classicであればdualstack.<elbのエンドポイント> で、 AレコードもAAAAレコードも戻ってくるので、ipv6による接続が可能でした。しかし、EC2-VPC(今のEC2)では、どうやらこれは出来ないようです。

Internet-Facing Load Balancers - Elastic Load Balancing

実際に試してみました。EC2-VPCでELBを立てても、dualstak.ipv6. も作成されます、DNS上は。実際にipv6でアクセスした場合、Connection Refused となります。この原因は私の推測ですが
EC2-VPCでも ELB自体にipv6アドレスは付く、しかしSecurity Group や Network ACL で ipv6のアドレスは指定出来ない(::/0とか無理)。よって、通信出来ない。
SGは明示的に許可されていないアドレスからのアクセスは蹴りますが、Refuseではなく、無視するので、外しているかもしれません。

Security Group と Network ACL ipv6対応状況

現状のEC2は全てVPC内に構築するため、Network ACL および Security Group側で v6 IPアドレスを制御出来ないというのが現状です。よって、グローバルであれ、ローカルであれ、仮にEC2に直接 v6のIPアドレスがふれたとしても、別マシンと一切通信出来ないということです。
しかしIPプロトコル番号41 = ipv6 には対応しています。ということは、アレですな、4to6とかのトンネルです。

ipv6 tunnel brockerを使う

グローバルで参照可能なipv6アドレスを実現するには、ipv6 tunnel brockerのちからを借ります。Hurricane Elasticというところがやっています。

www.slideshare.net

HEで実装

Hurricane Electric Free IPv6 Tunnel Broker

アカウント作成などが必要なので、サクっと作ってっください。具体的な設定方法の大まかな部分は、ググれば出てくるので、特記事項のみ書きます。

トンネルの作成

IPv4 Endpoint(Your side) は、AWSの場合はEIPとなります。トンネルを作る前に、疎通確認をHE側から行うようなので、pingが通るようにSGをいじっておきます。 f:id:iga-ninja:20150815111205p:plain

f:id:iga-ninja:20150815111327p:plain
各種OS向けの設定方法も生成してくれます。何と親切!しかし、下記に注意
1. IPプロトコル番号 41 を通過できるようにしておく。これは HEのサーバIP(v4) と EIP(v4)の話
2. localに指定するIPアドレスは、AWSの場合、EC2(ENI)のローカルIPアドレス

動作確認はpin6とかで

$ ping6 ipv6.google.com
PING ipv6.google.com(nrt13s38-in-x0e.1e100.net) 56 data bytes
64 bytes from nrt13s38-in-x0e.1e100.net: icmp_seq=1 ttl=59 time=3.85 ms
64 bytes from nrt13s38-in-x0e.1e100.net: icmp_seq=2 ttl=59 time=3.89 ms
64 bytes from nrt13s38-in-x0e.1e100.net: icmp_seq=3 ttl=59 time=4.16 ms
64 bytes from nrt13s38-in-x0e.1e100.net: icmp_seq=4 ttl=59 time=4.01 ms

Nexus5からhttpを叩いてみる

一応DNSにAAAAレコードを追加して試したが、直打ちでも多分いける。Apacheアクセスログはこんな感じ

2001:240:2401:dumm:dumm:dumm:dumm:dumm - - [15/Aug/2015:01:15:06 +0000] "GET / HTTP/1.1" 200 27 "-" "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36"

uとかmとかないからダミー。もちろん本物のIPv6アドレスが取れます。ただ、端末から確認できるv6アドレスとは異なる。今のところNexus側には/64で割り当てられるらしいので、wifiルータとしてIPv6を他の機器に付けられたらとか思うけど、今のところそんな機能は無いらしい。

ipv6のフィルタリング

SGはipv4しか捌けないので、source IPとかで絞るなら、EC2上のip6tablesにお願いするしか無いので試してみた。
http://wiki.princo.org/?ipv6%A4%C7%A5%D5%A5%A3%A5%EB%A5%BF%A5%EA%A5%F3%A5%B0(netfilter%2Fip6tables) を参考にしました。

# ip6tables -A INPUT -p tcp -s <NexusのIP 上から64>::/64 --dport 22 -j ACCEPT
# ip6tables -A INPUT -p tcp --dport 22 -j DROP

上手く動いているようです。ただし、v4/v6両方でアクセス可能としていたら、v6だと思ってたらv4でアクセスしてたことがあったので注意。

まとめ

  1. 2015/08 時点で ipv6 をネイティブ対応出来ているのはsoftlayerのみ
  2. ELBはipv6IPアドレスを持つようだが、EC2-VPCでは疎通出来ない
  3. 外部からipv6アクセス可能にするには、ipv6 tunnel brokerでなんとかできる
  4. トンネルの中の通信をSGで制御出来ないので、ip6tablesなど、EC2内部で何とかする

自分が生きている間にipv6を触ることなんてないと思っていたけど、こんなに簡単に触れるなら、一発あるかも?モバイルやIoTなど、大量のグローバルIPアドレスはやっぱりあった方がいい、と言うのはわかっているけど、そこへ至る動機がなかった、けど、今はある。ただ、softlayer以外のクラウドコンピュティングがネイティブに対応するのはきっとまだまだ先。