AWSのPrivate SubnetにあるUbuntuにNATをしないでパッケージを追加する方法 (実はIPv6の話)

投稿者: | 8月 16, 2023

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の設定をする。

UntitledImage

AmazonからIPv6をもらう。

UntitledImage

 

UntitledImage

/56のIPv6がもらえる。

UntitledImage

サブネットにIPv6を割り当てる。

UntitledImage

サブネット分割して割り当てるので、/64で割り当てる。

このケースの場合2406:XXXX:fd00/56をもらっているので、

  • 2406:XXXX:fd00/64
  • 2406:XXXX:fd01/64
  • 2406:XXXX:fd02/64
  • 2406:XXXX:fd03/64 ->これを割り当てた。

サブネットは1つしか割り当てられない。

UntitledImage

Egress only internet gatewayを作る。ほんと作るだけ。

UntitledImage

Route Tableに ::/0をEgress only internet gatewayを割り当てる。

UntitledImage

EC2インスタンスをたてるときには、以下で設定をする。

Public IP (IPv4)はアサインしない。というかできない。また、PrivateのIPv4はちゃんともらえる。さらにIPv6のアサインする。

UntitledImage

プライベートサブネットにインスタンスを立てたので、EC2 Instance Connectは、Public IPv4アドレスが必要となるため利用できない。よって、以下のいずれかの方法で接続することになる。

  • パブリックサブネットに踏み台ホストを用意する
  • Direct Connect/VPC経由でPrivate IPv4で接続する
  • EC2 Instance Connect Endpointで接続する

のいずれかとなる。コストがかからないEC2 Instance Connect Endpoint経由でログイン。

UntitledImage

ログインして、早速apt updateを叩いてみる。。。

UntitledImage

apt updateが正常終了した。

もちろんパッケージも導入可能だった。

UntitledImage

プライベートサブネットなのに、Ubuntuのレポジトリにアクセスできたのは何故だろうか?

aptのURLであるap-northeast-1d.clouds.ports.ubuntu.comをnslookupしてみる

なんと、IPv4/IPv6のアドレスを返してくる。つまりDual Stackである。

UntitledImage

別の環境(IPv4)で調べてみると

UntitledImage

IPv4しか返さない。

 

テストとして、www.yahoo.co.jp の名前解決と到達性を調べてみる。

UntitledImage

つまり、IPv4インターネットには到達できないことがわかる。

 

さらに、www.google.com の名前解決と到達性を調べてみる

UntitledImage

googleもDual StackでIPv6を返してきた。また、プライベートサブネットからの到達もできた。これは、Egress-only internet gatewayのおかげである。

 

念の為、接続先にちゃんとIPv6でアクセスできているかをcurl ifconfig.ioで確認してみる。

UntitledImage

 

ちゃんとIPv6で接続ができている。NATはされてない(無い)ので、アクセス元のデバイスが一意で知られてしまうということも意味する。アクセス元の匿名性ということではなんだかなぁという気もする。

フレッツ光などのIPv6の場合、最悪ご家庭のアドレスがバレてしまう。不用意になんでもかんでもIPv6を有効にするのはいかがなものかと思う。

 

最後に、AWS EC2のエンドポイント(ec2.ap-northeast-1.amazonaws.com)を調べてみると。。。

UntitledImage

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

カテゴリー: AWS

コメントを残す