Private Subnetにあるインスタンスは、最近、EC2 Instance Connect Endpointが利用できるようになったために、踏み台無しで使えるようになったが、Amazon Linux以外では、パッケージの追加もできない。NAT Gateway(有償)を立てないと無理。しかし、NAT Gatewayを建てると、AirGapじゃないと言われることもあり、実際は、VPN/Direct Connectでオンプレに繋げて、オンプレのWeb Proxyを経由するしかなかった。。。はっきり言って、めんどくさい。
VPCをIPv6化して、ダメ元でPrivate SubnetにUbuntuを立ててみた。さらにダメ元でapt updateをかけてみたがちゃんと動作して、パッケージもインストールができる。aptで参照されるURLがIPv6のアドレスももっていたのだ。
これにはちょっとした構成が必要だったのだが。。。
閑話休題
ここからが少し詳しい解説。まず、IPv6って、NATでアドレス変換をする必要がないというか、そんなロジックはない。すべてのアドレスが一意なので不要。よって、Private SubnetにあるインスタンスがもつIPv6アドレスは、一意のアドレスとなる。
Private SubnetにIPv6を振っただけでは、インターネットに通信はしない。しかし、Egress-only internet gateway (無償)をたてると、インターネットに通信をしてくれる。IPv6のアドレスでそのままインターネットに通信をする。前述のようにNATをしているわけではなく、直の外向きの通信。
アプローチを簡単にまとめると
- VPCでIPv6を有効にする。
- 全てのサブネットにIPv6のサブネットをふる
- Public Subnetでは、Internet Gatewayを、Private Subnetでは、Egress-only internet gatewayをそれぞれデフォルトルートとする
ということでPrivate SubnetでUbuntuのパッケージ追加が実現ができる。実は、IPv6のアドレスを持っているWebサイトにもアクセスができる。ただ、依然IPv4での通信は抑止されているので、AWSCLIでEC2の操作とか、証明書のCRLの取得などはできない。現時点では、ほぼフタをされているといっても過言ではない。
以下、キャプチャー。それにしてもIPv6は一意なので、マスクすべき部分が多くて大変。
VPCでCIDRの設定をする。
AmazonからIPv6をもらう。
/56のIPv6がもらえる。
サブネットにIPv6を割り当てる。
サブネット分割して割り当てるので、/64で割り当てる。
このケースの場合2406:XXXX:fd00/56をもらっているので、
- 2406:XXXX:fd00/64
- 2406:XXXX:fd01/64
- 2406:XXXX:fd02/64
- 2406:XXXX:fd03/64 ->これを割り当てた。
サブネットは1つしか割り当てられない。
Egress only internet gatewayを作る。ほんと作るだけ。
Route Tableに ::/0をEgress only internet gatewayを割り当てる。
EC2インスタンスをたてるときには、以下で設定をする。
Public IP (IPv4)はアサインしない。というかできない。また、PrivateのIPv4はちゃんともらえる。さらにIPv6のアサインする。
プライベートサブネットにインスタンスを立てたので、EC2 Instance Connectは、Public IPv4アドレスが必要となるため利用できない。よって、以下のいずれかの方法で接続することになる。
- パブリックサブネットに踏み台ホストを用意する
- Direct Connect/VPC経由でPrivate IPv4で接続する
- EC2 Instance Connect Endpointで接続する
のいずれかとなる。コストがかからないEC2 Instance Connect Endpoint経由でログイン。
ログインして、早速apt updateを叩いてみる。。。
apt updateが正常終了した。
もちろんパッケージも導入可能だった。
プライベートサブネットなのに、Ubuntuのレポジトリにアクセスできたのは何故だろうか?
aptのURLであるap-northeast-1d.clouds.ports.ubuntu.comをnslookupしてみる
なんと、IPv4/IPv6のアドレスを返してくる。つまりDual Stackである。
別の環境(IPv4)で調べてみると
IPv4しか返さない。
テストとして、www.yahoo.co.jp の名前解決と到達性を調べてみる。
つまり、IPv4インターネットには到達できないことがわかる。
さらに、www.google.com の名前解決と到達性を調べてみる
googleもDual StackでIPv6を返してきた。また、プライベートサブネットからの到達もできた。これは、Egress-only internet gatewayのおかげである。
念の為、接続先にちゃんとIPv6でアクセスできているかをcurl ifconfig.ioで確認してみる。
ちゃんとIPv6で接続ができている。NATはされてない(無い)ので、アクセス元のデバイスが一意で知られてしまうということも意味する。アクセス元の匿名性ということではなんだかなぁという気もする。
フレッツ光などのIPv6の場合、最悪ご家庭のアドレスがバレてしまう。不用意になんでもかんでもIPv6を有効にするのはいかがなものかと思う。
最後に、AWS EC2のエンドポイント(ec2.ap-northeast-1.amazonaws.com)を調べてみると。。。
AWSのエンドポイントは、残念ながらIPv4のままだということがわかる。この手のサービスにアクセスするためには、引き続き、インタフェース型のエンドポイントを作る必要がある。まだ、AWSのサービスすべてがIPv6に完全対応にはなっていない。
追記:リージョンによっては、IPv6のサポートがありそう。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/aws-ipv6-support.html
EC2:https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Using_Endpoints.html
Egress-only internet gatewayは、IPv6環境下で外向けの通信を行わせるものなので、IPv6のサイトであればアクセスができる。しかし、あくまでも外向けなので、外からの着信(SSHでのログインなど)はできない。そのようなユースケースの場合は、引き続き、パブリックサブネットを使う必要がある。
まとめると、プライベートサブネットでUbuntuを使うのであれば、IPv6を有効にしておくのはあり!
パブリックサブネットにIPv6のみのインスタンスを置いた場合は、次のエントリで紹介する。
実はなんやかんやでIPv6を知らないと設定できないなぁと感じた。この手のベースになる知識って、ベンダー資格と違って、更新しろとか、連絡もなく、周りが使わなければ、全然必要はない。なので、知らないまま行く人もいるんだろうなぁ。コンテナとかと同じく、レガシーおじさん?はずっとやらない、かついずれ突然常識となるレイヤー。おじさん(俺)も大変だぁw