在 App Engine 中,您可以创建一个具有多达 1000 条独立优先规则的防火墙,从而允许或限制一系列 IP 地址和子网。您的应用将仅响应防火墙允许的请求。
如需了解 App Engine 防火墙的工作原理,请参阅了解防火墙。
准备工作
在为应用创建 App Engine 防火墙规则之前,您必须具有以下任一 App Engine IAM 角色,这些角色拥有创建或修改防火墙规则所需的权限:
- App Engine Admin
- Editor
- 所有者
创建防火墙规则
请使用以下任一方法创建防火墙规则。每添加一条规则,都需要重复这些步骤:
使用 Google Cloud 控制台中的“防火墙规则”页面创建防火墙规则:
-
转到 Google Cloud 控制台中的“创建防火墙规则”页面:
-
指定防火墙规则的详细信息:
- 在优先级中,输入一个整数以指定规则的相对重要性,并定义评估规则的顺序。
有效值的范围介于
1
到2147483646
之间。优先级为1
的规则最先评估。优先级为2147483647
的规则最后评估,此优先级保留给“default”规则使用。 -
在对匹配项执行的操作中,指定是允许还是拒绝与规则匹配的请求进行访问。如果规则设置为
allow
,则将请求转发给应用。如果规则设置为deny
,则返回403 Forbidden
错误来响应请求。 - 在 IP 范围中,定义该规则适用的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
- 可选:在说明中,添加不超过 100 个字符的规则说明。
- 在优先级中,输入一个整数以指定规则的相对重要性,并定义评估规则的顺序。
- 点击保存以创建规则。
- 测试规则,确保相应优先级和操作的行为符合预期:
- 点击测试 IP 地址。
- 输入要验证的 IP 地址,然后点击测试,确保正确评估对应的规则。
运行以下 gcloud
app firewall-rules
命令以创建防火墙规则:
-
运行以下命令可创建防火墙规则:
其中:gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION
-
PRIORITY 是
1
到2147483646
之间的整数,用于定义规则的重要性及其评估顺序。优先级为1
的规则最先评估。优先级为2147483647
的规则最后评估,此优先级保留给“default”规则使用。 -
ALLOW_OR_DENY 指定是允许还是拒绝与该规则匹配的请求进行访问。有效值为
allow
或deny
。如果规则设置为allow
,则将请求转发给应用。如果规则设置为deny
,则返回403 Forbidden
错误来响应请求。 - IP_RANGE 定义适用于该规则的 IP 地址范围。IP 地址范围必须以 CIDR 表示法定义,可以包含子网掩码并支持 IPv4 和 IPv6。
- DESCRIPTION 是可选的规则说明,不能超过 100 个字符。
-
PRIORITY 是
-
运行以下命令,以测试规则并确保相应优先级和操作的行为符合预期:
其中,IP_ADDRESS 是您要针对防火墙规则测试的 IP 地址。gcloud app firewall-rules test-ip IP_ADDRESS
-
运行以下命令可查看现有规则的列表:
gcloud app firewall-rules list
-
运行以下命令可删除现有规则:
其中,PRIORITY 是您要删除的规则的优先级值。gcloud app firewall-rules delete PRIORITY
- 示例:
- 您可以参考以下示例创建防火墙:
-
添加允许 IPv6 地址和子网掩码的规则,然后对其进行测试,以确保先于其他规则评估该规则:
gcloud app firewall-rules create 123 --source-range fe80::3636:3bff:fecc:8778/128 --action allow gcloud app firewall-rules test-ip fe80::3636:3bff:fecc:8778
-
添加拒绝 IPv4 地址和子网掩码的规则,然后对其进行测试,以确保适当评估该规则:
gcloud app firewall-rules create 123456 --source-range "74.125.0.0/16" --action deny gcloud app firewall-rules test-ip 74.125.0.8
-
更新默认规则,然后对其进行测试,以确保该规则限制与任何其他规则不匹配的所有 IP 地址:
gcloud app firewall-rules update default --action deny gcloud app firewall-rules test-ip 123.456.7.89
-
如需以编程方式为 App Engine 应用创建防火墙规则,您可以使用 Admin API 中的 apps.firewall.ingressRules
方法。
如需测试防火墙规则并确保优先级和操作的行为符合预期,您可以使用 apps.firewall.ingressRules.list
方法,并在 matchingAddress
参数中指定要测试的 IP 地址。
了解 App Engine 防火墙规则
App Engine 防火墙包含一个有序的规则列表,可以允许或拒绝从指定的 IP 地址或范围访问您的应用。该规则适用于 App Engine 应用的所有资源。
防火墙规则优先级
防火墙规则按重要性进行排序,您通过为每条规则的优先级赋值来定义其重要性。必须为每条规则指定唯一的优先级值,因为该值定义了某条规则相对于防火墙中其他规则的重要性。规则的优先级值范围介于 1
(最重要)到 2147483647
(最不重要)之间。
每道防火墙都包含一条自动创建的 default
规则,该规则的优先级为 2147483647
,并且适用于应用的整个 IP 范围。default
规则始终在防火墙中的所有其他规则之后进行评估,并且会应用于所有 IP 地址的所有请求。
防火墙会首先评估优先级最高的规则,然后按顺序评估防火墙中的其余规则,直到某条规则与相关请求的 IP 范围相匹配。系统在找到匹配的规则后,将允许或拒绝连接,然后跳过防火墙中的所有剩余规则。如果防火墙中手动定义的规则与请求均不匹配,则防火墙将评估 default
规则。
例如,如果您创建了一条优先级为 1
的规则,则防火墙将始终首先评估该规则。如果传入的请求与优先级为 1
的规则相匹配,则防火墙将仅评估该规则,并跳过防火墙中的所有其他规则,包括 default
规则。
下面的防火墙示例演示了规则的优先级会如何改变防火墙的行为。
防火墙示例
在此示例中,公司设置了防火墙,以授权工程团队和企业内部网络访问其正在开发的应用。防火墙规则已创建完毕,各个优先级之间具有较大的差距,以便今后能够灵活地增添其他规则。
优先级 | 操作 | IP 范围 | 说明 |
---|---|---|---|
1000 | 拒绝 | 192.0.2.1 | 拒绝向 DoS 攻击者授予访问权限。 |
2000 | 允许 | 198.51.100.2 | 允许向分支机构的工程师授予访问权限。 |
3000 | 拒绝 | 198.51.100.0/24 | 拒绝向所有非工程建筑授予访问权限。 |
5000 | 允许 | 203.0.113.0/24 | 允许向主建筑网络授予访问权限。 |
2147483647 | 拒绝 | * | 默认操作 |
创建防火墙后,假设向示例应用发出以下请求,请注意应用的响应:
- 来自 198.51.100.2 的请求与优先级为 2000 的规则匹配,因此获得准许。
- 来自 198.51.100.100 的请求与优先级为 3000 的规则匹配,因此遭到拒绝。
- 来自 203.0.113.54 的请求与优先级为 5000 的规则匹配,因此获得准许。
- 来自 45.123.35.242 的请求与默认规则匹配,因此遭到拒绝。
解决存在冲突的规则
例如,假设公司防火墙中的两个优先级发生了调换。如果调换优先级为 2000 和 3000 的规则,请注意会出现什么意外行为。
优先级 | 操作 | IP 范围 | 说明 |
---|---|---|---|
1000 | 拒绝 | 192.0.2.1 | 拒绝向 DoS 攻击者授予访问权限。 |
2000 | 拒绝 | 198.51.100.0/24 | 拒绝向所有非工程建筑授予访问权限。 |
3000 | 允许 | 198.51.100.2 | 允许向分支机构的工程师授予访问权限。 |
5000 | 允许 | 203.0.113.0/24 | 允许向主建筑网络授予访问权限。 |
2147483647 | 拒绝 | * | 默认操作 |
分支机构的工程师将无法访问该公司的应用,因为按照规则的新优先级,该规则永远得不到评估。工程师的 IP 地址 198.51.100.2
与拒绝 198.51.100.0/24
IP 地址范围内所有非工程师的规则相匹配,而允许工程师的 IP 地址访问的规则优先级低于此规则。
如需解决此问题,您必须将允许访问 198.51.100.2
的规则的优先级设置为高于拒绝访问 IP 范围 198.51.100.0/24
的规则。
后续步骤
为确保您安全地配置应用并设置适当的访问权限级别,请参阅应用安全和访问权限控制。