如何在VM实例中使用gcloud命令允许HTTP流量?(不是创建防火墙规则!)

25

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

我从连接到VM实例的磁盘创建了一个镜像。为了这样做,我必须根据Google文档删除实例以创建镜像。之后,我使用该镜像重新创建了我的实例。

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

当我查看GCE GUI(只是查看 - 不修改任何内容!)时,我可以看到实例的“允许http流量”和“允许https流量”的复选框未被选中。这似乎与我的问题有关。

我检查了服务器上的防火墙规则(iptables)以及与VM相关联的Google网络上的防火墙规则。两者都没有任何问题(并且VM绝对已与该网络相关联)。如果我在服务器上使用tcpdump监听端口80,并浏览到我的域名,我可以看到请求已到达服务器,因此它们没有被入站防火墙阻止。我还明确地重新启动了Apache,只是为了确保这不是问题。

那么,我需要做些什么才能在出站时解除对端口80和443的阻塞?是否可能是一个SELinux问题?由于该镜像应该准确地表示磁盘上的内容,因此不应该存在这个问题。看起来这必须是GCE方面的问题...

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

3个回答

43

问题已解决。我并不完全理解背后发生了什么,但是解决此问题需要使用“标签”,这些标签将网络防火墙规则与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端口流动。

2
即使我收到了“已更新”的确认消息,但对我来说并没有起作用..也许这已经过时了 :( - NaturalBornCamper
我最近读到谷歌云正在改变他们的网络配置并且取消某些传统选项。我相信这将在本月生效(2019年2月)。如果这个解决方案不能工作,可能是由于此类更改所致... - BuvinJ
啊,很高兴你留言了!我在留言后不小心把问题删掉了。实际上,我可以确认它在2019年2月仍然有效,只是需要一些时间才能在实例页面中显示出来。 - NaturalBornCamper
“http-server” 似乎反映了“default-allow-http”防火墙规则的“目标”。 - Charlie
我认为这里描述的故事不完整,因此我不认为这个答案应该被标记为“已接受”。 @cgapperi提供了更好的答案,除了标记之外,如果防火墙规则不存在,则需要创建防火墙规则。 - zuraff
这个答案被“接受”了,因为它直接解决了问题,没有需要额外步骤。那些防火墙规则是开箱即用的。你提到的另一个答案是几年后发布的,提供了更多信息,可能对其他情况有用。我自己点赞了那个答案,因为它很好!但这并不意味着在问题解决几年后,我需要重新分配“接受”的内容,因为这是问题最初解决方式的指示器。这里不断的恶意评论真让人疲倦! - BuvinJ

13
Google Cloud 控制台提供的一个非常有用的功能是,在大多数资源创建页面的底部都会提供 REST API 和命令行创建相同资源的链接。我正在挑战自己,尝试从 SDK 命令行中完成控制台上能够完成的所有操作,因此当我像您一样遇到问题时,我经常使用此功能。
与以上相同的问题,我在控制台中创建了一个虚拟机并选择了“允许 HTTP 流量”。查看此命令行内容,您将看到两条命令。第一条是具有上述标记(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),从所有来源(--source-ranges=0.0.0.0/0) 的传入请求(--direction=INGRESS) 在 tcp 端口 80(--rules=tcp:80)。
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的输出减少到相关部分。


1
感谢您提供的详细信息和建议! - BuvinJ

1
根据此链接中的详细信息: https://cloud.google.com/vpc/docs/special-configurations “选择这些复选框会自动创建适用于具有 http-server 或 https-server 标记的所有实例的 default-http 或 default-https 规则。您的新实例还将标记为相应的标记,具体取决于您的复选框选择。”
因此,勾选这些框会为您创建必要的防火墙规则,并对带有该标记的所有服务器应用它。从 gcloud 的角度来看,我想您需要确保已创建并应用了标记,并且还创建了规则,以便像控制台选项一样为您完成此操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接