VM インスタンスの特別な構成

このページでは、次のような Compute Engine 仮想マシン(VM)インスタンスの特別なネットワーク構成について説明します。

  • インスタンスに対する外部 HTTP 接続の設定
  • ネットワーク プロキシとしてのインスタンスの構成
  • VPN ゲートウェイとしてのインスタンスの構成
  • NAT ゲートウェイとしてのインスタンスの構成
  • 高可用性かつ高帯域幅の NAT ゲートウェイの構築

インスタンスに対する外部 HTTP 接続の設定

デフォルトのファイアウォール ルールでは、インスタンスへの HTTP または HTTPS 接続は許可されていません。ただし、そのような接続を許可するルールは簡単に追加できます。VPC ネットワークの外部からトラフィックを受信するには、インスタンスに外部 IP アドレスが必要であることに注意してください。

gcloud コマンドライン ツールまたは Google Cloud Platform Console を使用して、HTTP または HTTPS 接続を許可するファイアウォール ルールを追加できます。また、API でもファイアウォール ルールを追加できます。

Console

GCP Console を使用して VPC ネットワーク上のすべてのインスタンスに対する全体的なファイアウォール ルールを作成するか、個々のインスタンスの作成時に該当するオプションを選択して、そのインスタンスが HTTP および HTTPS 接続にアクセスできるようにすることができます。後者のオプションのほうが個別のインスタンスに対して細かく制御できるため、そちらを先に説明します。

  1. GCP Console の [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。
  3. [ファイアウォール] で、[HTTP トラフィックを許可する] と [HTTPS トラフィックを許可する] を選択します。
  4. [作成] をクリックしてインスタンスを作成します。

これらのチェックボックスを選択することで、http-server タグまたは https-server タグを持つすべてのインスタンスに適用される default-http ルールまたは default-https ルールが VPC ネットワークによって自動的に作成されます。新しいインスタンスには、チェックボックスの選択に応じて、適切なタグ付けが行われます。

default-http および default-https のファイアウォール ルールがすでにある場合は、インスタンスの詳細ページで [HTTP を許可] または [HTTPS を許可] オプションを有効にすることで、そのファイアウォール ルールを既存のインスタンスに適用できます。

  1. [VM インスタンス] ページに移動します。
  2. 目的のインスタンスの名前をクリックします。
  3. ページの上部にある [編集] ボタンをクリックします。
  4. [ファイアウォール] セクションまでスクロールします。
  5. 必要な VPC ネットワークで [HTTP トラフィックを許可する] または [HTTPS トラフィックを許可する] をオンにします。
  6. [保存] をクリックします。

同様に、いずれかまたは両方のチェックボックスをオフにすることで、インスタンスの外部 HTTP または HTTPS アクセスを無効にすることもできます。

すべてのインスタンスに適用される全体的なファイアウォール ルールを作成するのではなく、HTTP トラフィックと HTTPS トラフィックに対して特定のインスタンスがタグ付けされるようにすることで、プロジェクト内のすべての仮想マシンへの外部トラフィックが許可されるというセキュリティ上の問題が発生する可能性が GCP で低減されます。ただし、すべての仮想マシン インスタンスへの HTTP または HTTPS トラフィックを許可するファイアウォール ルールを作成する場合は、次の手順で独自のファイアウォール ルールを作成できます。

  1. [VPC ネットワーク] ページに移動します。
  2. ファイアウォール ルールを適用する VPC ネットワークに選択します。
  3. [ファイアウォール ルール] セクションで [ファイアウォール ルールを追加] をクリックします。
  4. ファイアウォール ルールに名前を付け、[プロトコルとポート] ボックスに tcp:80 を追加します。HTTPS トラフィックの場合は tcp:443 を追加します。
  5. [作成] をクリックします。
gcloud コマンドライン ツール

プロジェクトのすべての仮想マシンに対する HTTP トラフィックと HTTPS トラフィックを許可する場合には、次のコマンドを実行して、任意の場所からこの VPC ネットワークのインスタンスに送信される受信 HTTP / HTTPS リクエストを許可するファイアウォールを作成します。

gcloud compute firewall-rules create FIREWALL_RULE --allow tcp:80,tcp:443

**例**

gcloud compute firewall-rules create sample-http \
 --description "Incoming http and https allowed." \
 --allow tcp:80,tcp:443
gcloud compute firewall-rules describe sample-http
allowed:
- IPProtocol: tcp
  ports:
  - '80'
  - '443'
creationTimestamp: '2014-06-13T13:27:12.206-07:00'
id: '5057780722612413546'
kind: compute#firewall
name: sample-http
network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/samplehttp
sourceRanges:
- 0.0.0.0/0

ネットワーク プロキシとしてのインスタンスの構成

VPC ネットワークを設計するとき、VPC ネットワーク内の 1 つのインスタンスだけが外部にアクセスし、他のインスタンスはすべてそのインスタンスをプロキシ サーバーとして外部にアクセスするように構成できます。これは、VPC ネットワークに出入りするアクセスを制御したり、複数の外部 IP アドレスにかかる費用を抑えたりする場合に便利です。

この例では、Debian イメージを使用する VM インスタンスにネットワーク プロキシを設定する方法について説明します。ここでは、Squid プロキシ サーバーとしてゲートウェイ インスタンスを使用します。これはプロキシ サーバーを設定する唯一の方法です。

Squid プロキシ サーバーを設定するには:

  1. 外部(静的またはエフェメラル)IP アドレスを持つインスタンスを 1 つ設定します。この例では、インスタンスに gateway-instance という名前を付けます。
  2. gcloud compute instances create ... --no-address を指定して、外部 IP アドレスを持たない 1 つまたは複数のインスタンスを設定します。この例では、インスタンス hidden-instance を呼び出します。
  3. あるインスタンスから別のインスタンスに接続する方法を理解します。これは、内部専用のインスタンスには直接接続できないためです。
  4. 次のように、ポート 3128 での tcp トラフィックを許可するファイアウォールを追加します。

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. gateway-instanceSquid をインストールし、VPC ネットワーク(RFC 1918RFC 4193RFC 4291 の IP 空間)のマシンからのアクセスを許可するように構成します。これは、gateway-instancehidden-instance が両方とも同じ VPC ネットワークに接続し、相互接続できることを前提としています。

    user@gateway-instance:~$ sudo apt-get install squid3
    

    ローカル ネットワーク上の任意のマシンが Squid3 サーバーを使用できるようにします。次の sed コマンドによって、ローカルのネットワークとマシンの Squid 設定ファイルに記述されている acl localnet src エントリのコメントが解除されて有効化されます。

    user@gateway-instance:~$ sudo sed -i 's:#\(http_access allow localnet\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(http_access deny to_localhost\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 10.0.0.0/8.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 172.16.0.0/12.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src 192.168.0.0/16.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fc00\:\:/7.*\):\1:' /etc/squid/squid.conf
    
    user@gateway-instance:~$ sudo sed -i 's:#\(acl localnet src fe80\:\:/10.*\):\1:' /etc/squid/squid.conf
    
    # Prevent proxy access to metadata server
    user@gateway-instance:~$ sudo cat <<EOF >>/etc/squid/squid.conf
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid3 start
    
  6. gateway-instance をプロキシとして使用するように hidden-instance を構成します。ssh を使用して hidden-instance に接続し、次に示すように、プロキシ URL アドレスがポート 3128(Squid のデフォルトの構成)上の gateway-instance を指すように定義します。

    user@gateway-instance:~$ ssh hidden-instance
    
    user@hidden-instance:~$ sudo -s
    
    root@hidden-instance:~# echo "export http_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export https_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export ftp_proxy=\"http://gateway-instance.$(dnsdomainname):3128\"" >> /etc/profile.d/proxy.sh
    
    root@hidden-instance:~# echo "export no_proxy=169.254.169.254,metadata,metadata.google.internal" >> /etc/profile.d/proxy.sh
    

    このような環境変数を通すように sudoers を更新します。

    root@hidden-instance:~# cp /etc/sudoers /tmp/sudoers.new
    
    root@hidden-instance:~# chmod 640 /tmp/sudoers.new
    
    root@hidden-instance:~# echo "Defaults env_keep += \"ftp_proxy http_proxy https_proxy no_proxy"\" >>/tmp/sudoers.new
    
    root@hidden-instance:~# chmod 440 /tmp/sudoers.new
    
    root@hidden-instance:~# visudo -c -f /tmp/sudoers.new && cp /tmp/sudoers.new /etc/sudoers
    
  7. sudo を終了し、変数をロードして、hidden-instanceapt-get を実行します。この操作はゲートウェイをプロキシとして使用することで正常に動作します。ゲートウェイがプロキシとして機能していない場合、hidden-instance はインターネットに直接接続していないため、apt-get は動作しません。

    root@hidden-instance:~# exit
    
    user@hidden-instance:~$ source ~/.profile
    
    user@hidden-instance:~$ sudo apt-get update
    

VPN ゲートウェイとしてのインスタンスの構成

Strongswan VPN ソフトウェアを使用すると、インスタンスの 1 つに VPN ゲートウェイを設定できます。大半のユーザーには、Strongswan ではなく Cloud VPN の使用をおすすめします。Cloud VPN を使用すると、VPN ソフトウェアを実行するインスタンスを作成し、設定する必要がありません。Cloud VPN で必要な機能を実行できない場合に Strongswan を使用してください。

  1. オンプレミス ネットワークの接続先となる VPC ネットワークを作成します。

    gcloud compute networks create vpn-network --subnet-mode custom
    
  2. IP 範囲がオンプレミス サブネットと重複しないようにサブネットを作成します。

    gcloud compute networks subnets create vpn-subnet \
        --network vpn-network \
        --region us-central1 \
        --range 10.0.0.0/24 \
    
  3. vpn-subnet サブネット内にインスタンスを作成します。このインスタンスが VPN ゲートウェイになります。

    gcloud compute instances create vpn-gateway --can-ip-forward \
        --subnet vpn-subnet \
        --zone us-central1-a \
        --tags vpn-gateway
    
  4. VPN ゲートウェイの内部および外部 IP アドレスを調べて記録します。

    gcloud compute instances describe --zone us-central1-a vpn-gateway
    

    外部 IP アドレスは、natIP フィールドの値です。内部 IP アドレスは、10.0.0.2 など、networkIP フィールドの値です。

  5. VPN ゲートウェイを介してオンプレミス ネットワーク内のクライアントと通信するインスタンスを作成します。

    gcloud compute instances create test-vpn \
        --subnet vpn-subnet \
        --tags vpn \
        --zone us-central1-a
    
  6. オンプレミス ネットワークが宛先の場合に VPN ゲートウェイ経由でトラフィックをルーティングするルートを、vpn-network ネットワーク内に作成します。

    gcloud compute routes create vpnnetwork-to-gateway \
        --destination-range [ON_PREM_IP_RANGE] \
        --next-hop-address [VPN_GATEWAY_INTERNAL_IP] \
        --network vpn-network \
        --tags vpn
    

    [VPN_GATEWAY_INTERNAL_IP] の値は、VPN ゲートウェイの内部 IP アドレス(networkIP フィールドの値)です。

  7. 次のファイアウォール ルールを VPC ネットワークに追加して、受信トラフィックを受け入れます。

    gcloud compute firewall-rules create ssh --source-ranges 0.0.0.0/0 \
        --allow tcp:22 \
        --network vpn-network
    
    gcloud compute firewall-rules create  allow-internal \
        --source-ranges 10.0.0.0/24 \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --allow all
    
    gcloud compute firewall-rules create allow-ipsec-nat \
        --source-ranges [ON_PREM_VPN_GATEWAY_EXTERNAL_IP]/32 \
        --allow udp:4500,udp:500 \
        --network vpn-network \
        --target-tags vpn-gateway
    
    gcloud compute firewall-rules create from-onprem \
        --source-ranges [ON_PREM_NETWORK_ADDRESS_SPACE] \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --network vpn-network \
        --target-tags vpn
    

    オンプレミス ネットワーク内にファイアウォール ルールを作成して、VPC ネットワークからの着信トラフィックを受け入れます。

  8. VPN ゲートウェイ インスタンスに接続します。

  9. VPN ソフトウェア Strongswan をインストールして構成します。

    ホーム ディレクトリから、ipsec.conf という名前のファイルを作成します。その内容を次のように設定します。プレースホルダは、実際の環境における値に置換します。

    conn myconn
      authby=psk
      auto=start
      dpdaction=hold
      esp=aes128-sha1-modp2048!
      forceencaps=yes
      ike=aes128-sha1-modp2048!
      keyexchange=ikev2
      mobike=no
      type=tunnel
      left=%any
      leftid=[VPN_GATEWAY_EXTERNAL_IP_ADDRESS]
      leftsubnet=10.0.0.0/24
      leftauth=psk
      leftikeport=4500
      right=[ON_PREM_EXTERNAL_IP_ADDRESS]
      rightsubnet=[ON_PREM_ADDRESS_SPACE]
      rightauth=psk
      rightikeport=4500
    

    次に、以下のコマンドを実行します。[secret-key] の部分は秘密鍵(文字列値)に置き換えてください。

    $ sudo apt-get update
    
    $ sudo apt-get install strongswan -y
    
    $ echo "%any : PSK \"[secret-key]\"" | sudo tee /etc/ipsec.secrets > /dev/null
    
    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf
    
    $ sudo cp ipsec.conf /etc
    
    $ sudo ipsec restart
    

    VPN トンネルを正常に確立するには、オンプレミス VPN ゲートウェイも構成する必要があります。

    オンプレミス ゲートウェイ マシンで Debian ベースのオペレーティング システムが実行されている場合は、同じ手順を使用して Strongswan をインストールして設定できます。たとえば、ipsec.conf ファイルのコピーを作成し、左右の ID とサブネットを入れ替えます。

  10. test-vpn インスタンスからオンプレミス マシンに対し ping を実行して、VPN トンネルをテストします。

    gcloud compute ssh test-vpn --command 'ping -c 3 [ON_PREM_INTERNAL_ADDRESS]'
    

トラブルシューティング

上記の手順で VPN を設定しても問題が発生する場合は、次のヒントを参考に、設定のトラブルシューティングを行ってください。

  1. 接続の状態を確認します。

    $ sudo ipsec status
    

    myconn がリストにない場合は、接続を開始します。

    $ sudo ipsec up myconn
    
  2. 2 か所の VPN エンドポイントが通信できているかどうかを確認します。

    netcat を使用して VPN と同様のトラフィック(UDP、ポート 4500)を送信します。ローカルの VPN エンドポイントで次のコマンドを実行します。

    $ echo | nc -u [vpn-vm-gateway-external-address] 4500
    

    受信側で tcpdump を実行し、VM インスタンスがポート 4500 でパケットを受信できていることを確認します。

    $ tcpdump -nn -n host [public-ip-of-local-VPN-gateway-machine] -i any
    
  3. ipsec.conf ファイルに次の行を追加して、詳細ロギングを有効にします。

    config setup
      charondebug="ike 3, mgr 3, chd 3, net 3"
    
    conn myconn
      authby=psk
      auto=start
      ...
    

    次に、接続を再試行します。接続は引き続き失敗しますが、ログでエラーを確認できます。ログファイルは VM インスタンスの /var/log/charon.log にあります。

NAT ゲートウェイとしてのインスタンスの構成

ルート コレクションに変更を加えることで、さらに複雑なネットワーキング シナリオを作成できます。このセクションでは、内部専用の仮想マシン インスタンスからインターネットにトラフィックをルーティングできる内部アドレス変換(NAT)ゲートウェイ インスタンスを設定する方法について説明します。これにより、1 つの外部 IP アドレスを使用して複数の仮想マシン インスタンスからトラフィックを送信できるようになります。ただし、インターネットには単一の仮想マシンしか公開されません。

  1. まず、このシナリオの仮想マシン インスタンスをホストする VPC ネットワークを作成します。

    gcloud compute networks create custom-network1 \
        --subnet-mode custom
    
  2. us-central1 リージョンのサブネットを作成します。

    gcloud compute networks subnets create subnet-us-central \
        --network custom-network1 \
        --region us-central1 \
        --range 192.168.1.0/24
    
  3. 先ほど作成した新しいネットワークで ssh 接続を許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create custom-network1-allow-ssh \
        --allow tcp:22 \
        --network custom-network1
    
    gcloud compute firewall-rules create custom-network1-allow-internal \
        --allow tcp:1-65535,udp:1-65535,icmp \
        --source-ranges 192.168.1.0/24 \
        --network custom-network1
    
  4. custom-network1 で NAT ゲートウェイとして機能する仮想マシンを作成します。

    gcloud compute instances create nat-gateway --network custom-network1 \
        --subnet subnet-us-central \
        --can-ip-forward \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags nat
    
  5. 外部 IP アドレスを持たず、ゲートウェイ インスタンスを使用する任意の仮想マシン インスタンスに no-ipタグを付けるか、外部 IP アドレスのない新しい仮想マシンを作成して、そのインスタンスに no-ip タグを付けます。

    • 既存のインスタンスにタグを追加します。
    gcloud compute instances add-tags existing-instance --tags no-ip
    
    • または、外部 IP アドレスを持たない新しい仮想マシンを作成します。
    gcloud compute instances create example-instance --network custom-network1 \
        --subnet subnet-us-central \
        --no-address \
        --zone us-central1-a \
        --image-family debian-9 \
        --image-project debian-cloud \
        --tags no-ip
    
  6. ゲートウェイ インスタンス経由でインターネットを宛先としてトラフィックを送信するルートを作成します。

    gcloud compute routes create no-ip-internet-route \
        --network custom-network1 \
        --destination-range 0.0.0.0/0 \
        --next-hop-instance nat-gateway \
        --next-hop-instance-zone us-central1-a \
        --tags no-ip --priority 800
    

    他に競合するルートが存在する場合は、このルートが優先されるように優先度を設定します。デフォルトの優先度は 1000 なので、1000 よりも小さい値を指定します。

  7. 次に、ゲートウェイ インスタンスにログインし、内部トラフィックからインターネットへの NAT 処理を行う iptables を構成します。

    gcloud compute ssh nat-gateway --zone us-central1-a
    

    インスタンスで iptables を次のように構成します。

    $ sudo sysctl -w net.ipv4.ip_forward=1
    
    $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    最初の sudo コマンドでは、IP 転送を許可するカーネルを指定します。2 番目の sudo コマンドでは、内部インスタンスから受信したパケットを、NAT ゲートウェイ インスタンスから送信されたパケットであるかのようにマスカレードします。

    iptables の NAT ルールを調べるため、list オプションを使います。

    $ sudo iptables -v -L -t nat
    

    出力が次の例のようになっていることを確認します。

    Chain PREROUTING (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain INPUT (policy ACCEPT 5 packets, 3924 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain OUTPUT (policy ACCEPT 64 packets, 4164 bytes)
     pkts bytes target     prot opt in     out     source               destination
    
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
    64  4164 MASQUERADE  all  --  any    eth0    anywhere             anywhere"
    
  8. (省略可)これらの設定を今後の再起動時にも保持する場合は、次のようにします。

    $ sudo echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
    
    $ sudo apt-get install iptables-persistent
    

高可用性かつ高帯域幅の NAT ゲートウェイの構築

このセクションでは、復元力に優れた高帯域幅のデプロイ環境にするために、等価コスト マルチパス(ECMP)ルーティングと自動修復を有効にした複数の NAT ゲートウェイをセットアップする方法について説明します。

GCP では、仮想マシンに RFC 1918 のプライベート IP アドレスを使用します。これらの VM がパブリック インターネット上のリソースにアクセスする必要がある場合は、NAT が必要になります。シンプルなシナリオには、単一 NAT ゲートウェイ アーキテクチャで十分に対応できます。ただし、スループットや可用性を高めるためには、それよりも復元力に優れたアーキテクチャが必要になります。

ゲートウェイの構成

複数のルートの優先度が同じ場合、GCP は ECMP ルーティングを使用してトラフィックを分散します。この場合、ECMP からトラフィックの一部を受信する複数の NAT ゲートウェイを作成します。これらの NAT ゲートウェイは、パブリック IP アドレスを使用して外部ホストにトラフィックを転送します。

以下の図に、この構成を示します。

複数ゲートウェイ構成

復元力を強化するために、各ゲートウェイをそれぞれ別個のマネージド インスタンス グループ(サイズ 1)に配置します。また、障害発生時にはゲートウェイが自動的に再起動するよう、単純なヘルスチェックを付加します。ゲートウェイはそれぞれ別個のインスタンス グループに配置されます。したがって、ゲートウェイにはインスタンス テンプレートに関連付けられた静的な外部 IP が割り当てられます。この例では 3 つの n1-standard-2 NAT ゲートウェイをプロビジョニングしますが、必要に応じてゲートウェイの数やサイズを変えることもできます。たとえば、n1-standard-2 インスタンスはネットワーク トラフィックが 4 Gbps に制限されています。大量のトラフィックを処理する必要がある場合、n1-standard-8 を選択します。

  1. VPC ネットワークを作成します(必要な場合)。これらのゲートウェイを既存の VPC に追加しない場合、VPC ネットワークとサブネットを作成します。既存の VPC に追加する場合は、この手順をスキップして 2 番目のステップに移り、環境に応じてリージョンを変更します。

    1. Cloud Shell を使用して、GCP プロジェクトに関連付けられるカスタム VPC を作成します。この VPC では、デフォルト以外の IP アドレス指定を使用できますが、デフォルトのファイアウォール ルールは含まれていません。

      gcloud compute networks create example-vpc --subnet-mode custom
      
    2. この VPC 内にサブネットを作成し、リージョンと IP 範囲を指定します。このチュートリアルでは、10.0.1.0/24us-east1 リージョンを使用します。

      gcloud compute networks subnets create example-east \
          --network example-vpc --range 10.0.1.0/24 --region us-east1
      
  2. 3 つの静的 IP アドレスを予約して保存します。

    1. us-east1 リージョン内の nat-1 というアドレスを予約して保存します。

      gcloud compute addresses create nat-1 --region us-east1
      
      nat_1_ip=$(gcloud compute addresses describe nat-1 \
          --region us-east1 --format='value(address)')
      
    2. us-east1 内の nat-2 というアドレスを予約して保存します。

      gcloud compute addresses create nat-2 --region us-east1
      
      nat_2_ip=$(gcloud compute addresses describe nat-2 \
          --region us-east1 --format='value(address)')
      
    3. us-east1 内の nat-3 というアドレスを予約して保存します。

      gcloud compute addresses create nat-3 --region us-east1
      nat_3_ip=$(gcloud compute addresses describe nat-3 \
          --region us-east1 --format='value(address)')
      
  3. 3 つのインスタンス テンプレートを作成して、予約済み IP を割り当てます。

    1. 起動設定をコピーします。

      gsutil cp gs://nat-gw-template/startup.sh .
      

      起動スクリプトにアクセスできない場合は、[起動スクリプト] セクションからコピーします。

    2. nat-1 インスタンス テンプレートを作成します。

      gcloud compute instance-templates create nat-1 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
      
    3. nat-2 インスタンス テンプレートを作成します。

      gcloud compute instance-templates create nat-2 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
      
    4. nat-3 インスタンス テンプレートを作成します。

      gcloud compute instance-templates create nat-3 \
          --machine-type n1-standard-2 --can-ip-forward --tags natgw \
          --metadata-from-file=startup-script=startup.sh --address $nat_3_ip
      

      n1-standard-2 マシンタイプには 2 個の vCPU があり、最大 4 Gbps のネットワーク帯域幅を使用できます。より多くの帯域幅が必要な場合は、別のホストを選択できます。帯域幅は vCPU あたり 2 Gbps でスケーリングされます。つまり、8 vCPU ホストでは最大 16 Gbps にスケーリングされます。

  4. 応答性をモニタリングするためのヘルスチェックを作成します。

    gcloud compute health-checks create http nat-health-check --check-interval 30 \
        --healthy-threshold 1 --unhealthy-threshold 5 --request-path /health-check
    
    gcloud compute firewall-rules create "natfirewall" \
        --allow tcp:80 --target-tags natgw \
        --source-ranges "130.211.0.0/22","35.191.0.0/16"
    

    システムで障害が発生して HTTP トラフィックに応答できなくなると、システムが再起動されます。この場合、プロジェクトが必要になるため、既存のプロジェクトを使用するか新しいプロジェクトを作成できます。

  5. 各 NAT ゲートウェイのインスタンス グループを作成します。

    gcloud compute instance-groups managed create nat-1 --size=1 --template=nat-1 --zone=us-east1-b
    gcloud compute instance-groups managed create nat-2 --size=1 --template=nat-2 --zone=us-east1-c
    gcloud compute instance-groups managed create nat-3 --size=1 --template=nat-3 --zone=us-east1-d
    
  6. 応答しない NAT ゲートウェイを再起動するための自動修復を設定します。

    gcloud beta compute instance-groups managed set-autohealing nat-1 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-b
    nat_1_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-1/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-2 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-c
    nat_2_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-2/ { print $1 }')
    gcloud beta compute instance-groups managed set-autohealing nat-3 \
        --health-check nat-health-check --initial-delay 120 --zone us-east1-d
    nat_3_instance=$(gcloud compute instances list |awk '$1 ~ /^nat-3/ { print $1 }')
    
  7. インスタンスへのデフォルト ルートを追加します。

    gcloud compute routes create natroute1 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-b \
        --next-hop-instance $nat_1_instance
    gcloud compute routes create natroute2 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-c \
        --next-hop-instance $nat_2_instance
    gcloud compute routes create natroute3 --destination-range 0.0.0.0/0 \
        --tags no-ip --priority 800 --next-hop-instance-zone us-east1-d \
        --next-hop-instance $nat_3_instance
    
  8. NAT を使用するインスタンスにタグを付けます。

    gcloud compute instances add-tags natted-servers --tags no-ip
    
  9. NAT 機能をテストします。ゲートウェイが構成され、ゲスト VM にタグが付けられた状態で、次の例のように外部ホストに対し ping を実行します。その際、VM には外部 IP を割り当てません。

    ping 8.8.8.8

    出力例:

    PING 8.8.8.8 (8.8.8.8): 56 data bytes
    64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=0.618 ms
    64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=0.325 ms
    64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=0.443 ms
    64 bytes from 8.8.8.8: icmp_seq=3 ttl=52 time=0.314 ms
    64 bytes from 8.8.8.8: icmp_seq=4 ttl=52 time=0.386 ms
    

考慮すべき問題

この構成では、us-east1 リージョンに、それぞれ 2 Gbps に対応する 3 つの NAT ゲートウェイを配置しています。ただし、ECMP 負荷分散は完璧ではなく、個々のフローは複数のリンクに分散されません。

  • デプロイの自動化には、この構成の Terraform モジュールも使用できます
  • この構成は、一時的または非ステートフルなアウトバウンド リンクに最適です。NAT ゲートウェイ プールのサイズが変更された場合、TCP 接続が再バランスされ、これにより確立済みの接続がリセットされる可能性があります。
  • ノードは自動的には更新されないため、Debian のデフォルト インストールで脅威が発生する場合、手動で更新する必要があります。
  • これらのインスタンスはすべて us-east1 リージョン内にあります。VM が他のゾーン内にある場合、ゲートウェイをそのゾーンに近づけることでパフォーマンスを改善できる可能性があります。
  • ゲートウェイあたりの帯域幅は、単方向でコアあたり最大 2 Gbps です。あるゲートウェイで障害が発生すると、トラフィックは残りのゲートウェイに分散されます。ただし、実行中のフローは再プログラムされないため、ゲートウェイがオンライン状態に戻ってもトラフィックはすぐには再安定しません。したがって、サイジングの際は必ず十分なオーバーヘッドを確保してください。
  • 予期しない結果に対して通知を受け取るには、Stackdriver を使用してマネージド インスタンス グループとネットワーク トラフィックをモニタリングします。

起動スクリプト: startup.sh

ステップ 3a で参照されている起動スクリプト:

#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/20-natgw.conf
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

cat <<EOF > /usr/local/sbin/health-check-server.py
#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import subprocess

PORT_NUMBER = 80
PING_HOST = "www.google.com"

def connectivityCheck():
  try:
    subprocess.check_call(["ping", "-c", "1", PING_HOST])
    return True
  except subprocess.CalledProcessError as e:
    return False

#This class handles any incoming request
class myHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    if self.path == '/health-check':
      if connectivityCheck():
        self.send_response(200)
      else:
        self.send_response(503)
    else:
      self.send_response(404)

try:
  server = HTTPServer(("", PORT_NUMBER), myHandler)
  print "Started httpserver on port " , PORT_NUMBER
  #Wait forever for incoming http requests
  server.serve_forever()

except KeyboardInterrupt:
  print "^C received, shutting down the web server"
  server.socket.close()
EOF

nohup python /usr/local/sbin/health-check-server.py >/dev/null 2>&1 &

インスタンスベースの NAT ゲートウェイを Cloud NAT に移行する

インスタンスベースの NAT ゲートウェイを使用していて Cloud NAT に移行する場合、次の手順を実施します。

  1. インスタンスベースのゲートウェイと同じリージョンで Cloud NAT を構成します。
  2. インスタンスベースの NAT ゲートウェイにパケットを送信している静的ルートを削除します。ネットワークに、まだデフォルト ゲートウェイ ルートがあるはずです。
  3. トラフィックが Cloud NAT を通過し始めます。
  4. すべてが機能していることを確認したら、インスタンスベースの NAT ゲートウェイを削除します。

次のステップ

  • VPC ネットワークの詳細について、VPC の概要を参照する。
  • VPC ネットワークの作成と変更の手順を、VPC の使用で確認する。
このページは役立ちましたか?評価をお願いいたします。