针对网络用例配置虚拟机

本页面介绍了 Compute Engine 虚拟机 (VM) 实例的特殊网络配置,示例如下:

  • 设置到虚拟机的外部 HTTP 连接
  • 将虚拟机配置为网络代理

设置到虚拟机的外部 HTTP 连接

默认防火墙规则不允许通过 HTTP 或 HTTPS 连接访问您的实例。但是,添加允许这些连接的规则相当简单。请注意,虚拟机必须具有外部(静态或临时)IP 地址,才能接收来自其所在的 Virtual Private Cloud (VPC) 网络外部的流量。

您可使用 gcloud 命令行工具或 Google Cloud Console 添加防火墙规则,以允许 HTTP 或 HTTPS 连接。您也可以通过 API 添加防火墙规则。

Console

您可以使用 Cloud Console 为 VPC 网络上的所有实例创建整体防火墙规则,也可以在创建该实例时选择相应的选项,从而允许个别实例使用 HTTP 和 HTTPS 连接。我们要首先介绍后面这种选项,因为它提供了对个别实例的更多控制。

  1. 在 Cloud Console 中,转到虚拟机实例页面。

    转到“虚拟机实例”

  2. 点击创建实例
  3. 防火墙部分中,选择 允许 HTTP 流量允许 HTTPS 流量
  4. 点击创建以创建实例。

选择这些复选框后,VPC 网络会自动创建一条 default-httpdefault-https 规则,此规则将应用于使用 http-serverhttps-server 标记的所有实例。您的新实例也会根据您选择的复选框,使用适当的标记。

如果您已有 default-httpdefault-https 防火墙规则,则可以通过在实例的详情页面上启用允许 HTTP允许 HTTPS 选项,将相应防火墙规则应用于现有实例。

  1. 转到“虚拟机实例”页面
  2. 点击所需实例的名称。
  3. 点击页面顶部的编辑按钮。
  4. 向下滚动到防火墙部分。
  5. 选中所需 VPC 网络下的允许 HTTP允许 HTTPS 选项。
  6. 点击保存

通过类似的方式,您也可以取消选中一个或两个复选框,停用一个虚拟机的外部 HTTP 或 HTTPS 访问。

通过允许为 HTTP 和 HTTPS 流量标记特定实例,而非创建一条适用于所有实例的整体防火墙规则,Google Cloud 限制了允许外部流量传输到一个项目内所有虚拟机的安全隐患。但是,如果您想创建一条防火墙规则,允许传送到所有虚拟机实例的 HTTP 或 HTTPS 流量,则可以创建自己的防火墙规则:

  1. 转到“VPC 网络”页面
  2. 选择要应用该防火墙规则的 VPC 网络。
  3. 防火墙规则部分下,点击添加防火墙规则
  4. 为您的防火墙规则命名,并在协议和端口 (Protocols & Ports) 框中添加 tcp:80tcp:443 以允许 HTTPS 流量。
  5. 点击创建
gcloud 命令行工具

如果您希望允许传送到一个项目中所有虚拟机的 HTTP 和 HTTPS 流量,以下命令会创建一个防火墙,允许来自任意位置的传入 HTTP 和 HTTPS 请求传送到连接到此 VPC 网络的任意实例。

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 网络中的其他所有实例均使用该实例作为连接到外部环境的代理服务器。如果您需要控制进出 VPC 网络的访问权限,或者需要降低使用多个外部 IP 地址的费用,那么这种做法会非常有用。

这个具体示例讨论了如何在使用 Debian 映像的虚拟机实例上设置网络代理。它使用网关实例作为 Squid 代理服务器,但这仅仅是设置代理服务器的方法之一。

如需设置 Squid 代理服务器,请执行以下操作:

  1. 使用外部(静态或临时)IP 地址设置一个实例。 在本示例中,将您的实例命名为 gateway-instance
  2. 通过指定 gcloud compute instances create ... --no-address,设置一个或多个无外部 IP 地址的实例。在本示例中,将此实例命名为 hidden-instance
  3. 了解如何从一个实例连接到另一个实例,因为您无法直接连接到仅在内部使用的实例。
  4. 添加防火墙以允许端口 3128 上的 TCP 流量:

    gcloud compute firewall-rules create [FIREWALL_RULE] --network [NETWORK] --allow tcp:3128
    
  5. gateway-instance 上安装 Squid,并将其配置为允许通过 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. 配置 hidden-instance 以将 gateway-instance 用作其代理。使用 ssh 连接到 hidden-instance,并将其代理网址地址定义为指向端口 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-instance 运行 apt-get。 它现在应该会将网关用作代理。如果网关未用作代理,apt-get 就无法正常工作,因为 hidden-instance 未直接连接到互联网。

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

将虚拟机配置为 VPN 网关

此内容已弃用并移除。如需了解代管式 VPN 解决方案,请参阅 Cloud VPN 文档。

将虚拟机配置为 NAT 网关

此内容已弃用并移除。如需了解代管式 NAT 解决方案,请参阅 Cloud NAT 文档。

构建高可用性和高带宽 NAT 网关

此内容已弃用并移除。如需了解代管式 NAT 解决方案,请参阅 Cloud NAT 文档。

后续步骤