1148 文字
6 分
EC2で運用しているWebサイトをIPv6対応した時の設定
概要
- AWSのサービスは2016年末あたりからIPv6に対応しています。
- 普通に構築する手順にプラスアルファするだけでIPv6対応にできるのでやっちゃいましょう。
背景
- GoogleのIPv6利用率統計 はこんな感じになっています。
- 日本は先進国の中では低めです。


設定例
- VPC, EC2, ALB, Route 53を使ったTLS対応のWebサイトの場合における、設定例を紹介します。
VPCの設定
- まずVPC自体の設定で、IPv6のネットワークアドレスを設定します。
- IPv6の場合は、prefixが56bitで振られます!贅沢!
- IPv6の場合はサブネット内にもグローバルアドレスが振られます。NATはありません。

- route tableにIPv6のルートが追加されるはずです。追加されていなかったら手動で追加します。

- Subnetに対してもIPv6のネットワークアドレスを割り振ります。なんとなく64ビットずつ。

- そのsubnetにインスタンスが追加された際に、自動的にIPv6のアドレスを振るように設定を変更しておく。

- そうすると、EC2を対象とするsubnetに追加するとこんな感じに、IPv4とIPv6のアドレスが振られます。

- ALBは、構築時にIPv4のみか、IPv4とIPv6の両方に対応するかを選ばされます。既にIPv4で作成済みだったら、dualstackで新規構築します。

- Route 53にはAレコードと、AAAAレコードに同じ値を入れればOKです。2個作らないといけないのが面倒です。
- 変更があったら両方やらないといけません。IPv4とIPv6で別のエンティティを返却出来る事になります。

nginx側は設定不要で、IPv6のインターフェイスのポートもLISTENしてくれていました。
$ netstat -l | grep httptcp 0 0 0.0.0.0:http 0.0.0.0:* LISTENtcp6 0 0 [::]:http [::]:* LISTENDNSのテスト。hostコマンドでは、AレコードとAAAAレコードが帰ってくる。
$ host matsu.teraren.commatsu.teraren.com is an alias for awsblog.teraren.com.awsblog.teraren.com has address 54.64.69.23awsblog.teraren.com has IPv6 address 2406:da14:e67:4500:9d34:aba7:1c9e:aad8トラブルシューティング
- 運用しているOSによっては、OS側のNICの設定が必要そうです。
- security group周りも自動的にIPv6の設定が入っているので特に設定しないでOKですが、念のためご確認を。
- VPCのルーティングテーブルにて、IPv6のルーティングがegress only internetになっている場合は外から入れないので、IPv4と同じように普通のインターネットゲートウェイを指定してください
検証
- ここのサイトで確認出来ます。

- nginxのアクセスログに、2行目にあるようなIPv6のアドレスで接続が来るようになっていればOK。
- IPv6チェッカーや、IPv6に対応した端末からアクセスしてみてください。
172.31.24.248 - - [11/Oct/2018:06:46:40 +0000] "GET / HTTP/1.1" 200 396 "-" "ELB-HealthChecker/2.0"2600:3c00::f03c:91ff:fe93:dcd4 - - [11/Oct/2018:06:46:49 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"- curlで、IPv6のhttpsでの接続性もテスト
$ curl -6 -I -vv https://blog.teraren.com/* Trying 2406:da14:e67:4500:9d34:aba7:1c9e:aad8...* TCP_NODELAY set* Connected to matsu.teraren.com (2406:da14:e67:4500:9d34:aba7:1c9e:aad8) port 443 (#0)* ALPN, offering h2* ALPN, offering http/1.1* successfully set certificate verify locations:* CAfile: /etc/ssl/certs/ca-certificates.crt CApath: /etc/ssl/certs* TLSv1.2 (OUT), TLS handshake, Client hello (1):* TLSv1.2 (IN), TLS handshake, Server hello (2):* TLSv1.2 (IN), TLS handshake, Certificate (11):* TLSv1.2 (IN), TLS handshake, Server key exchange (12):* TLSv1.2 (IN), TLS handshake, Server finished (14):* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):* TLSv1.2 (OUT), TLS change cipher, Client hello (1):* TLSv1.2 (OUT), TLS handshake, Finished (20):* TLSv1.2 (IN), TLS handshake, Finished (20):* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384* ALPN, server accepted to use h2* Server certificate:* subject: CN=matsu.teraren.com* start date: Aug 14 19:18:15 2018 GMT* expire date: Nov 12 19:18:15 2018 GMT* subjectAltName: host "matsu.teraren.com" matched cert's "matsu.teraren.com"* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3* SSL certificate verify ok.* Using HTTP2, server supports multi-use* Connection state changed (HTTP/2 confirmed)* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0* Using Stream ID: 1 (easy handle 0x5562dd0a5940)> HEAD /blog/ HTTP/2> Host: matsu.teraren.com> User-Agent: curl/7.58.0> Accept: */*>* Connection state changed (MAX_CONCURRENT_STREAMS updated)!< HTTP/2 200HTTP/2 200< server: nginx/1.14.0server: nginx/1.14.0< date: Thu, 11 Oct 2018 07:51:10 GMTdate: Thu, 11 Oct 2018 07:51:10 GMT< content-type: text/html; charset=UTF-8content-type: text/html; charset=UTF-8< vary: Accept-Encodingvary: Accept-Encoding< expires: Wed, 11 Jan 1984 05:00:00 GMTexpires: Wed, 11 Jan 1984 05:00:00 GMT< cache-control: no-cache, must-revalidate, max-age=0cache-control: no-cache, must-revalidate, max-age=0< pragma: no-cachepragma: no-cache< link: ; rel="https://api.w.org/"link: ; rel="https://api.w.org/"< link: ; rel=shortlinklink: ; rel=shortlink<* Connection #0 to host matsu.teraren.com left intactついでに、このブログもIPv6 readyにしました。
追記
- しばらく運用してみました。IPv6のアクセスはとても少ないです。
- 363/40757=0.008906446=0.8%
追記2
こちらのサイトもIPv6対応。
% host -t aaaa minedia.comwww.minedia.com has IPv6 address 2406:da14:9cd:7103:863a:d6cf:32b1:80a0www.minedia.com has IPv6 address 2406:da14:9cd:7100:dc9c:9b11:ba:ea7ewww.minedia.com has IPv6 address 2406:da14:9cd:7102:c893:4482:c987:22ef
% host -t a minedia.comwww.minedia.com has address 13.112.43.184www.minedia.com has address 52.194.55.79www.minedia.com has address 13.114.169.247参考資料
EC2で運用しているWebサイトをIPv6対応した時の設定
https://blog.teraren.com/posts/ec2-ipv6/ 