宛先の重複を管理する

このページでは、プロデューサー ネットワーク管理者が、Private Service Connect インターフェースを使用する Virtual Private Cloud(VPC)ネットワークで宛先の重複を管理する方法について説明します。

Google Cloud では、同じ仮想マシン(VM)インスタンスのネットワーク インターフェースに割り当てられたサブネットの IP アドレス範囲に、重複する IP アドレス範囲を使用することはできません。ただし、図 1 に示すように、コンシューマー VPC ネットワークとプロデューサー VPC ネットワークのサブネットが重複する場合があります。宛先 IP アドレス範囲が重複する Private Service Connect インターフェースを使用する場合は、意図したネットワーク内の正しい宛先にトラフィックが到達できるように、追加の構成が必要になります。

このページで説明するコマンドでは、Debian オペレーティング システムを使用する VM のルーティングを一時的に更新します。VM を永続的に更新する場合や、VM で他のオペレーティング システムを実行している場合は、オペレーティング システムの公開ドキュメントをご覧ください。

図 1. 両方のサブネットが同じ IP アドレス範囲を使用するため、プロデューサー VPC ネットワーク内の Subnet-a はコンシューマー VPC ネットワーク内の subnet-c と重複します。プロデューサー VM は、両方のネットワークの 10.0.1.5 に到達可能でなければなりません。

重複する宛先 IP アドレス範囲は、次の方法で管理できます(詳細はこのページで説明します)。

次の方法で宛先の重複を管理することもできますが、ここでは説明しません。

  • ソケット ライブラリと bind() を使用してルーティングを制御する。
  • プロデューサー ネットワークで、完全に重複しない IP アドレス空間を使用する。
  • オンプレミス ホスト用の限定公開の Google アクセスを構成する。プロデューサー側の重複 IP アドレスがファースト パーティの API エンドポイントのみである場合に、この方法を使用できます。
  • 重複する IP アドレス空間を分離するには、仮想ルーティングと転送(VRF)を使用します。各 Private Service Connect インターフェースに VRF インスタンスを割り当てます。トラフィックが目的の宛先に到達するように、各 VRF インスタンスのデフォルト ルートを構成します。
  • eBPF を使用して、IP アドレス以外に基づく高度なルーティング ルールをカスタマイズする。この方法は、上記の方法を使用できない場合におすすめします。

ネットワーク名前空間を使用して宛先アドレスの重複を管理する

ネットワーク名前空間を使用して、宛先アドレスの重複を管理できます。この方法は、プロデューサー VM 上の一部のアプリケーションがコンシューマ ワークロードにのみアクセスし、プロデューサー VM 上の他のアプリケーションはプロデューサー ワークロードにのみアクセスする場合に適しています。

ネットワーク名前空間を使用して宛先アドレスの重複を管理する手順は次のとおりです。

  1. Private Service Connect インターフェースを持つ VM に接続します。

  2. 次のコマンドを実行します。

    ip address
    

    ネットワーク インターフェースのリストで、Private Service Connect インターフェースのゲスト OS 名を見つけてメモします(例: ens5)。この名前は、Private Service Connect インターフェースの IP アドレスに関連付けられています。

  3. コンシューマー向けのトラフィック用にネットワーク名前空間を作成します。

    sudo ip netns add consumer-ns
    
  4. Private Service Connect インターフェースをコンシューマーのネットワーク名前空間に移動します。次のコマンドを個別に実行します。

    sudo ip link set OS_INTERFACE_NAME netns consumer-ns
    
    sudo ip netns exec consumer-ns ip link set OS_INTERFACE_NAME up
    

    OS_INTERFACE_NAME は、手順 2 で見つけた Private Service Connect インターフェースのゲスト OS 名(ens5 など)に置き換えます。

  5. Private Service Connect インターフェースの IP アドレスを復元します。

    sudo ip netns exec consumer-ns ip addr add INTERFACE_IP/32 dev OS_INTERFACE_NAME
    

    INTERFACE_IP は、Private Service Connect インターフェースの IP アドレスに置き換えます。

  6. Private Service Connect インターフェースに対する変更を検証します。

    sudo ip netns exec consumer-ns ip a
    

    Private Service Connect インターフェースのゲスト OS 名がコマンドの出力に含まれていることを確認します。インターフェースに正しい IP アドレスが設定されていることを確認します。

  7. ゲートウェイ IP アドレスにルートを追加します。

    sudo ip netns exec consumer-ns ip route add GATEWAY_IP dev OS_INTERFACE_NAME scope link
    

    GATEWAY_IP は、Private Service Connect インターフェースのサブネットのデフォルト ゲートウェイの IP アドレスに置き換えます。

  8. Private Service Connect インターフェースのデフォルト ルートを追加します。

    sudo ip netns exec consumer-ns ip route add default via GATEWAY_IP dev OS_INTERFACE_NAME
    
  9. consumer-ns 名前空間のルーティング テーブルを検証します。

    sudo ip netns exec consumer-ns ip route
    

    ルーティング テーブルに次の形式のエントリがあることを確認します。

    default via GATEWAY_IP dev OS_INTERFACE_NAME
    
  10. 重複する IP アドレス範囲の各部分でインターフェースが VM に到達可能であることを確認するには、次の操作を行います。

    1. ターゲット VM への上り(内向き)ICMP トラフィックを許可するようにファイアウォール ルールが構成されていることを確認します。

    2. インターフェースの VM から重複する IP アドレス範囲のコンシューマ VM に ICMP ping を送信します。コンシューマの名前空間を使用します。

      sudo ip netns exec consumer-ns ping CONSUMER_IP_ADDRESS
      

      CONSUMER_IP_ADDRESS は、重複する IP アドレス範囲のコンシューマ VM の IP アドレスに置き換えます。

    3. インターフェースの VM から重複する IP アドレス範囲のプロデューサー VM に ICMP ping を送信します。デフォルトの名前空間を使用します。

      ping PRODUCER_IP_ADDRESS
      

      PRODUCER_IP_ADDRESS は、重複する IP アドレス範囲のプロデューサー VM の IP アドレスに置き換えます。

ポリシーベースのルーティングで宛先アドレスの重複を管理する

インターフェースの VM のオペレーティング システムでポリシーベースのルーティングを構成することで、宛先アドレスの重複を管理できます。この方法は、同じアプリケーションがコンシューマ VPC ネットワークとプロデューサー VPC ネットワークの両方にあるワークロードにアクセスする必要がある場合に適しています。ただし、重複する IP 範囲に到達するポートごとに手順を繰り返す必要があります。

宛先の重複を管理するためにポリシーベースのルーティングを設定する場合は、コンシューマ アプリケーションに使用するターゲット ポートを選択します。これらのポートのいずれかに送信されるトラフィックは、Private Service Connect インターフェースを介してコンシューマ サブネットに転送されます。その他のトラフィックは、デフォルト インターフェースを介してプロデューサー サブネットに送信されます。

  1. Private Service Connect インターフェースの VM に接続します

  2. iproute2 コマンドを利用できない場合は、インストールしてください。

  3. 次のファイルに書き込み可能であることを確認します。 /etc/iproute2/rt_tables

  4. ルートテーブルを作成します。Private Service Connect インターフェースのデフォルト ルートを追加します。

    echo "200 pscnet" >> /etc/iproute2/rt_tables \
    sudo ip route add default dev OS_INTERFACE_NAME table pscnet
    

    OS_INTERFACE_NAME は、Private Service Connect インターフェースのゲスト OS 名ens5 など)に置き換えます。

  5. デフォルト ゲートウェイを使用して、重複するコンシューマ サブネット範囲へのルートを追加します。

    sudo ip route add CONSUMER_SUBNET_RANGE via GATEWAY_IP dev OS_INTERFACE_NAME table pscnet
    

    次のように置き換えます。

  6. この VM からの下り(外向き)パケットに、送信元 IP アドレスとしてインターフェースの IP アドレスが使用されるように、ルートテーブルを更新します。

    sudo ip route add GATEWAY_IP src INTERFACE_IP dev OS_INTERFACE_NAME table pscnet
    

    INTERFACE_IP は、Private Service Connect インターフェースの IP アドレスに置き換えます。

  7. コンシューマ アプリケーションのターゲット ポート宛てのすべてのトラフィックに適用される IP ルールを追加します。

    sudo ip rule add dport CONSUMER_PORT table pscnet
    

    CONSUMER_PORT は、コンシューマ VM へのトラフィック用に構成したポートに置き換えます。

  8. 宛先ポートに基づいてパケットが適切な VM にルーティングされていることを確認するには、次の操作を行います。

    1. プロデューサー ネットワークとコンシューマ ネットワークで、重複する範囲の同じ IP アドレスを使用するテスト用 VM を作成します。
    2. テスト用 VM に HTTP サーバーを設定します。コンシューマ アプリケーション用に設定したポートでリッスンするようにコンシューマのテスト用 VM を構成します。コンシューマのアプリケーション用に設定したポートとは異なるポートでリッスンするようにプロデューサーのテスト用 VM を構成します。
    3. テスト用 VM への HTTP トラフィックを許可するようにファイアウォール ルールが構成されていることを確認します。
    4. コンシューマのアプリケーション用に構成したポートを使用して、テスト用の IP アドレスに GET リクエストを送信し、正しいインスタンスに到達していることを確認します。

      curl TEST_IP_ADDRESS:CONSUMER_PORT
      

      次のように置き換えます。

      • TEST_IP_ADDRESS: テスト用 VM の IP アドレス。
      • CONSUMER_PORT: コンシューマーのアプリケーションのポート。
    5. 本番環境のテスト用 VM に構成したポートを使用して、テスト用の IP アドレスに GET リクエストを送信し、正しいインスタンスに到達していることを確認します。

      curl IP_ADDRESS:PRODUCER_PORT
      

      次のように置き換えます。

      • IP_ADDRESS: テスト用 VM の IP アドレス。
      • PRODUCER_PORT: 本番環境のテスト用 VM に構成したポート。