允许 VM 实例上的 http 流量的 gcloud 命令是什么? (这不是创建防火墙规则!)

What is the gcloud command to allow http traffic on a VM instance? (It's not create firewall rule!)

首先,我希望使用纯粹的 gcloud 命令来实现我的 objective - 而不是 GCE 界面 - 所以请不要使用 GUI 提供答案!

我从附加到 VM 实例的磁盘创建了映像。为此,我必须根据创建图像的 Google 文档删除该实例。之后,我使用图像重新创建了我的实例。

除了 http 和 https 流量现在在实例中被禁用之外,几乎所有的事情似乎都从那个过程中完美地工作了!我无法再浏览到 VM 上托管的网站。我也无法通过 ping 域得到响应。

当我查看 GCE gui(只是查看 - 没有修改任何内容!)时,我可以看到 "Allow http traffic" 和 "Allow https traffic" 的复选框未针对该实例选中。看来一定和我的问题有关。

我检查了服务器 (ipTables) 以及与 VM 关联的 Google 网络上的防火墙规则。这些都没有问题(并且虚拟机肯定与该网络相关联)。如果我在服务器上使用 tcpdump 侦听端口 80 并浏览到我的域,我可以看到请求正在到达服务器,因此它们不会被传入的防火墙阻止。我还明确地重新启动了 Apache,请确保这不是问题所在。

那么,我需要做些什么来在传出的基础上取消阻止端口 80 和 443 吗?这可能是 SELinux 的事吗?因为图像应该准确地代表磁盘上的内容,所以它不应该是。看来这一定是在GCE这边...

如果这些复选框不编辑服务器上的 iptables 或 Google 网络上的防火墙规则,它们实际上对实例有什么作用?设置这些开关的 gcloud 命令是什么,或者理想情况下使用实例创建命令指定它?

已解决。我不完全了解幕后发生的事情,但解决这个问题需要使用“标签”,将网络上的防火墙规则与 VM 实例相关联。据我目前所知,这仅与 http 和 https 相关。在网络和 VM 上打开的其他端口似乎没有这个额外的部分就可以工作。

如果您查看防火墙规则,您可能会看到端口 80 和 443 规则分别带有标签“http-server”和“https-server”。如果他们不这样做,您将需要添加那些(或您选择的其他标签)。事实证明实例也需要添加这些标签。

要将标签添加到现有 VM 实例,请使用此 gcloud 命令:

gcloud compute instances add-tags [YOUR_INSTANCE_NAME] --tags http-server,https-server

要在创建实例时添加标签,请在您的语句中包含该标志:

gcloud compute instances create [YOUR_INSTANCE_NAME] --tags http-server,https-server

如果您查看 GCE gui,您会看到“允许 http 流量”和“允许 https 流量”复选框在执行此操作后被选中。然后请求和响应按预期流经端口 80 和 443。

Google Cloud Console 提供的超级有用的功能之一是 link 在为 REST API 和命令行创建大多数资源的底部相同的资源。我正在挑战自己,以便能够通过 SDK 命令行在控制台中完成所有我能做的事情,所以当我遇到像你这样的问题时,我经常使用它。

遇到与上述相同的问题,我在控制台中创建了一个 VM 并选择了 "Allow HTTP traffic"。查看命令行,您将看到两个命令。第一个是带有上述标记的创建命令 (http-server):

gcloud beta compute --project=XXXX instances create cgapperi-vm1 \
--zone=XXXXX --machine-type=f1-micro --subnet=default \
--tags=http-server --image=debian-10-buster-v20200413 \
--image-project=debian-cloud --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=cgapperi-vm1 \
--no-shielded-secure-boot --shielded-vtpm --shielded-integrity-monitoring \
--reservation-affinity=any

第二个实际上为您创建了防火墙规则 (default-allow-http),并将请求的目标设置为 http-server 标记 ( --target-tags=http-server) 在 tcp 端口 80 (--rules=tcp:80) 来自传入请求 (--direction =INGRESS) 来自所有来源 (--source-ranges=0.0.0.0/0):

gcloud compute --project=XXXX firewall-rules create default-allow-http \
--direction=INGRESS --priority=1000 --network=default --action=ALLOW \
--rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server

我希望这对其他人有帮助。

注意: 我确实将 gcloud compute instance create 的输出减少到相关位以减少混乱。

根据此 link 中的详细信息: https://cloud.google.com/vpc/docs/special-configurations

“通过选中这些复选框,VPC 网络会自动创建适用于所有带有 http-server 或 https-server 标签的实例的 default-http 或 default-https 规则。您的新实例也被标记为适当的标签取决于您的复选框选择。"

因此,勾选这些框会标记您的服务器并为您创建必要的防火墙规则,该规则将应用于具有该标记的所有服务器。从 gcloud 的角度来看,我想您需要确保创建和应用标签,并且还为其创建规则以执行控制台选项为您执行的操作。