ネットワーキング用に VM を構成したユースケース

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

  • VM に対する外部 HTTP 接続を設定する
  • VM をネットワーク プロキシとして構成する

VM に対する外部 HTTP 接続を設定する

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

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

Console

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

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

    [VM インスタンス] に移動

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

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

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

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

同様に、片方または両方のチェックボックスをオフにすることで、VM の外部 HTTP アクセスや HTTPS アクセスを無効にできます。

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

VM をネットワーク プロキシとして構成する

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 ネットワーク上の任意(有効なサブネット 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 tee -a /etc/squid/squid.conf <<'EOF'
    acl to_metadata dst 169.254.169.254
    http_access deny to_metadata
    EOF
    
    # Start Squid
    user@gateway:~$ sudo service squid 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
    

VM を VPN ゲートウェイとして構成する

このコンテンツは非推奨となり、削除されました。マネージド VPN ソリューションについては、Cloud VPN のドキュメントをご覧ください。

VM を NAT ゲートウェイとして構成する

このコンテンツは非推奨となり、削除されました。マネージド NAT ソリューションについては、Cloud NAT のドキュメントをご覧ください。

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

このコンテンツは非推奨となり、削除されました。マネージド NAT ソリューションについては、Cloud NAT のドキュメントをご覧ください。

次のステップ