概要
- 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 http tcp 0 0 0.0.0.0:http 0.0.0.0:* LISTEN tcp6 0 0 [::]:http [::]:* LISTEN
DNSのテスト。hostコマンドでは、AレコードとAAAAレコードが帰ってくる。
$ host matsu.teraren.com matsu.teraren.com is an alias for awsblog.teraren.com. awsblog.teraren.com has address 54.64.69.23 awsblog.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 200 HTTP/2 200 < server: nginx/1.14.0 server: nginx/1.14.0 < date: Thu, 11 Oct 2018 07:51:10 GMT date: Thu, 11 Oct 2018 07:51:10 GMT < content-type: text/html; charset=UTF-8 content-type: text/html; charset=UTF-8 < vary: Accept-Encoding vary: Accept-Encoding < expires: Wed, 11 Jan 1984 05:00:00 GMT expires: Wed, 11 Jan 1984 05:00:00 GMT < cache-control: no-cache, must-revalidate, max-age=0 cache-control: no-cache, must-revalidate, max-age=0 < pragma: no-cache pragma: no-cache < link: ; rel="https://api.w.org/" link: ; rel="https://api.w.org/" < link: ; rel=shortlink link: ; 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.com www.minedia.com has IPv6 address 2406:da14:9cd:7103:863a:d6cf:32b1:80a0 www.minedia.com has IPv6 address 2406:da14:9cd:7100:dc9c:9b11:ba:ea7e www.minedia.com has IPv6 address 2406:da14:9cd:7102:c893:4482:c987:22ef % host -t a minedia.com www.minedia.com has address 13.112.43.184 www.minedia.com has address 52.194.55.79 www.minedia.com has address 13.114.169.247
Comments