配置 Google Cloud Firewall 以过滤标签和子网

配置 Google Cloud Firewall 以过滤标签和子网

我在 Google Cloud Compute Engine 实例上运行 PostgreSQL,并且 PostgreSQL 当前配置为接受来自任何地方的连接,其想法是我使用防火墙来控制访问,而不必每次都登录服务器。

目前,我有一个名为的防火墙规则development-allow-psql,为了确保没有其他配置错误,我将其设置为允许来自任何地方:

Targets: All instances on network
Source Filter: IP Ranges
Source IP Ranges: 0.0.0.0/0
Second Source Filter: None
Specified protocols and ports: tcp:5432

跑步

psql "dbname=mydb host=__.___.__.__ user=myuser password=mypassword port=5432"

立即连接我,但可以从任何地方连接,而不仅仅是我想要允许访问的实例。

这些实例是通过模板自动创建的,Instance Group模板Instance Template 配置为使用以下设置创建实例:

Network tags: myapp-api, http-server, https-server
Network: development
Subnetwork: development (with address range 10.154.0.0/20)

我想将此数据库实例的访问权限限制为具有myapp-api标签或子网为10.154.0.0/20或两者兼有的实例。因此,我将防火墙设置更改为以下内容:

Targets: Specified target tags
Target tags: myapp-api
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432

这会阻止我之前运行的命令的访问psql(psql 命令正在从我通过访问的 docker 实例运行docker exec -ti -u0 my-instance-api-dev-small bash

如果我现在改为

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

它仍然阻止所有访问。如果我现在删除第二个源过滤器并仅过滤子网,仍然无法访问。

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: None
Specified protocols and ports: tcp:5432

如果我将子网源过滤器换成标签过滤器:

Targets: All instances on the network
Source Filter: Source tags
Source tags: myapp-api
Second Source Filter: None
Specified protocols and ports: tcp:5432

...仍然无法访问。

选择子网的源过滤器和选择所有子网时相同。

切换到:

Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 0.0.0.0/0
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

它再次允许所有人(甚至 Google Cloud 之外的人)连接,即使我指定了源标签

将 IP 地址范围更改为 10.154.0.0/20 再次阻止所有人

Targets: All instances on the network
Source Filter: IP ranges
Source IP ranges: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

例如,用实例的外部 IP 地址替换 IP 范围35.189.124.141/32是可行的,但由于这些 IP 地址是临时的,因此这不是一个解决方案,因为每次自动扩展添加具有新 IP 地址的更多实例时都需要更新防火墙规则。

如何配置防火墙以仅允许来自特定子网和/或具有特定标签的实例?我所做的似乎不起作用。

答案1

当从数据库实例的外部 IP 地址切换到其内部 IP 地址时,上述所有组合突然都起作用。

psql "dbname=mydb host=internal-ip-address-here user=myuser password=mypassword port=5432"

事实证明,当您使用标签时,防火墙会查看内部 IP 地址而不是外部 IP 地址。

Targets: All instances on the network
Source Filter: Subnets
Subnets: 10.154.0.0/20
Second Source Filter: Source tags
Source tags: myapp-api
Specified protocols and ports: tcp:5432

相关内容