Cloud NAT アドレスとポートの概要

このページでは、Cloud NAT ゲートウェイが外部 IP アドレスを使用する方法について説明します。また、ゲートウェイを使用する Compute Engine 仮想マシン(VM)インスタンスと Google Kubernetes Engine(GKE)ノードに送信元ポートを割り当てる方法についても説明します。

この情報を確認する前に、Cloud NAT の概要をよく理解してください。

NAT IP アドレス

NAT IP アドレスはリージョンの外部 IP アドレスで、インターネット上でルーティングが可能です。外部 IP アドレスがない VM は Cloud NAT ゲートウェイによって指定されるサブネット内の NAT IP アドレスを使用して、パケットをインターネット上の宛先に送信します。

NAT IP アドレスを Cloud NAT ゲートウェイに割り当てるには、次のいずれかの方法を使用します。

  • NAT IP アドレスの自動割り振りこのオプションを選択するか Google Cloud のデフォルトを選択すると、ゲートウェイを使用する VM の数と各 VM に予約されたポートの数に基づいて、ゲートウェイにリージョン外部 IP アドレスが自動的に追加されます。また、その NAT IP アドレス上の送信元ポートが不要になると、Cloud NAT によって NAT IP アドレスが自動的に削除されます。

    • Cloud NAT ゲートウェイが NAT IP アドレスを追加すると、静的な(予約された)リージョン外部 IP アドレスが作成されます。これらのアドレスはプロジェクトごとの割り当てに反映されます。
    • 自動割り振りでは、割り振られる予定の次の IP アドレスを予測することはできません。事前に把握している割り当て見込みの NAT IP アドレスのセットを割り当てる場合(たとえば、許可リストを作成する場合)は、手動で NAT IP アドレスを割り当てます。
    • あとで手動 NAT IP アドレス割り当てに切り替えると、自動的に予約されたリージョン外部 IP アドレスが削除されます。詳細については、割り当ての切り替えをご覧ください。
  • NAT IP アドレスの手動割り当て。このオプションを選択した場合、Cloud NAT ゲートウェイに静的な(予約済みの)リージョン外部 IP アドレスを作成して手動で割り当てます。Cloud NAT ゲートウェイを編集することにより、手動で割り当てる NAT IP アドレスの数を増減できます。

    • 手動 NAT IP アドレス割り当てを使用する場合は、Cloud NAT ゲートウェイに必要なリージョン外部 IP アドレスの数を計算する必要があります。ゲートウェイで NAT IP アドレスが不足していると、Cloud NAT はパケットを破棄します。Cloud NAT ロギングを使用しているときにエラーロギングを有効にすると、ドロップされたパケットがログに記録されます。
    • 計算例については、ポート予約の例をご覧ください。

NAT IP アドレスを自動的に割り振るか、手動で割り当てる場合は、Cloud NAT の制限をご覧ください。

割り当て方法の切り替え

Cloud NAT ゲートウェイでは、IP アドレスの割り振りを自動から手動に切り替えることが可能です。ただし、NAT IP アドレスは保持できません。自動的に割り振られた NAT IP アドレスは静的ですが、手動 NAT IP アドレス割り当てに移行することはできません。たとえば、自動的に割り振られた NAT IP アドレスで Cloud NAT ゲートウェイを開始した場合、後で手動で割り当てられた NAT IP アドレスに切り替えるときに、同じアドレスを使用することはできません。

Cloud NAT が NAT IP アドレスの自動割り振りに使用するリージョン外部 IP アドレスのセットは、手動で選択できるリージョン外部 IP アドレスのセットとは異なります。

NAT IP アドレスのドレイン

NAT の IP アドレスの手動割り当てを設定して Cloud NAT ゲートウェイを構成する場合、ゲートウェイが使用する NAT IP アドレスの数を減らす際の動作を選択できます。

  • 手動で割り当てられた NAT IP アドレスを削除すると、確立済みの NAT 接続が即時に切断されます。

  • その代わりに、手動で割り当て振られた NAT IP アドレスのドレインを選択することもできます。ドレインを行うと、Cloud NAT ゲートウェイは新しい接続で NAT IP アドレスを使用しませんが、確立済みの接続ではそのアドレスを引き続き使用します。確立された接続は突然終了せず、正常に終了します。手順については、NAT に関連付けられた外部 IP アドレスをドレインするをご覧ください。

ポート

Cloud NAT ゲートウェイの各 NAT IP アドレスは、64,512 個の TCP 送信元ポートと 64,512 個の UDP 送信元ポートを提供します。TCP と UDP はそれぞれ IP アドレスあたり 65,536 個のポートをサポートしていますが、Cloud NAT は先頭の 1,024 個の既知(特権)ポートを使用しません。

Cloud NAT ゲートウェイを作成するときに、VM インスタンスあたりの最小ポート数を指定します。Cloud NAT ゲートウェイは、VM から送信されたパケットに対して送信元ネットワーク アドレス(SNAT)を実行するときに、パケットの NAT 送信元 IP アドレスと送信元ポートを変更します。

ポートの予約手順

以下の手順で、Cloud NAT は Cloud NAT ゲートウェイが処理する VM ごとに NAT の送信元 IP アドレスと送信元ポートのタプルをプロビジョニングします。Cloud NAT ゲートウェイを使用して限定公開の Google Kubernetes Engine クラスタに NAT サービスを提供する場合、NAT の送信元 IP アドレスと送信元ポートのタプルの数がノード全体の VM に割り当てられ、ノード上のすべての Pod で共有されます。

  1. NAT を実行する VM 内部 IP アドレスを決定します。Cloud NAT ゲートウェイで NAT を実行する VM 内部 IP アドレスは、ゲートウェイが提供するように構成されたサブネット IP アドレス範囲によって決まります。

    • VM のネットワーク インターフェースで使用されるサブネットのプライマリ IP アドレス範囲に NAT を実行するように Cloud NAT ゲートウェイが構成されている場合、ゲートウェイは、VM のプライマリ内部 IP アドレスだけでなく、サブネットのプライマリ IP アドレス範囲にある VM のエイリアス IP 範囲に NAT を実行します。

    • VM のネットワーク インターフェースで使用されるサブネットのセカンダリ IP アドレス範囲に NAT を実行するように Cloud NAT ゲートウェイが構成されている場合、ゲートウェイは、そのサブネットのセカンダリ IP アドレス範囲のエイリアス IP 範囲に対して NAT を実行します。

  2. VM に割り当てる送信元ポートの数を計算します。

    1. Cloud NAT ゲートウェイが NAT を実行する VM のエイリアス IP 範囲のネットマスクが /32 よりも短い場合、つまり複数の IP アドレスから構成される VM エイリアス IP 範囲の 1 つ以上で NAT が実行される場合、Cloud NAT は、次の 2 つの値の大きいほうを最大値として使用して次のステップに進みます。

      • 指定した VM インスタンスあたりの最小ポート数
      • 1,024

      それ以外の場合、Cloud NAT ゲートウェイは VM インスタンスあたりの最小ポート数を入力として使用して次のステップに進みます。

    2. Cloud NAT ゲートウェイはこの入力を使用して、VM に割り当てる送信元ポートの数を決定します。

  3. NAT の送信元 IP アドレスと送信元ポートのタプルを VM に予約します。NAT の送信元 IP アドレスと送信元ポートのタプルの数は、Cloud NAT ゲートウェイが VM に割り当てる送信元ポートの数と一致します。

    Cloud NAT ゲートウェイが 2 つ以上の NAT IP アドレスを使用する場合、NAT の送信元 IP アドレスと送信元ポートのタプルは、複数の NAT IP アドレスにまたがる場合があります。1 つの NAT IP アドレスでは、VM に必要な NAT 送信元 IP アドレスと送信元ポートのタプルを満たす十分な送信元ポートが予約されない可能性があります。

ポートの削減

すでに構成済みの Cloud NAT リソースに対する VM あたりの最小ポート数を減らすことが可能です。ただし、コネクション ドレインは発生しません。VM あたりのポート数を減らすと、確立された NAT 接続が即時に切断されます。

ポートと接続

Cloud NAT ゲートウェイが VM 用に予約する NAT 送信元 IP アドレスと送信元ポートのタプルの数によって、VM が固有の宛先に接続できる接続数が制限されます。

  • 固有の宛先とは、宛先 IP アドレス、宛先ポート、IP プロトコル(TCP、UDP など)で構成される固有の 3 タプルのことです。

  • 接続とは、NAT の送信元 IP アドレスと送信元ポートのタプルと、固有の宛先の 3 タプルで構成される固有の 5 タプルを意味します。UDP プロトコルはコネクションレスのため、接続は固有の UDP データグラムに関連付けられた 5 タプルになります。

Cloud NAT ゲートウェイが、ポート予約手順に従って VM のポートの固定数を 1,024 で計算したとします。Cloud NAT ゲートウェイは、VM の NAT 送信元 IP アドレスと送信元ポートのタプルを 1,024 個の固有の組み合わせで予約します。Cloud NAT ゲートウェイは、固有の宛先の 3 タプルごとに 1,024 の同時接続を処理できます。次のような例が挙げられます。

  • ゲートウェイは、TCP プロトコルを使用するポート 80 で宛先 IP アドレス 203.0.113.99 に対して 1,024 の同時接続をサポートします。

  • ゲートウェイは、TCP プロトコルを使用するポート 443 で同じ宛先 IP アドレスに対してさらに 1,024 の同時接続をサポートします。

  • ゲートウェイは、TCP プロトコルを使用するポート 80 で異なる宛先 IP アドレスに対してさらに 1,024 の同時接続をサポートします。

複数のポートの同時再利用とエンドポイントに依存しないマッピング

宛先 IP アドレス、宛先ポート、プロトコルの宛先 3 タプルのうち、少なくとも 1 つの情報が変更されていれば、同じ NAT 送信元アドレスと送信元ポートのタプルを他の接続にも同時に使用できます。

Cloud NAT は、RFC 5128 セクション 2.3 で定義されているエンドポイントに依存しないマッピングを使用するため、Cloud NAT が同じ NAT の送信元 IP アドレスと送信元ポートのタプルを複数の内部 IP アドレスとクライアント VM のエフェメラル送信元ポートに割り当てていると、クライアント VM が固有の宛先 3 タプルに対して確立可能な同時接続数は少なくなります。この状態は、クライアント VM の内部 IP アドレスが多く、同じ宛先 3 タプルに対して多数の接続が行われた場合に発生する可能性が高くなります。クライアント VM が内部 IP アドレスとエフェメラル送信元ポートから最初にパケットを送信するときに、Cloud NAT は次の間に多対 1 のエンドポイントに依存しないマッピングを作成します。

  • 内部 IP アドレスとエフェメラル送信元ポートのタプル
  • 固有の NAT 送信元 IP アドレスと送信元ポートのタプル

たとえば、クライアント VM がエフェメラル送信元ポート 10001 を使用して内部 IP アドレス 10.0.0.2 からパケットを送信すると、Cloud NAT は 10.0.0.2:10001 に NAT 送信元 IP アドレスと送信元ポートのタプルを割り当てます。このタプルは、これ以降に発生する 10.0.0.2:10001 から宛先 3 タプルへのすべての接続に使用されます。

同じ VM が異なるエフェメラル送信元ポートを使用してパケットを送信した場合(たとえば 10.0.0.2:20002)、Cloud NAT は、それ以降に発生した 10.0.0.2:20002 から宛先 3 タプルへのすべての接続に NAT 送信元 IP アドレスと送信元ポートのタプルを割り当てます。Cloud NAT が、内部 IP アドレスとエフェメラル送信元ポートのタプルの両方に同じ NAT 送信元 IP アドレスと送信元ポートのタプルを割り当てる可能性があります。状況によっては、エンドポイントに依存しない競合が発生します。

より詳しい例については、エンドポイントに依存しないマッピングの競合例をご覧ください。

エンドポイントに依存しない競合の低減

エンドポイントに依存しない競合が発生する可能性を減らすには、次の方法があります。

  • ポート予約手順で、各クライアント VM に割り当てる NAT 送信元 IP アドレスと送信元ポートのタプルの数を増やせるように、VM インスタンスあたりの最小ポート数を増やします。これにより、クライアント IP アドレスとエフェメラル送信元ポートの 2 つ以上のタプルが同じ NAT 送信元 IP アドレスと送信元ポートのタプルに割り当てられる可能性を減らすことができます。

  • 使用可能なエフェメラル送信元ポートを増やすように VM インスタンスを構成します。

    • Linux VM では、次のコマンドを使用すると、ip_local_port_range にエフェメラル送信元ポートの最大数(64,512)を設定できます。

      echo 1024 65535 > /proc/sys/net/ipv4/ip_local_port_range
      
    • Windows VM の場合は、次のコマンドを使用すると、エフェメラル送信元 TCP ポートと UDP ポートの数を最大数(64,512)に設定できます。

      netsh int ipv4 set dynamicport tcp start=1024 num=64512
      netsh int ipv4 set dynamicport udp start=1024 num=64512
    • GKE ノードでは、特権 DaemonSet を使用してこの構成を自動化できます。

  • GKE クラスタの場合、特定の宛先に送信されるパケットに対して各ノードで実行される送信元 NAT を無効にできます。これは、次のいずれかの方法で行います。

TCP 送信元ポートの再利用の遅延

Cloud NAT ゲートウェイが TCP 接続を終了した後、ゲートウェイが同じ NAT 送信元 IP アドレスと送信元ポートのタプルを同じ宛先(宛先 IP アドレス、宛先ポート、プロトコル)に再利用する前に、Google Cloud は 2 分間の遅延を適用します。

この遅延は短縮できませんが、次のいずれかを行うことはできます。

  • ポート予約手順で、VM に NAT の送信元 IP アドレスと送信元ポートのタプルをより多く割り当てられるように、VM インスタンスあたりのポートの最小数を増やします。

  • 同じプロトコルを使用して、同じ宛先 IP アドレスと宛先ポートへの TCP 接続をすぐに確立し、終了する必要がある場合は、外部 IP アドレスを VM に割り当て、Cloud NAT ではなく、未承諾の上り(内向き)接続を制限するファイアウォール ルールを使用します。

送信元ポートとセキュリティ

セキュリティ対策として送信元ポートのランダム化を使用する場合は、次の点を考慮する必要があります。

次の例では、Cloud NAT で VM に NAT の送信元 IP アドレスと送信元ポートを予約する方法と、インターネットに送信されるパケットに NAT を実行する方法を説明します。

ポートの予約

次の例は、ポート予約手順の適用方法を示しています。

サブネットのプライマリ IP アドレス範囲に NAT を行うように Cloud NAT ゲートウェイが構成されているときに、そのサブネットを使用する VM にサブネットのプライマリ IP アドレス範囲のエイリアス IP 範囲が設定されていないとします。除算の結果は、最も近い整数に切り捨てます。⌊⌋ は floor(最大整数)関数で、除算の小数点以下を切り捨てます。

  • 手動割り当てを使用して 1 つの NAT IP アドレスを持つ Cloud NAT ゲートウェイを構成し、VM インスタンスあたりの最小ポート数を 64 と構成した場合、ゲートウェイは最大 1,008 の VM に対して NAT サービスを提供できます。

    ⌊(1 NAT IP アドレス) × (アドレスあたり 64,512 ポート) ÷ (VM あたり 64 ポート)⌋ = 1,008 VM

  • 1,008 個を超える VM をサポートする場合は、Cloud NAT ゲートウェイに 2 つ目の NAT IP アドレスを割り当てることができます。2 つの NAT IP アドレスを使用し、VM あたりの最小ポート数を 64 に維持することで、2,016 の VM をサポートできます。

    ⌊(2 NAT IP アドレス) × (アドレスあたり 64,512 ポート) ÷ (VM あたり 64 ポート)⌋ = 2,016 VM

  • VM あたりの最小ポート数を 4,096 に設定すると、各 NAT IP アドレスは 15 個の VM をサポートできます。この計算は、最も近い整数に切り捨てられます。

    ⌊(1 NAT IP アドレス) × (アドレスあたり 64,512 ポート) ÷ (VM あたり 4,096 ポート)⌋ = 15 VM

エンドポイントに依存しないマッピングの競合

次の例は、クライアント VM に十分な数の NAT 送信元 IP アドレスと送信元ポートのタプルが割り当てられている場合でも、エンドポイントに依存しないマッピングにより、クライアント VM から同じ宛先 3 タプルへの同時接続数が減少する可能性があることを示しています。

サブネットのプライマリ IP アドレス範囲に NAT を実行するように Cloud NAT ゲートウェイを構成したとします。そのサブネットに、プライマリ内部 IP アドレスが 10.0.0.2 のネットワーク インターフェースを持つクライアント VM を作成しました。この VM のネットワーク インターフェースには外部 IP アドレスが割り当てられていません。

  1. VM が次の特性の接続を開始します。

    • 送信元の内部 IP アドレスとポート: 10.0.0.2:10001
    • 宛先 3 タプル: 203.0.113.1:80(TCP を使用)
    • Cloud NAT は、次の NAT 送信元 IP アドレスと送信元ポートのタプルを使用します。192.0.2.10:30009
  2. VM が次の特性の 2 番目の接続を開始します。

    • 送信元の内部 IP アドレスとポート: 10.0.0.2:10002
    • 宛先 3 タプル: 203.0.113.2:80(TCP を使用)
    • Cloud NAT は、この接続に同じ NAT 送信元 IP アドレスと送信元ポートのタプル 192.0.2.10:30009 を使用する可能性があります。異なるクライアント IP アドレスとエフェメラル送信元ポートに同じ NAT 送信元 IP アドレスと送信元ポートのタプルを使用することは可能です。
  3. 最初と 2 番目の接続はともにアクティブですが、Cloud NAT は次の特性の TCP 接続を開始することはできません。

    • 最初の接続と同じ送信元の内部 IP アドレスとポート: 10.0.0.2:10001
    • 2 番目の接続と同じ宛先 3 タプル: 203.0.113.2:80(TCP を使用)

    最初の接続で確立されたエンドポイントに依存しないマッピングで、10.0.0.2:10001 からの接続は同じ NAT 送信元 IP アドレスと送信元ポートのタプル 192.0.2.10:30009 を使用しますが、192.0.2.10:30009 はすでに 203.0.113.2:80 への 2 番目の TCP 接続で使用されています。このため、3 番目の接続は失敗します。

  4. この例の後続の接続が正常に確立するには、次のいずれかの条件を満たす必要があります。

    • 最初の TCP 接続が終了している。これにより、10.0.0.2:10001192.0.2.10:30009 の間でエンドポイントに依存しないマッピングが解除されるため、3 番目の接続を別の NAT 送信元 IP アドレスと送信元ポートのタプルにマッピングし、TCP を使用して 203.0.113.2:80 と通信が可能になります。
    • 2 番目の TCP 接続が終了している。これにより、10.0.0.2:10001 が解放され、NAT 送信元 IP アドレスと送信元ポート 192.0.2.10:30009203.0.113.2:80 との TCP 接続で使用可能になります。
    • 3 番目の接続で別のエフェメラル(内部)送信元ポートを選択する。この例では、エンドポイントに依存しないマッピングにより、内部 NAT 送信元 IP アドレスと送信元ポート 10.0.0.2:1000110.0.0.2:10002 に多対 1 のマッピングが確立され、203.0.113.2:80 との TCP 接続で 192.0.2.10:30009 が使用されています。3 番目の接続が 1000110002 の両方と異なるエフェメラル送信元ポートを使用する場合、別の NAT 送信元 IP アドレスと送信元ポートを 203.0.113.2:80 との TCP 接続に使用できる可能性があります。

競合を回避する手法については、エンドポイントに依存しない競合の低減をご覧ください。

NAT フロー

この例で、プライマリ内部 IP アドレス 10.240.0.4 を持ち、外部 IP アドレスを持たない VM は、外部 IP アドレス 203.0.113.1 から更新をダウンロードする必要があります。次のように nat-gw-us-east ゲートウェイを構成しました。

  • インスタンスあたりの最小ポート数: 64
  • 手動で割り当てた 2 つの NAT IP アドレス: 192.0.2.50192.0.2.60
  • subnet-1 のプライマリ IP アドレス範囲を NAT に設定しました。
Cloud NAT 変換の例(クリックして拡大)
Cloud NAT 変換の例(クリックして拡大)

Cloud NAT は、ポート予約手順に従い、ネットワーク内の各 VM に NAT の送信元 IP アドレスと送信元ポートのタプルを予約します。たとえば、Cloud NAT ゲートウェイは、内部 IP アドレス 10.240.0.4 を持つ VM 用に 64 の送信元ポートを予約します。NAT IP アドレス 192.0.2.50 には、64 の予約されていないポートがあるため、ゲートウェイは、その VM に 64 の NAT 送信元アドレスと送信元ポートのタプルのセットを次のように予約します。

  • 192.0.2.50:34000 から 192.0.2.50:34063

VM が TCP プロトコルを使用して宛先ポート 80 の更新サーバー 203.0.113.1 にパケットを送信すると、次のようになります。

  • VM が次の属性のリクエスト パケットを送信します。

    • NAT 送信元 IP アドレス: 10.240.0.4、VM のプライマリ内部 IP アドレス
    • 送信元ポート: 24000、VM のオペレーティング システムによって選択されたエフェメラル送信元ポート
    • 宛先アドレス: 203.0.113.1、更新サーバーの外部 IP アドレス
    • 宛先ポート: 80、更新サーバーへの HTTP トラフィックの宛先ポート
    • プロトコル: TCP
  • nat-gw-us-east ゲートウェイは、下り(外向き)で SNAT を実行し、リクエスト パケットの NAT 送信元 IP アドレスと送信元ポートを書き換えます。ネクストホップがデフォルトのインターネット ゲートウェイである 203.0.113.1 宛のルートが VPC ネットワークにある場合、変更されたパケットがインターネットに送信されます。デフォルト ルートは通常、次の要件を満たす必要があります。

    • NAT 送信元 IP アドレス: 192.0.2.50、VM の予約済み NAT 送信元 IP アドレスと送信元ポートのタプルの 1 つ
    • 送信元ポート: 34022、VM の予約済み送信元ポートタプルの未使用の送信元ポート
    • 宛先アドレス: 203.0.113.1、変更なし
    • 宛先ポート: 80、変更なし
    • プロトコル: TCP、変更なし
  • 更新サーバーがレスポンス パケットを送信すると、そのパケットは次の属性の nat-gw-us-east ゲートウェイに到達します。

    • NAT 送信元 IP アドレス: 203.0.113.1、更新サーバーの外部 IP アドレス
    • 送信元ポート: 80、更新サーバーからの HTTP レスポンス
    • 宛先アドレス: 192.0.2.50、リクエスト パケットの元の NAT 送信元 IP アドレスと一致
    • 宛先ポート: 34022、リクエスト パケットの送信元ポートと一致
    • プロトコル: TCP、変更なし
  • nat-gw-us-east ゲートウェイは、レスポンス パケットに宛先ネットワーク アドレス変換(DNAT)を実行し、パケットが VM に配信されるようにレスポンス パケットの宛先アドレスと宛先ポートを書き換えます。

    • NAT 送信元 IP アドレス: 203.0.113.1、変更なし
    • 送信元ポート: 80、変更なし
    • 宛先アドレス: 10.240.0.4、VM のプライマリ内部 IP アドレス
    • 宛先ポート: 24000、リクエスト パケットの元のエフェメラル送信元ポートと一致
    • プロトコル: TCP、変更なし

次のステップ