EC2で運用しているWebサイトをIPv6対応した時の設定

AWS

概要

  • AWSのサービスは2016年末あたりからIPv6に対応しています。
  • 普通に構築する手順にプラスアルファするだけで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://matsu.teraren.com/blog/
*   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 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

参考資料

コメント