Cloud NAT ルール

このページでは、Public NAT の Cloud NAT ルールの概要について説明します。これらのルールを使用すると、Cloud NAT を使用してインターネットに接続する方法を定義できます。

Public NAT の Cloud NAT ルールは、送信元(プレビュー)または宛先アドレスに基づく送信元ネットワーク アドレス変換(SNAT)をサポートしています。

NAT ルール

デフォルトでは、Public NAT 用に Cloud NAT ゲートウェイを構成すると、その NAT ゲートウェイによって変換されたパケットは、同じ NAT IP アドレスセットを使用してすべてのインターネット アドレスに到達します。Cloud NAT によって変換されるパケットをより細かく制御する必要がある場合は、NAT ルールを追加できます。

NAT ルールは、一致条件と対応するアクションを定義します。NAT ルールを指定すると、各パケットが NAT ルールと照合されます。パケットがルールに設定された条件と一致する場合、その一致に対応するアクションが行われます。

Public NAT の NAT ルールは、送信元アドレスと宛先アドレスの両方の照合をサポートしています。

  • 送信元ベースのルール(プレビュー)では、パケットは送信元 IP アドレスで照合されます。IPv4 送信元アドレスのみがサポートされています。
  • 宛先ベースのルールでは、パケットは宛先 IP アドレスで照合されます。IPv4 の宛先アドレスのみがサポートされます。

1 つの NAT ルールで送信元ベースの条件と宛先ベースの条件を組み合わせることはできません。詳細については、NAT ルールの仕様をご覧ください。

Cloud NAT ルールの構成例

次の例は、少数の IP アドレスからのアクセスのみが宛先によって許可される場合に、NAT ルールを使用する方法を示しています。プライベート サブネット内の Google Cloud VM からこのような宛先へのトラフィックは、許可された IP アドレスでのみ SNAT 変換することをおすすめします。これらの IP アドレスは他の宛先に使用しないことをおすすめします。

VPC ネットワーク test のリージョン A にある Subnet-110.10.10.0/24)の VM に対しては、次の要件を考慮してください。

  • これらの VM が宛先 198.51.100.20/30 にトラフィックを送信するには、NAT IP アドレス 203.0.113.20 を使用する必要があります。
  • これらの VM が宛先 198.51.100.30 または 198.51.100.31 にトラフィックを送信するには、NAT IP アドレス 203.0.113.30 を使用する必要があります。
  • これらの VM が他のインターネット宛先にトラフィックを送信するには、NAT IP アドレス 203.0.113.40 を使用する必要があります。

この VPC ネットワークには、同じリージョン内に 2 つの追加サブネットが含まれています。これらの VM が宛先にトラフィックを送信するには、NAT IP アドレス 203.0.113.10 を使用する必要があります。

2 つの Cloud NAT ゲートウェイを使用した Cloud NAT の構成。
2 つの Cloud NAT ゲートウェイを使用した Cloud NAT の構成(クリックして拡大)

この例では NAT ルールを使用できますが、サブネット Subnet-110.10.10.0/24)には他のサブネットとは異なる NAT ルールがあるため、2 つの NAT ゲートウェイが必要です。この構成は次の手順に沿って作成します。

  1. NAT IP アドレス 203.0.113.40Subnet-1 用に Cloud NAT Gateway 1 という名前のゲートウェイを作成し、次のルールを追加します。
    1. Cloud NAT Gateway 1 の NAT ルール 1: 宛先が 198.51.100.20/30 の場合、NAT に 203.0.113.20 を使用します。
    2. Cloud NAT Gateway 1 の NAT ルール 2: 宛先が 198.51.100.30 または 198.51.100.31 の場合、NAT に 203.0.113.30 を使用します。
  2. リージョンの他のサブネット用に Cloud NAT Gateway 2 というゲートウェイを作成し、NAT IP アドレスを 203.0.113.10 として割り当てます。この手順では NAT ルールは必要ありません。

NAT ルールの仕様

  • Cloud NAT は、送信元ベースと宛先ベースのルールをサポートしています。各ルールは、送信元アドレスまたは宛先アドレスのいずれかに基づく条件を定義します。両方に基づく条件は定義できません。
  • ルール優先度は、0(最高優先度)から 65,000(最低優先度)までの範囲で NAT ルールを一意に識別します。2 つのルールに同じ優先度を設定することはできません。
  • 各 NAT 構成にはデフォルトのルールがあります。
    • 同じ NAT 構成で他の NAT ルールが一致しない場合、デフォルト ルールが適用されます。
    • デフォルト ルールのルール優先度は 65001 です。
    • 送信元ベースのルールと宛先ベースのルールの両方で、デフォルト ルールの IP CIDR 範囲は 0.0.0.0/0 です。
  • Cloud NAT ルールは、NAT IP 割り振りオプションの値が MANUAL_ONLY の場合のみサポートされます。
  • 特定のルールで構成された IP アドレスはすべて同じティアのものである必要があります。

    同じルール(デフォルト ルールを含む)内に、プレミアム ティアの IP アドレスとスタンダード ティアの IP アドレスを混在させることはできません。

  • 一致条件の IP CIDR 範囲は、NAT ルール間で重複しないようにする必要があります。任意のパケットに適用できるルールは 1 つだけです。パケットが送信元ベースのルールと宛先ベースのルールの両方に一致する場合、Cloud NAT は優先度の高いルールを適用します。

    0.0.0.0/0 はデフォルト ルールで使用されているため、送信元または宛先範囲として 0.0.0.0/0 を使用する NAT ルールは作成できません。

  • NAT ルール間で NAT IP アドレスが重複しないようにする必要があります。

  • ルールには、空でない Active IP アドレスまたは空でない Drain IP アドレスが必要です。ルールに空の Active IP アドレスがある場合、NAT ルールに一致する新しい接続は破棄されます。

  • エンドポイントに依存しないマッピングが有効になっている NAT ゲートウェイに NAT ルールを追加することはできません。NAT ルールが含まれる NAT ゲートウェイで、エンドポイントに依存しないマッピングを有効にすることはできません。

また、すべての VM は Cloud NAT ルールに応じて、VM 1 つあたりの最小ポート数の値から、割り当てられたポートを取得します。NAT ルールから VM に割り振られたポートを使い切った場合、NAT ルールに一致する新しい接続は破棄されます。

たとえば、VM 1 つあたり 4,096 個のポートを構成し、16 個の VM と 2 個の NAT ルール(IP アドレスは rule1 に 1 つ、rule2 に 2 つ)と、2 つの IP アドレスがあるデフォルト ルール(default)を構成すると、16 個の VM すべてが NAT ルールのバンドルごとに 4,096 個のポートを取得します。この例では、defaultrule2 ではすべての VM に対して問題なく処理が行われますが、rule1 ではすべての VM にポートを割り当てることができません。そのため、rule1 を経由する必要がある VM からのトラフィックは破棄され、デフォルト ルールを使用しないことによるリソース不足の兆候が見られることがあります。

ルール式の言語

NAT ルールは Common Expression Language 構文を使用して記述されます。

式には次の 2 つの構成要素が必要です。

  • ルール式で検査される属性
  • 式の一部として属性に対して実行される演算

たとえば、次の式では、演算 inIpRange() で属性 destination.ip198.51.100.0/24 が使用されています。この場合、destination.ip198.51.100.0/24 の IP アドレス範囲に含まれている場合、式は true を返します。

inIpRange(destination.ip, '198.51.100.0/24')

NAT ルールは、次の属性と演算のみをサポートします。

属性

属性は、送信元 IP アドレスや宛先 IP アドレスなど、送信パケットからの情報を表します。

属性名 説明
source.ip パケットの送信元 IP アドレス
destination.ip パケットの宛先 IP アドレス

運用

次の表では、ルールの式を定義するために、属性と一緒に使用できる演算子について説明します。

オペレーション 説明
inIpRange(string, string) -> bool IP CIDR 範囲 y に IP アドレス x が含まれている場合、inIpRange(x, y)true を返します。
|| 論理演算子。x または ytrue の場合、x || ytrue を返します。
== 等号演算子。xy と等しい場合、x == ytrue を返します。

式の例

パケットは送信元アドレスまたは宛先アドレスのいずれかに基づいて照合できますが、両方に基づいて照合することはできません。

ソースベースのマッチングの例

送信元 IP アドレスが 10.0.0.25 のパケットを照合します。

"source.ip == '10.0.0.25'"

送信元 IP アドレスが 10.0.0.25 または 10.0.0.26 のパケットを照合します。

"source.ip == '10.0.0.25' || source.ip == '10.0.0.26'"

送信元 IP アドレス範囲 10.0.2.0/24 のパケットを照合します。

"inIpRange(source.ip, '10.0.2.0/24')"

送信元 IP アドレス 10.0.0.25 または送信元 IP アドレス範囲 10.0.2.0/24 のパケットを照合します。

"source.ip == '10.0.0.25' || inIpRange(source.ip, '10.0.2.0/24')"

リンク先ベースのマッチングの例

宛先 IP アドレス 198.51.100.20 のパケットを照合します。

"destination.ip == '198.51.100.20'"

宛先 IP アドレスが 198.51.100.20 または 198.51.100.21 のパケットを照合します。

"destination.ip == '198.51.100.20' || destination.ip == '198.51.100.21'"

宛先 IP アドレス範囲 198.51.100.10/30 のパケットを照合します。

"inIpRange(destination.ip, '198.51.100.10/30')"

宛先 IP アドレス 198.51.100.20 または宛先 IP アドレス範囲 198.51.100.10/30 のパケットを照合します。

"destination.ip == '198.51.100.20' || inIpRange(destination.ip, '198.51.100.10/30')"

次のステップ