Private Service Connect インターフェース

1. はじめに

Private Service Connect インターフェースは、プロデューサーの Virtual Private Cloud(VPC)ネットワークがコンシューマーの VPC ネットワーク内のさまざまな宛先への接続を開始できるようにするためのリソースです。プロデューサー ネットワークとコンシューマ ネットワークは、異なるプロジェクトや組織に属していてもかまいません。

ネットワーク アタッチメントが Private Service Connect インターフェースからの接続を受け入れると、Google Cloud はネットワーク アタッチメントで指定されたコンシューマ サブネットの IP アドレスをインターフェースに割り振ります。コンシューマ ネットワークとプロデューサー ネットワークが接続され、内部 IP アドレスを使用して通信が可能になります。

ネットワーク アタッチメントと Private Service Connect インターフェース間の接続は、Private Service Connect エンドポイントとサービス アタッチメント間の接続に似ていますが、重要な違いが 2 つあります。

  • ネットワーク アタッチメントは、プロデューサー ネットワークからコンシューマー ネットワークへの接続(マネージド サービスの下り、外向き)を開始できるようにします。エンドポイントは、コンシューマー ネットワークからプロデューサー ネットワークへの接続(マネージド サービスの上り、内向き)を開始できるようにします。
  • Private Service Connect インターフェースの接続は推移的です。これは、プロデューサー ネットワークは、コンシューマ ネットワークに接続されている他のネットワークと通信できることを意味します。

作成するアプリの概要

このチュートリアルでは、Cloud ファイアウォール ルールを利用してプロデューサーからコンシューマのコンピューティングへの接続を許可または拒否する、包括的な Private Service Connect(PSC)インターフェース アーキテクチャを構築します(図 1 を参照)。

図 1

d39bf35e55bdf9e6.png

コンシューマ VPC に psc-network-アタッチメントを 1 つ作成すると、次のようなユースケースになります。

  1. クマからライオンへのアクセスを許可する Cloud ファイアウォール ルールを作成する
  2. クマからトラへのアクセスを拒否する Cloud ファイアウォール ルールを作成する
  3. cosmo から Bear へのアクセスを許可する Cloud ファイアウォール ルールを作成する

学習内容

  • ネットワーク アタッチメントの作成方法
  • プロデューサーがネットワーク アタッチメントを使用して PSC インターフェースを作成する方法
  • プロデューサーからコンシューマへの通信を確立する方法
  • プロデューサー VM(bear)からコンシューマ VM(lion)へのアクセスを許可する方法
  • プロデューサー VM(bear)からコンシューマ VM(tiger)へのアクセスをブロックする方法
  • コンシューマー VM(cosmo)からプロデューサー VM(bear)へのアクセスを許可する方法

必要なもの

2. 始める前に

プロジェクトを更新してチュートリアルをサポートする

このチュートリアルでは、Cloud Shell で gcloud 構成を実装するために $variables を使用します。

Cloud Shell で、次のコマンドを実行します。

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

3. ユーザー設定

コンシューマ VPC を作成する

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

コンシューマ サブネットを作成する

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks subnets create lion-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks subnets create tiger-subnet-1 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks subnets create cosmo-subnet-1 --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1

Private Service Connect ネットワーク アタッチメントのサブネットを作成する

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

Cloud Router と NAT の構成

VM インスタンスにパブリック IP アドレスがないため、ソフトウェア パッケージのインストールのチュートリアルでは Cloud NAT を使用しています。Cloud NAT を使用すると、プライベート IP アドレスを持つ VM がインターネットにアクセスできるようになります。

Cloud Shell で Cloud Router を作成します。

gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1

Cloud Shell 内で、NAT ゲートウェイを作成します。

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

4. IAP を有効にする

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセスできるようにするすべての VM インスタンスに適用します。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可する。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。

Cloud Shell 内で、IAP ファイアウォール ルールを作成します。

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

5. コンシューマ VM インスタンスを作成する

Cloud Shell で、コンシューマ VM インスタンス「lion」を作成します。

gcloud compute instances create lion \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=lion-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the lion app server !!' | tee /var/www/html/index.html
      EOF"

Cloud Shell 内で、コンシューマ VM インスタンス「tiger」を作成します。

gcloud compute instances create tiger \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=tiger-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the tiger app server !!' | tee /var/www/html/index.html
      EOF"

Cloud Shell で、コンシューマ VM インスタンス cosmo を作成します。

gcloud compute instances create cosmo \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=cosmo-subnet-1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to the cosmo app server !!' | tee /var/www/html/index.html
      EOF"

インスタンスの IP アドレスを取得して保存します。

Cloud Shell 内で、lion と tiger の VM インスタンスに対する説明を実行します。

gcloud compute instances describe lion --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe tiger --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe cosmo --zone=us-central1-a | grep  networkIP:

6. Private Service Connect ネットワーク アタッチメント

ネットワーク アタッチメントは、Private Service Connect インターフェースのコンシューマー側を表すリージョン リソースです。単一のサブネットをネットワーク アタッチメントに関連付けると、プロデューサーはそのサブネットから Private Service Connect インターフェースに IP を割り当てます。サブネットは、ネットワーク アタッチメントと同じリージョンに存在する必要があります。ネットワーク アタッチメントは、プロデューサー サービスと同じリージョンに存在する必要があります。

ネットワーク アタッチメントを作成する

Cloud Shell 内で、ネットワーク アタッチメントを作成します。

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_MANUAL \
    --producer-accept-list=$projectid \
    --subnets=intf-subnet

ネットワーク アタッチメントを一覧表示する

Cloud Shell 内で、ネットワーク アタッチメントを一覧表示します。

gcloud compute network-attachments list

ネットワーク アタッチメントについて説明する

Cloud Shell 内で、ネットワーク アタッチメントの説明を取得します。

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

プロデューサーが Private Service Connect インターフェースを作成するときに使用する psc-network-attachment URI をメモしておきます。たとえば次のようになります。

user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1 
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2023-06-06T20:57:12.623-07:00'
fingerprint: 4Yq6xAfaRO0=
id: '3235195049527328503'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc
producerAcceptLists:
- $projectid
region: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/subnetworks/intf-subnet

7. プロデューサーの設定

プロデューサー VPC ネットワークを作成する

Cloud Shell で、次のコマンドを実行します。

gcloud compute networks create producer-vpc --project=$projectid --subnet-mode=custom

プロデューサー サブネットを作成する

Cloud Shell で、psc インターフェースの vNIC0 に使用するサブネットを作成します。

gcloud compute networks subnets create prod-subnet --project=$projectid --range=10.20.1.0/28 --network=producer-vpc --region=us-central1

8. IAP を有効にする

IAP に VM インスタンスへの接続を許可するには、次のファイアウォール ルールを作成します。

  • IAP を使用してアクセスできるようにするすべての VM インスタンスに適用します。
  • IP 範囲 35.235.240.0/20 からの上り(内向き)トラフィックを許可する。この範囲には、IAP が TCP 転送に使用するすべての IP アドレスが含まれています。

Cloud Shell 内で、IAP ファイアウォール ルールを作成します。

gcloud compute firewall-rules create ssh-iap-producer \
    --network producer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

9. Private Service Connect インターフェースを作成する

Private Service Connect インターフェースは、プロデューサーの Virtual Private Cloud(VPC)ネットワークがコンシューマーの VPC ネットワーク内のさまざまな宛先への接続を開始できるようにするためのリソースです。プロデューサー ネットワークとコンシューマ ネットワークは、異なるプロジェクトや組織に属していてもかまいません。

ネットワーク アタッチメントが Private Service Connect インターフェースからの接続を受け入れると、Google Cloud はネットワーク アタッチメントで指定されたコンシューマ サブネットの IP アドレスをインターフェースに割り振ります。コンシューマ ネットワークとプロデューサー ネットワークが接続され、内部 IP アドレスを使用して通信が可能になります。

Cloud Shell 内で Private Service Connect インターフェース(bear)を作成し、ネットワーク アタッチメントの describe 出力から以前に特定した psc-network-attachment URI を挿入します。

gcloud compute instances create bear --zone us-central1-a --machine-type=f1-micro --can-ip-forward --network-interface subnet=prod-subnet,network=producer-vpc,no-address --network-interface network-attachment=https://www.googleapis.com/compute/v1/projects/$projectid/regions/us-central1/networkAttachments/psc-network-attachment

マルチ NIC 検証

PSC インターフェースが適切な IP アドレスで構成されていることを確認します。vNIC0 はプロデューサーの prod-subnet(10.20.1.0/28)を使用し、vNIC1 はコンシューマの intf-subnet(192.168.10.0/28)を使用します。

gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:

例:

user$ gcloud compute instances describe bear --zone=us-central1-a | grep networkIP:
  networkIP: 10.20.1.2
  networkIP: 192.168.10.2

10. コンシューマのファイアウォール ルールを更新する

クマからライオンへのアクセスを許可する Cloud ファイアウォール ルールを作成する

Cloud Shell で、 attachment-subnet(intf-subnet)の IP アドレス範囲から lion-subnet-1 のアドレス範囲内の宛先への下り(外向き)を許可する、優先度の高いルールを作成します。

gcloud compute firewall-rules create allow-limited-egress-to-lion \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=EGRESS \
    --priority=1000 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="192.168.20.0/28" \
    --enable-logging

Cloud Shell で、psc-network-attachment サブネットからのトラフィックについて暗黙の上り(内向き)拒否ルールをオーバーライドする上り(内向き)許可ルールを作成します。

gcloud compute firewall-rules create allow-ingress \
--network=consumer-vpc \
--action=ALLOW \
--rules=ALL \
--direction=INGRESS \
--priority=1000 \
--source-ranges="192.168.10.0/28" \
--enable-logging

クマからすべての範囲(トラを含む)へのアクセスを拒否する Cloud ファイアウォール ルールを作成する

Cloud Shell で、ネットワーク アタッチメントのサブネット(intf-subnet)の IP アドレス範囲からの下り(外向き)トラフィックをすべて拒否する優先度の低いルールを作成します。

gcloud compute firewall-rules create deny-all-egress \
    --network=consumer-vpc \
    --action=DENY \
    --rules=ALL \
    --direction=EGRESS \
    --priority=65534 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="0.0.0.0/0" \
    --enable-logging

cosmo から bear へのアクセスを許可する Cloud ファイアウォール ルールを作成する

Cloud Shell で、psc-network-attachment サブネットからのトラフィックについて暗黙の上り(内向き)拒否ルールをオーバーライドする上り(内向き)許可ルールを作成します。

gcloud compute firewall-rules create vm-subnet-allow-ingress \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="192.168.40.0/28" \
    --destination-ranges="192.168.10.0/28" \
    --enable-logging

11. PSC インターフェース用の Linux ルートを作成する

PSC インターフェース インスタンスから Linux ルートを構成して、プロデューサーがコンシューマ サブネットと通信できるようにする。

Private Service Connect インターフェースのゲスト OS 名を確認する

ルーティングを構成するには、Private Service Connect インターフェースのゲスト OS 名が必要です。これは、Google Cloud のインターフェース名とは異なります。

Cloud Shell で新しいタブを開いて、次の操作を行います。

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Cloud Shell で IAP を使用して psc-interface vm(bear)にログインします。

gcloud compute ssh bear --project=$projectid --zone=us-central1-a --tunnel-through-iap

Cloud Shell で、psc-interface インスタンスの IP アドレスを取得します。

ip a

例:

user@bear:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:0a:14:01:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.20.1.2/32 brd 10.20.1.2 scope global dynamic ens4
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:aff:fe14:102/64 scope link 
       valid_lft forever preferred_lft forever
3: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1460 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 42:01:c0:a8:0a:02 brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    inet 192.168.10.2/32 brd 192.168.10.2 scope global dynamic ens5
       valid_lft 85991sec preferred_lft 85991sec
    inet6 fe80::4001:c0ff:fea8:a02/64 scope link 
       valid_lft forever preferred_lft forever

PSC インターフェースのゲートウェイ IP を確認する

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

ルーティングを構成するには、Private Service Connect インターフェースのデフォルト ゲートウェイの IP アドレスが必要です

Cloud Shell では、PSC インターフェースが vNIC1 に関連付けられているため、1 を使用します。

curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo

この例では、デフォルトの gw 192.168.10.1 が生成されます。

user@bear:~$ curl http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/1/gateway -H "Metadata-Flavor: Google" && echo
192.168.10.1

コンシューマ サブネットのルートを追加する

Private Service Connect インターフェースに接続するコンシューマ サブネットごとに、Private Service Connect インターフェースのデフォルト ゲートウェイへのルートを追加する必要があります。これにより、コンシューマ ネットワークに送信されるトラフィックが、Private Service Connect インターフェースから送信されます。

Bear インスタンスで、コンシューマ サブネットへのルートを追加します。

sudo ip route add 192.168.20.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.30.0/28 via 192.168.10.1 dev ens5
sudo ip route add 192.168.40.0/28 via 192.168.10.1 dev ens5

ルートテーブルを検証する

Cloud Shell で、新しく追加されたルートを検証します。

ip route show

例:

user@bear:~$ ip route show
default via 10.20.1.1 dev ens4 
10.20.1.0/28 via 10.20.1.1 dev ens4 
10.20.1.1 dev ens4 scope link 
192.168.10.0/28 via 192.168.10.1 dev ens5 
192.168.10.1 dev ens5 scope link 
192.168.20.0/28 via 192.168.10.1 dev ens5 
192.168.30.0/28 via 192.168.10.1 dev ens5 
192.168.40.0/28 via 192.168.10.1 dev ens5 

12. ベアとライオンの接続が成功したかどうかを検証する

curl を実行して、プロデューサー VM インスタンスである bear がコンシューマ インスタンスである lion と通信できることを確認します。

クマのインスタンスから、チュートリアルの前半で特定したライオンの IP アドレスに対して、クマのインスタンスから curl を実行します。

curl -v <lions IP Address>

例:

user@bear:~$ curl -v 192.168.20.2
*   Trying 192.168.20.2:80...
* Connected to 192.168.20.2 (192.168.20.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 192.168.20.2
> User-Agent: curl/7.74.0
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Tue, 06 Jun 2023 03:53:08 GMT
< Server: Apache/2.4.56 (Debian)
< Last-Modified: Mon, 05 Jun 2023 19:41:26 GMT
< ETag: "1e-5fd6716a1e11b"
< Accept-Ranges: bytes
< Content-Length: 30
< Content-Type: text/html
< 
Welcome to lion app server !!
* Connection #0 to host 192.168.20.2 left intact

13. クマとトラとの接続がブロックされていることを確認する

下り(外向き)ファイアウォール ルールがクマからトラへのアクセスをブロックしていることを、ファイアウォール ログで確認しましょう。

新しい Cloud コンソール セッションで、[ロギング] → [ログ エクスプローラ] → [クエリを表示] を選択します。

2ae597e6d970cddf.png

以下のクエリ文字列を検索フィールドに貼り付け、[stream] を選択します。

jsonPayload.rule_details.reference=&quot;network:consumer-vpc/firewall:deny-all-egress&quot;

30d7bfae315f2ee3.png

クマのインスタンスから、チュートリアルの前半で特定したトラの IP アドレスに対して、クマのインスタンスから curl を実行します。curl はやがてタイムアウトします。

curl -v <tiger's IP Address>

例:

user@bear:~$ curl -v 192.168.30.2 
*   Trying 192.168.30.2:80...
* connect to 192.168.30.2 port 80 failed: Connection timed out
* Failed to connect to 192.168.30.2 port 80: Connection timed out
* Closing connection 0
curl: (28) Failed to connect to 192.168.30.2 port 80: Connection timed out

ログ エクスプローラで拒否されたファイアウォール ログがキャプチャされていることを確認します。ログエントリを選択し、ネストされたフィールドを開いてメタデータを表示します。

5c42a6587300be55.png

14. cosmo と Bear の接続が成功したことを検証する

新しい Cloud Shell タブを開き、プロジェクトの設定を更新します。

Cloud Shell で、次のコマンドを実行します。

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

Cloud Shell で IAP を使用して cosmo インスタンスにログインします。

gcloud compute ssh cosmo --project=$projectid --zone=us-central1-a --tunnel-through-iap

Cloud Shell で、チュートリアルの前半で確認した bear の IP vNIV1 の IP アドレスに対して ping を実行します。

ping <bears vNIC1 IP Address>

例:

user@cosmo:~$ ping 192.168.10.2 -c 5
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.277 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=0.288 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=0.265 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=0.264 ms
64 bytes from 192.168.10.2: icmp_seq=5 ttl=64 time=0.366 ms

15. クリーンアップ

Cloud Shell からチュートリアル コンポーネントを削除します。

gcloud compute instances delete bear --zone=us-central1-a --quiet

gcloud compute instances delete lion --zone=us-central1-a --quiet

gcloud compute instances delete tiger --zone=us-central1-a --quiet

gcloud compute instances delete cosmo --zone=us-central1-a --quiet

gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet

gcloud compute firewall-rules delete allow-ingress allow-limited-egress-to-lion deny-all-egress ssh-iap-consumer ssh-iap-producer vm-subnet-allow-ingress --quiet

gcloud compute networks subnets delete cosmo-subnet-1 intf-subnet lion-subnet-1 prod-subnet tiger-subnet-1 --region=us-central1 --quiet

gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet 

gcloud compute networks delete consumer-vpc --quiet

gcloud compute networks delete producer-vpc --quiet

16. 完了

これで、ファイアウォール ルールを実装することで、Private Service Connect インターフェースとコンシューマとプロデューサーの接続が正常に構成され、検証されました。

コンシューマー インフラストラクチャを作成し、ネットワーク アタッチメントを追加して、プロデューサーがマルチ NIC VM を作成できるようにすることで、コンシューマーとプロデューサーの通信をブリッジしました。ここでは、コンシューマ VPC ネットワークとプロデューサー VPC のインスタンスへの接続を許可するファイアウォール ルールをコンシューマ VPC ネットワークに作成する方法を学習しました。

コスモパップはチュートリアルを素晴らしいと思っています!!

e6d3675ca7c6911f.jpeg

次のステップ

チュートリアルをご覧ください...

参考資料と動画

リファレンス ドキュメント