如何在Google计算引擎中打开特定端口(例如9090)

286
我有两个 Google Compute Engine 实例,我想在这两个实例中开放 9090 端口。我认为我们需要添加一些防火墙规则。
请问如何操作?
9个回答

489

您需要:

  1. 前往cloud.google.com

  2. 进入我的控制台

  3. 选择您的项目

  4. 选择网络和gt; VPC网络

  5. 选择"防火墙"

  6. 选择“创建防火墙规则”

  7. 要将该规则应用于选择的VM实例,请选择目标>“指定目标标记”,并在“目标标记”中输入标记名称。此标记将用于将新防火墙规则应用于所需的任何实例。然后,请确保实例已应用网络标记。

  8. 将源IP范围设置为允许来自所有IP的流量:0.0.0.0/0

  9. 要允许传入到9090端口的TCP连接,在“协议和端口”中勾选“tcp”并输入 9090

  10. 单击创建(或单击“等效命令行”以显示用于创建相同规则的gcloud命令)

更新请参考文档自定义您的规则。


5
计算引擎似乎不再有“网络”选项了? - q9f
8
现在没有“网络”选项,更新后的路径是“项目” -> “网络” -> “防火墙规则”。 - Caio Vertematti
1
您需要允许HTTP打开80端口并允许HTTPS打开443端口。这是一种捷径。 - Carlos Rojas
2
如何确保标签已应用于实例? - Kenenbek Arzymatov
4
文档的菜单路径不断变化。我认为在答案中指向文档非常重要:https://cloud.google.com/vpc/docs/using-firewalls - Anupam
显示剩余14条评论

111

以下是命令行方式回答这个问题的方法:

gcloud compute firewall-rules create <rule-name> --allow tcp:9090 --source-tags=<list-of-your-instances-names> --source-ranges=0.0.0.0/0 --description="<your-description-here>"

这将为您命名的实例打开端口9090。省略--source-tags--source-ranges将把规则应用于所有实例。更多详细信息请参见Gcloud文档 firewall-rule create命令手册

之前的回答很棒,但Google建议使用更新的gcloud命令而不是gcutil命令。

PS: 要了解Google的防火墙规则,请运行 gcloud compute firewall-rules list 并查看所有防火墙规则


当我使用 --description 部分时,我会收到投诉,但除此之外,这对我很有效。 - shabbychef
2
我不确定他们是否更改了API,但源和目标似乎与@modulitos的答案相反。根据防火墙规则命令文档source表示传入流量,而target是要应用规则的实例。 - cindyxiaoxiaoli
1
错误:(gcloud.compute.firewall-rules.create)无法获取资源:
  • 权限不足 @modulitos
- alper
后续测试@modulitos是什么?是telnet:instance_ip:port还是nmap -p:port:instance_ip - Nam G VU
1
@alper 在此之前,你需要执行以下命令:"gcloud auth login" 并登录。 - Anton Tkachov

13

这个问题比较老,Carlos Rojas的回答很好,但我认为在尝试打开端口时应该记住以下几点。

首先要记住的是,Networking 部分已经更名为VPC Networking。因此,如果你想找到 Firewall Rules选项在哪里,请去 VPC Networking中查找。

其次,如果您正在尝试在Linux VM上打开端口,请确保绝不要使用ufw 命令打开端口。我尝试过,结果失去了对VM的ssh访问权限。所以不要重复我的错误。

第三点是,如果您正在尝试在Windows VM上打开端口,则需要在VM内部的 Windows Firewall 中创建防火墙规则,并在 VPC Networking -> Firewall Rules 中也创建防火墙规则。与Linux VM不同,端口需要在两个防火墙规则中都打开。因此,如果您无法从VM外部访问端口,请检查是否已经在GCP控制台和Windows防火墙中都打开了该端口。

最后(显而易见的)一点是,不要无端开放端口。当您不再需要时,请立即关闭端口。

我希望这个答案对您有用。


除此之外,我使用 ufw 命令打开了一些特定的端口,但我仍然可以访问 SSH。 - stackErr
一样。我使用ufw打开了一个端口,结果永远失去了ssh访问权限。甚至无法从浏览器登录。这是设计上的吗? - undefined

11

创建防火墙规则

如果您不熟悉GCP中的防火墙规则,请查看防火墙规则组件[1]。防火墙规则在网络层定义,并且仅适用于创建规则的网络;但是,您为每个规则选择的名称必须对项目唯一。

使用Cloud Console:

  1. 转到Google Cloud Platform控制台上的防火墙规则页面。
  2. 单击“创建防火墙规则”。
  3. 为防火墙规则输入一个名称。 此名称必须对该项目唯一。
  4. 指定将实施防火墙规则的网络。
  5. 指定规则的优先级。 数字越小,优先级越高。
  6. 对于流量方向,请选择入站或出站。
  7. 对于匹配后的操作,请选择允许或拒绝。
  8. 指定规则的目标。

    • 如果要将规则应用于网络中的所有实例,请选择网络中的所有实例。
    • 如果要将规则应用于由网络(目标)标记选择的特定实例,请选择指定目标标记,然后在目标标记字段中键入规则应用的标记。
    • 如果您希望规则适用于与关联服务账号相关的选择实例,请选择指定服务账号,在服务账号作用域下选择当前项目或另一个项目,并在目标服务账号字段中选择或输入服务账号名称。
    • 对于入口规则,请指定源过滤器:

      • 选择IP范围并将CIDR块键入源IP范围字段,以定义根据IP地址范围来确定传入流量的来源。使用0.0.0.0/0表示来自任何网络的源。
      • 选择子网,然后在子网弹出按钮中标记所需的子网,以按子网名称定义传入流量的来源。
      • 要通过网络标签限制源,请选择源标签,然后将网络标签键入源标签字段。有关源标签数量限制,请参见VPC配额和限制。仅当目标未由服务账号指定时,才可通过源标签进行过滤。有关更多信息,请参见按服务账号与按网络标签进行过滤。
      • 如果要按服务账号限制来源,请选择服务账号,指明服务账号是否在当前项目或服务账号范围下的另一个项目中,并在“来源服务账号”字段中选择或输入服务账号名称。仅当目标未通过网络标签指定时,才能通过源服务账号进行过滤。有关更多信息,请参阅按服务账户与网络标签进行过滤。
      • 如果需要,可以指定第二个来源过滤器。次要来源过滤器不能使用与主要过滤器相同的过滤条件。
    • 对于出站规则,请指定目标过滤器:

      • 选择IP范围,并将CIDR块输入到Destination IP ranges字段中,以定义通过IP地址范围进行传出流量的目标。使用0.0.0.0/0表示到处都是。
      • 选择子网,然后从子网弹出按钮中标记所需的子网,以定义通过子网名称进行传出流量的目标。
    • 定义适用于该规则的协议和端口:

      • 根据操作选择“允许全部”或“拒绝全部”,使规则适用于所有协议和端口。

      • 定义特定的协议和端口:

        • 选择TCP以包括TCP协议和端口。输入“all”或逗号分隔的端口列表,例如20-22、80、8080。
        • 选择 UDP 来包括 UDP 协议和端口。输入所有端口或逗号分隔的端口列表,例如67-69, 123。
        • 选择其他协议来包括诸如 icmp 或 sctp 的协议。
    • (可选)您可以创建防火墙规则但不强制执行它,方法是将其执行状态设置为已禁用。单击“禁用规则”,然后选择“已禁用”。

    • (可选)您可以启用防火墙规则日志记录:

      • 单击“日志”>“开启”。
      • 单击“打开”。
    • 单击“创建”。

链接: [1] https://cloud.google.com/vpc/docs/firewalls#firewall_rule_components


10

您需要添加一条防火墙规则,以打开入站访问到您的实例上的tcp:9090端口。如果您有超过两个实例,并且只想将9090开放给这两个实例,则需要确保这两个实例之间存在一个标签。您可以通过控制台或命令行添加或更新标签;如果需要,我建议使用GUI进行操作,因为它能够处理setinstancetags的读取-修改-写入周期。

如果您想要将9090端口对所有实例开放,则可以创建如下的防火墙规则:

gcutil addfirewall allow-9090 --allowed=tcp:9090

此设置将适用于您所有的实例。

如果您只想向正在提供应用程序的两个实例开放端口9090,请确保它们具有类似my-app的标记,然后像下面这样添加防火墙:

gcutil addfirewall my-app-9090 --allowed=tcp:9090 --target_tags=my-app

您可以在此处阅读有关在GCE中创建和管理防火墙的更多信息


12
gcutil 已不再提供支持,请使用 gcloud 重写您的命令行。 - Misha Brukman

7

我和你一样遇到了同样的问题,遵循@CarlosRojas的指示并做出一点改变后我成功解决了它。不是创建新的防火墙规则,而是编辑default-allow-internal的规则以允许从任何地方接收流量,因为创建新规则没有任何影响。


创建新的防火墙规则需要付费。您通过编辑此规则成功避免了这个费用吗? - killjoy
@killjoy,我不确定。我目前没有使用Google计算引擎。抱歉。 - user2434658
2
虽然这可能有效,但是这种方法存在安全问题。我发现适用于我的方法是利用实例上的防火墙标签。当您创建防火墙规则时,可以为该规则创建“目标标记”。然后,您可以将该标记应用于您的VM实例,从而将规则应用于您的特定实例。在此处查看更多信息:https://dev59.com/-43da4cB1Zd3GeqPwC7- 的接受答案。 - k00k

1

运行此命令以打开端口

gcloud compute --project=<project_name> firewall-rules create firewall-rules --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:<port number> --source-ranges=0.0.0.0/0 

1

console.cloud.google.com >> 选择项目 >> 网络 > VPC网络 >> 防火墙 >> 创建防火墙。

要将规则应用于VM实例,请选择目标,"指定目标标记",并在"目标标记"中输入标记的名称。该标记将用于将新的防火墙规则应用于您想要的任何实例。

在"协议和端口"中输入tcp:9090

点击保存。


0

我不得不通过降低优先级(使其更高)来修复这个问题。这导致了立即的响应。虽然不是我预期的结果,但它起作用了。


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