我在 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