世界のやまさ

SEKAI NO YAMASA

Microsoft Azure の NAT について AWS と GCP と比較

この記事は Azure Advent Calendar 2019 の 11 日目です。 qiita.com

Microsoft Azure では Private IP から Public IP への通信は基本的に自動で NAT 変換が行われます。 Microsoft のドキュメントでは NAT ではなく、 SNAT と明記されることが多いようです。

SNAT とは?

Source NAT, 送信元 NAT と呼ばれます。

SNATとは、2つのTCP/IPネットワークの境界にある機器が双方のIPアドレスを自動的に変換するNAT(Network Address Translation)のうち、送信元アドレスを書き換える方式。

(中略)

SNATは組織内のLANなどでプライベートアドレス(ローカルアドレス)しか持たないパソコンなどが、ネットワーク境界の機器が持つグローバルアドレス(インターネット上のアドレス)を使って外部と通信するためによく用いられる。

SNAT(ソースNAT)とは - IT用語辞典 e-Words より引用

具体的な例では Public IP を持たない VM がインターネットにアクセスしようとするときに SNAT 変換が行われます。

AWS, GCP, Azure で SNAT できる構成はどんなの?

私が調べた限りですと、 Azure だけちょっと特殊に見えました。それぞれ具体的に見ていきましょう。

AWS

VPC を使用して、 Public IP を持たない EC2 インスタンスがインターネットにアクセスするためには、 NAT Instance と呼ばれる EC2 を別途作成するか、またはマネージドな NAT Gateway を使用します。

2019年12月現在、 NAT Instance を積極的に採用する理由はあまりなさそうに思えたので、 NAT Gateway を利用した場合のイメージを作成しました。正確に書くと Router が入るようですが、説明を簡素化するため省略しました。

f:id:nnasaki:20191004184134p:plain
AWS の図

このとき、NAT Gateway と Elastic IP が課金されます。

GCP

GCP の場合も AWS とほぼ同様に見受けられました。

f:id:nnasaki:20191004190135p:plain
GCPの図 (Cloud NAT  |  Cloud NAT  |  Google Cloud より引用)

こちらの情報が大変参考になりました。

blog.jicoman.info

料金は AWS とほぼ同様のようです。

  • NAT ゲートウェイの 1 時間あたりの料金(NAT ゲートウェイにつき 1 時間あ- たり $0.045 から)
  • ゲートウェイによって処理された上りトラフィックと下りトラフィックの 1 GB あたりの料金
  • VM からトラフィックをネットワーク外に送信するための下り料金は変更なし

cloud.google.com

Azure

Azure の場合は NAT Gateway を用意しなくても SNAT 変換されます。

公式ドキュメント のシナリオ3相当になるのですが、宇田さんの記事がよりわかりやすいです。

www.syuheiuda.com

以下のように Azure の NAT は3種類のパターンに分かれます。

  1. VM に Public IP がある場合: VM (NIC) に紐づいた Public IP で SNAT
  2. VM に Public IP がなく、外部 LB に紐づいている場合: LB の Public IP で SNAT
  3. VM に Public IP も外部 LB にも紐づいていない場合: 当該リージョンの任意の Public IP で SNAT

f:id:nnasaki:20191007173133p:plain
Azure の SNAT は3種類 Azure VM の SNAT の話 – Made in container より引用

Azure の良い特徴でもあり、悪いところかもしれません。ほかのクラウドを使っていた人からするとちょっと戸惑うと思います。

明示的に SNAT Gateway のような機能を用意しなくても暗黙的に SNAT がされます。料金はかかりません。

他のクラウドのように SNAT Gateway のようなものを作りたければ、先の2のパターンになり、外部 LB が NAT Gateway 兼 Load Balancer のように動作します。

SNAT 変換ができなくなると何が起こる?

SNAT ができる数は限られていまして、枯渇すると単純に通信ができなくなります。数年前の自宅用ルーターではわりとよく起きていたと思います。

クラウドにおいても、当然利用できるポートは限られています。

AWS

GCP

  • Quotas  |  Cloud NAT  |  Google Cloud
    • For Cloud NAT, this limit is reduced to a total of 64k connections per VM for all supported protocols combined.
    • VM ごとに 64k に制限されるというように読み取れます

Azure

外部 LBを立てた場合です。

SNAT をうまくやりくりするには?

アプリ上でプログラミングを工夫することで SNAT の消費を避けることができます。以前書いた記事を参照してください。

blog.nnasaki.com

しかしながら、個人的に懸念しているのは、昨今のアプリはコンテナ化により 1 VM 上で動作する個々のアプリは増加しており、それぞれのアプリは独立したコンテナ上で動いているため、使用する SNAT 数は爆発的に増えていると考えています。つまり、各コンテナ間で SNAT を共有するプールのような仕組みは無いため、 マイクロサービスのように Public IP で外部サービスを多数利用する場合、 SNAT の枯渇はかなり起きやすい問題では? と考えています。

まだ自分の中での仮説にすぎないので、今後この問題に直面した時に、なんらかの解があればまたブログなどにしたいと思います。

今回は Azure だけでなく、AWS と GCP も加えましたので、皆さんの参考になれば幸いです。