複数のネットワーク インターフェースを持つインスタンスの作成

このページでは、ネットワーク インターフェースが複数ある仮想マシン(VM)インスタンスの設定について説明します。

デフォルトでは、VPC ネットワークのすべてのインスタンスにデフォルトのネットワーク インターフェースが 1 つずつあります。ここで説明する手順を使用して、追加のネットワーク インターフェースを作成します。各インターフェースはそれぞれ異なる VPC ネットワークに接続され、インスタンスごとに Google Cloud Platform(GCP)の異なる VPC ネットワークにアクセスできます。複数のネットワーク インターフェースを同じ VPC ネットワークに接続することはできません。

追加のネットワーク インターフェースが不要な場合は、インスタンスの作成と起動の手順を行ってください。

複数のネットワーク インターフェースとその仕組みの詳細については、複数のネットワーク インターフェースをご覧ください。

仕様

要件

  • ネットワーク インターフェースを構成できるのはインスタンスの作成時のみです。
  • 1 つのインスタンスの中で構成されている各ネットワーク インターフェースは、それぞれ異なる VPC ネットワークに接続される必要があります。各インターフェースの属するサブネットの IP 範囲は、他のインターフェースのサブネットと重なってはいけません。
  • インスタンスを作成する前に、複数のインターフェースの接続先となる追加の VPC ネットワークが存在している必要があります。追加の VPC ネットワークの作成手順については、VPC の使用をご覧ください。
  • ネットワーク インターフェースを削除するには、インスタンスの削除が必要となります。
  • インスタンスごとに少なくとも 1 つのネットワーク インターフェースが必要です。インスタンスあたりのネットワーク インターフェースの最大数は 8 ですが、インスタンスのマシンタイプによって異なります。
    • nic0 は必須で、インスタンスの作成時に構成する必要があります。
    • nic1nic7 は省略可ですが、これらもインスタンスの作成時に構成する必要があります。
    • 詳細については、インターフェースの最大数をご覧ください。
  • インターフェースごとに任意で外部 IP アドレスを設定できます。
  • GCP の DHCP サーバーは、デフォルトのルート(RFC 3442「クラスレス静的ルート」)をデフォルトの NIC(nic0)にのみ送信します。別の NIC でデフォルトのルートが必要な場合、インスタンスでデフォルトのルートを構成する必要があります。インスタンスでデフォルトのルートを変更している間 VM への接続が失われることを避けるため、シリアル コンソールを使用します。
  • 共有 VPC ネットワークでは、複数のネットワーク インターフェースを使用できます。VM は、デフォルト ネットワーク インターフェースでのみ、異なるプロジェクトの共有ネットワークに接続できます。そのため、VM がサービス プロジェクトに存在する場合、この VM はデフォルト インターフェースでのみ共有ネットワークに接続できますが、他のインターフェースはすべて同じサービス プロジェクト内のローカル ネットワークに接続している必要があります。VM がホスト プロジェクトに存在する場合、この VM は、ホスト プロジェクト内の任意のネットワークに接続されたネットワーク インターフェースを使用できます。

制限事項

  • ネットワーク インターフェースを既存の VM に追加したり、既存の VM から削除したりすることはできません。

複数のネットワーク インターフェースを持つ権限、IAM、インスタンス

複数のネットワーク インターフェースを持つインスタンスを作成するには、次のいずれかの役割が必要です。

  • プロジェクト オーナーまたはプロジェクト編集者の役割
  • compute.instanceAdmin.v1 の役割

通常のプロジェクト(共有 VPC を使用しないプロジェクト)での複数のインターフェースを持つインスタンスおよびインスタンス テンプレートの作成と削除: プロジェクト レベルでオーナー、編集者、または compute.instanceAdmin.v1 の役割を持つユーザーは、その同じプロジェクトの一部である VPC ネットワークとサブネットに関連付けられている複数のインターフェースを持つインスタンスを作成できます。

共有 VPC 環境での複数のネットワーク インターフェースを持つインスタンスおよびインスタンス テンプレートの作成と削除: プロジェクト レベルでオーナー、編集者、または compute.instanceAdmin.v1 の役割を持つユーザーは、複数のインターフェースを持つインスタンスを作成できます。これらのインターフェースのいずれかが共有 VPC ホスト プロジェクトのサブネットに関連付けられる場合、共有 VPC ホスト プロジェクト レベルまたは共有 VPC サブネット レベルでの compute.networkUser の役割も必要です。

権限の詳細については、Compute Engine IAM ドキュメントをご覧ください。

VPC ネットワークの種類が異なる複数のネットワーク インターフェースの使用

  • レガシー ネットワークでは、複数のネットワーク インターフェースはサポートされていません。
  • 複数のネットワーク インターフェースを構成するときは、各インターフェースを自動モード VPC ネットワークかカスタムモード VPC ネットワークに接続します。

ネットワーク インターフェースの IP アドレスの割り当て

  • サブネットから割り当てられたプライベートのプライマリ IP アドレスを使用して、各ネットワーク インターフェースを構成する必要があります。
    • 1 つのインスタンス内の各インターフェースに割り当てられたプライベートのプライマリ アドレスは、異なっていなければなりません。
  • 任意で、独自のプライベート IP アドレスを使用して各仮想インターフェースを構成できます。このプライベート IP アドレスは、エフェメラルでも予約済みでもかまいません。

ネットワーク インターフェースの最大数

  • インスタンスごとに使用できる仮想インターフェースの最大数は 8 です。
  • インスタンスで使用できるインターフェース数は、インスタンスのマシンタイプと vCPU 数によって異なります。

通常、n1-standard-x、n1-highmem-x、n1-highcpu-x、f1-micro、g1-small、カスタム VM には、次のルールが適用されます。

  • VM のネットワーク インターフェース数が 2 の場合、2 vCPU 以上
  • VM の vCPU あたりのネットワーク インターフェース数が 1 の場合、2 vCPU より大きくする(VM あたりのネットワーク インターフェースの最大数は 8)

次の表を使用して、インスタンスに接続できるネットワーク インターフェース数を判断します。

インスタンスのタイプ vCPU 数 仮想 NIC の数
n1-standard-x、n1-highmem-x、n1-highcpu-x、n1-highmem-x、n1-highcpu-x "x" の値で指定。 "x" の値あたり 1 つの NIC、NIC の最低数は 2、NIC の最大数は 8
f1-micro 0.2 vCPU 2 つの NIC
g1-small 0.5 vCPU 2 つの NIC
カスタム インスタンス 1~64 の間で vCPU を設定可能 vCPU あたり 1 つの NIC、NIC の最低数は 2、NIC の最大数は 8

複数のネットワーク インターフェースを持つ仮想マシン インスタンスの作成

インターフェースが 1 つのインスタンスの作成方法に変更はありません。インスタンスの作成に関する一般的な手順については、インスタンスの作成と起動をご覧ください。

インスタンスを作成するときに、複数のネットワーク インターフェースを追加します。

  • Console の [インスタンスの作成] ページで [ネットワーキング] -> [ネットワーク インターフェース] セクションを選択し、ネットワーク インターフェースを追加します。
  • gcloud コマンドライン ツールで instances create コマンドを使用します。インターフェースごとに --network-interface フラグ、その次に ([network | subnet], private-network-ip, address) などの適切なネットワーキング キーを指定します。

最初のインターフェースは、常に nic0 として作成されます。また、これが常にデフォルトのインターフェースになります。このインターフェースは、GCP ネットワーキングの他の側面で重要となります。たとえば、負荷分散でサポートされているのは nic0 のみです。

Console


  1. Google Cloud Platform Console の [インスタンスの作成] ページに移動します。
    [インスタンスの作成] ページに移動
  2. インスタンス名、ゾーン、マシンタイプ、その他インスタンスの基本的な部分について、セクションに入力します。
  3. [管理] タブと [ディスク] タブのフィールドを入力します。
  4. [ネットワーキング] タブの [ネットワーク インターフェースを追加] をクリックします。
  5. ネットワークを選択します。
  6. VPC ネットワークに複数のサブネットがある場合、サブネットを選択します。
  7. カスタム内部 IP アドレスをインターフェースに割り当てるため、[内部 IP] プルダウン メニューで [カスタム] を選択して IP アドレスを入力します。
  8. 外部 IP アドレスが不要であることを示すため、[外部 IP] プルダウン メニューで [なし] を選択します。
  9. 静的外部 IP アドレスを割り当てるため、[外部 IP] プルダウン メニューで [新しい静的 IP] を選択して [名前] と [説明] を入力し、[予約] をクリックします。
  10. IP 転送を有効にするため、[IP 転送] プルダウン メニューで [オン] を選択します。
  11. さらにネットワーク インターフェースを追加するには、[ネットワーク インターフェースを追加] をクリックして上記のステップ 5~10 を行います。

gcloud

instances create コマンドを使用して、新しいインスタンスでネットワーク インターフェースを作成します。各インターフェースの --network-interface フラグ、その次に ([network | subnet], private-network-ip, address) などの適切なネットワーキング キーを指定します。

このスニペットは、インスタンス作成時に指定できる多くのパラメータの 1 つである --network-interface フラグについて示すことのみを目的としたものです。他のフラグについては、gcloud リファレンスで instances create コマンドをご覧ください。必要なネットワーク インターフェースの数をサポートしているマシンタイプを確認するには、ネットワーク インターフェースの最大数の表をご覧ください。

gcloud compute instances create [INSTANCE_NAME] --machine-type=[MACHINE_TYPE] \
    [--network-interface
        [network=[NETWORK_NAME]; default="default" | subnet=[SUBNET]]
        [address=[ADDRESS] | no-address]
        [private-network-ip=[PRIVATE_NETWORK_IP]]
    ...]

3 つのネットワーク インターフェースのあるインスタンスを作成するためのコマンド例:

 gcloud compute instances create vm1 --machine-type=n1-standard-4 \
    --network-interface '' \
    --network-interface subnet=net1-subnet-a,private-network-ip=10.128.0.2,address=35.237.93.110 \
    --network-interface subnet=net2-subnet-b,private-network-ip=10.129.0.2,no-address

インターフェースは次のように作成されます。

  • すべてのデフォルト設定が含まれる nic0。デフォルトの VPC ネットワークに関連付けられ、プライベート IP アドレスとエフェメラル パブリック IP アドレスが自動的に割り当てられます。
  • net1-subnet-a に属する nic1。内部 IP アドレスは 10.128.0.2 で、静的外部 IP アドレスは 35.237.93.110 です。
  • net2-subnet-b に属する nic2。内部 IP アドレスは 10.129.0.2 で、パブリック IP アドレスはありません。

gcloud compute instances create コマンドと --network-interface フラグの詳細については、コマンドに関するドキュメントをご覧ください。

インスタンス グループの複数のネットワーク インターフェースの設定

マネージド インスタンス グループ内のすべてのインスタンスは、1 つのサブネットに制限されています。非マネージド インスタンス グループ内のすべてのインスタンスが負荷分散に使用された場合、これらのインスタンスは 1 つのサブネットに制限されます。詳細については、VPC ネットワーク負荷分散のドキュメントをご覧ください。

これらの制限があるため、インターフェースはインスタンスごとに 1 つだけ存在します。GCP では、インスタンス内の唯一のインターフェースに関連付けられているサブネットに基づいて検証を実行します。

マネージド インスタンス グループまたは非マネージド インスタンス グループ内のインスタンスに複数のインターフェースを構成した場合、引き続き GCP ではデフォルトの nic0 インターフェースに対してこれらの条件を検証します。

複数のインターフェースを持つインスタンス テンプレートの作成

インスタンスごとに 1 つのインターフェースを使用するインスタンス テンプレートの作成プロセスに変更はありません。このプロセスについては、gcloud リファレンスの instance-templates create コマンドで説明しています。

インスタンス テンプレートに複数のネットワーク インターフェースを設定するには、作成するネットワーク インターフェースごとに --network-interface フラグを設定します。


gcloud compute instance-templates create NAME [--description DESCRIPTION] \
    [--network-interface [network NETWORK; default="default" | subnet SUBNET][address ADDRESS| no-address] \
    [--network-interface [network NETWORK; default="default" | subnet SUBNET][address ADDRESS | no-address] \
    .....

各インターフェースにネットワーキング キー network, subnet, address を割り当てます。

たとえば、次のコマンドを実行すると、各インスタンスに 3 つのネットワーク インターフェースが設定されます。

gcloud compute instance-templates create template-1 \
    --network-interface subnet=net0-subnet-a \
    --network-interface subnet=net1-subnet-b,no-address \
    --network-interface subnet=net2-subnet-c,no-address \
    --region us-central1`

インターフェースは次のとおりです。

  • net0-subnet-a に属する nic0。自動的に割り当てられたパブリック IP アドレスがあります。
  • net1-subnet-b に属する nic1。パブリック IP アドレスはありません。
  • net2-subnet-c に属する nic2。パブリック IP アドレスはありません。

フラグと構文の詳細については、instance-templates create コマンドをご覧ください。

ポリシー ルーティングの構成

Google でサポートされているイメージでは、セカンダリ ネットワーク インターフェース(nic0 以外のインターフェース)と通信する IP アドレスが、そのセカンダリ インターフェースの関連サブネットのプライマリ サブネット範囲内にない場合、ポリシー ルーティングを構成して下りパケットが正しいインターフェースから出ていくようにする必要があります。このような場合は、ポリシー ルーティングを使用して、ネットワーク インターフェースごとに個別のルーティング テーブルを構成する必要があります。

次の手順で、複数のインターフェースを持つ Linux ベースのインスタンスにポリシー ルーティングを設定します。

  1. 次のコマンドを使用して、複数のネットワーク インターフェースが設定されたインスタンスに接続します。

    gcloud compute ssh multinic-vm
    
  2. nic1 に ifconfig を使用してポリシー ルーティングを構成します。下記の例では、GCP で内部 IP アドレス 192.168.0.2 が nic1 に割り当てられており、ゲートウェイが 192.168.0.1 であると仮定しています。

    sudo ifconfig eth1 192.168.0.2 netmask 255.255.255.255 broadcast 192.168.0.2 mtu 1430
    sudo echo "1 rt1" | sudo tee -a /etc/iproute2/rt_tables # (sudo su - first if permission denied)
    sudo ip route add 192.168.0.1 src 192.168.0.2 dev eth1 table rt1
    sudo ip route add default via 192.168.0.1 dev eth1 table rt1
    sudo ip rule add from 192.168.0.2/32 table rt1
    sudo ip rule add to 192.168.0.2/32 table rt1
    
  3. インスタンスにその他のインターフェース(nic2、nic3.... nic7)がある場合は、ステップ 2 のコマンドを繰り返します。

トラブルシューティング

複数のインターフェースのある VM を作成することができません

以下のエラー メッセージのいずれかが表示される場合があります。

  • Invalid value for field 'resource': ''. Too many network interfaces. The maximum number of network interfaces allowed for this machine type is.

    このエラー メッセージが表示された場合、インスタンス マシンタイプでサポートされている最大インターフェース数より多くのインターフェースを作成しようとしています。インターフェースの最大数の表を参照してください。

  • Networks must be distinct for NICs attached to a VM.

    このメッセージが表示された場合、同じネットワーク内に複数のインターフェースを作成しようとしています。各ネットワーク インターフェースは、それぞれ異なる VPC ネットワークに接続する必要があります。

  • Subnetwork CIDR ranges must be non-overlapping for NICs attached to a VM.

    このメッセージが表示された場合、VM のインターフェースに関連付けられた CIDR の範囲が重複しています。これらの CIDR 範囲には、VM インターフェースに関連付けられたサブネットのすべてのプライマリ範囲だけでなく、エイリアス IP 範囲により使用されるセカンダリ範囲も含まれます。各インターフェースが属するサブネットは、それぞれが別の VPC ネットワーク内にあり、他のインターフェースのサブネットと重なってはいけません。たとえば、インスタンスをリージョン us-west1 で作成しようとしている場合、次のコマンドか Google Cloud Platform Console を使用すると、サブネット プライマリ CIDR 範囲を確認できます。

    gcloud compute networks subnets list --regions us-west1
    NAME                REGION    NETWORK          RANGE
    default             us-west1  default          10.138.0.0/20
    overlapping-subnet  us-west1  test-network     10.138.8.0/24
    

    セカンダリ サブネット CIDR 範囲を確認するには、次のコマンドまたは Google Cloud Platform Console を使用します。

    gcloud compute networks subnets describe overlapping-subnet --region us-west1
    
    ...
    ipCidrRange: 10.128.8.0/24
    ...
    secondaryIpRanges:
    - ipCidrRange: 10.138.8.0/24
      rangeName: conflicting-range
    
  • Multiple network interfaces are not supported on legacy networks.

    このメッセージが表示された場合、レガシー ネットワーク内にインスタンスを作成しようとしています。レガシー ネットワークでは、複数インターフェースのインスタンスはサポートされていません。ネットワークがレガシー ネットワークかどうかは、次のコマンドまたは Google Cloud Platform Console を使用して確認できます。Mode フィールドがネットワークのタイプを表しています。

    gcloud compute networks list
    NAME             MODE    IPV4_RANGE     GATEWAY_IPV4
    default          auto
    legacy-network   legacy  10.240.0.0/16  10.240.0.1
    test-network     custom
    

  • Required 'compute.instances.create' permission for 'projects/[PROJECT_ID]/zones/[ZONE]/instances/test-inst'

    このメッセージが表示された場合、ログインしているアカウントに、インスタンスの作成に必要な IAM 権限がありません。インスタンスの作成に必要な役割の詳細については、IAM 権限をご覧ください。OWNEREDITORcompute.instanceAdmin.v1 のいずれかの役割が、プロジェクトに関連付けられている IAM ポリシーによって付与されているかどうかを確認できます。共有 VPC でインスタンスを作成するには、さらに compute.networkUser の役割が必要です。以下の例では、インスタンスを作成するために必要な IAM 権限がアカウント email2@gmail.com に付与されていません。手順については、IAM ガイドのリソースへのアクセス権の付与、変更、取り消しをご覧ください。

    gcloud projects get-iam-policy PROJECT_ID
    bindings:
    - members:
      - user:email1@gmail.com
        role: roles/owner
    - members:
      - serviceAccount:our-project-123@appspot.gserviceaccount.com
      - serviceAccount:123456789012-compute@developer.gserviceaccount.com
        role: roles/editor
    - members:
      - user:email2@gmail.com
        role: roles/viewer
    etag: BwUjMhXbSPU=
    version: 1
    

    OWNEREDITORcompute.instanceAdmin.v1 のいずれかの役割を付与するよう、プロジェクトの所有者または編集者に依頼できます。インターフェースを共有 VPC に属するサブネットに関連付ける場合は、compute.networkUser の役割も必要です。

    gcloud projects set-iam_policy --member user:email2@gmail.com --role roles/editor
    

セカンダリ インターフェースの内部 IP に接続できません

  • ファイアウォール ルールをチェックして、VM セカンダリ インターフェースへの接続が許可されていることを確認します。セカンダリ インターフェースに接続されているネットワークのファイアウォール ルールを確認するには、Google Cloud Platform Console にアクセスして該当する VPC ネットワークをクリックするか、次の gcloud コマンドを使用します。

    gcloud compute firewall-rules list --filter='network:[NETWORK_NAME]'
    
  • インターネット アドレスから、またはセカンダリ インターフェースのネットワークの外部から、セカンダリ インターフェースに接続しようとしていないか確認します。インターフェースの内部 IP に接続できるのは、ネットワーク内からに限られます。ネットワーク外からセカンダリ インターフェースにアクセスする必要がある場合は、セカンダリ インターフェースに外部 IP アドレスを割り当てます。

  • セカンダリ インターフェースの内部 IP に、セカンダリ インターフェースの接続先サブネットの外部から接続しようとしているのか、それとも同じネットワークの別のサブネットから、またはピアリングされたネットワークから接続しようとしているのかを確認します。 VPC ピアリングと複数のインターフェースがある VM インスタンスとの間の相互作用については、1 つのインスタンスに複数のネットワーク インターフェースを設定するで説明しています。インターフェースのサブネットの外部からセカンダリ インターフェースに到達するには、VM にルートを構成する必要があります。VM 内のデフォルト ルートが DHCP でどのようにプログラムされるかの詳細については、複数のネットワーク インターフェースがある場合の DHCP の動作をご覧ください。

外部 IP を使用してセカンダリ インターフェースに接続できません

DHCP サーバーは、VM のプライマリ ネットワーク インターフェース上でのみ、既定のルートをプログラムします。外部 IP を使用してセカンダリ インターフェースに接続する場合は、2 つのオプションがあります。ネットワーク外への接続がセカンダリ ネットワーク インターフェースでのみ必要な場合は、そのネットワーク インターフェース上に既定のルートを設定することができます。それ以外の場合は、ポリシー ルーティングの設定を使用して、VM 内のソースベースのポリシー ルーティングを使用することにより別個のルーティング テーブルを設定することができます。

/32 ではないネットマスクを使用する場合に接続の問題が発生します

デフォルトでは、インスタンスのメタデータ サーバーはデフォルト ゲートウェイの ARP 要求にのみ応答します。

/32 以外のネットマスクを使用してインターフェースを構成するには、フラグ --guest-os-features MULTI_IP_SUBNET を使用してイメージを作成し、それを使用してインスタンスを作成する必要があります。たとえば、debian-9 ベースのイメージを使用している場合、次のコマンドを使用してイメージを作成できます。

gcloud compute images create debian-9-multi-ip-subnet \
     --source-disk debian-9-disk \
     --source-disk-zone us-west1-a \
     --guest-os-features MULTI_IP_SUBNET

イメージに構成されているゲスト機能を表示するには、ゲストイメージで gcloud compute images describe コマンドを実行します。

gcloud compute images describe debian-9-multi-ip-subnet

カスタム イメージの作成の詳細については、カスタム イメージの作成、削除、使用中止をご覧ください。

シリアル コンソールを使用したトラブルシューティング

設定に関する問題をデバッグする場合は、VM 上でシリアル コンソールを有効にすることをお勧めします。シリアル コンソールとのやり取りの手順に沿って、対話式デバッグ用にシリアル コンソールを有効にできます。

このページは役立ちましたか?評価をお願いいたします。