如何在一组防火墙规则后面设置多个 Google Cloud SQL 实例?

如何在一组防火墙规则后面设置多个 Google Cloud SQL 实例?

目前,我们在异地数据中心运行多个 MySQL 服务器,这些服务器接收来自多个 Web 服务器的连接,以及来自家中 20 到 30 个用户的连接,这些用户都安装了本地应用程序。

数据库服务器在自己的私有网络中运行,该网络具有单个外部 IP 地址和单个防火墙。所有服务器都在同一个 MySQL 端口上运行,通过端口映射,防火墙将正确的端口路由到正确的服务器,连接到 external-ip:2001 会转到数据库服务器 1,连接到 external-ip:2002 会连接到数据库服务器 2。

现在我们想迁移到 Google Cloud Platform。我一直在尝试不同的设置,但我找不到像现在这样设置的方法。我可以看到每个单独的 SQL 实例的防火墙设置,但这不是我想要的方式。有了 8 个不同的服务器,其中一些有多个副本,管理所有防火墙规则很快就会成为一场噩梦。如上所述,我们有 30 多个用户,但并非所有用户都有完全静态的 IP 地址。

配置此设置的最佳方法是什么?

答案1

Cloud SQL 是一种托管数据库服务,访问它的方式可能与您通常在本地服务器上的方式不同。您可以通过两种方式访问​​ Cloud SQL 实例。如果您从外部应用程序连接,请执行以下操作之一:

  1. 为每个实例的每个客户端 IP 地址授权。
  2. 使用云端 SQL 代理

请注意,这里没有提到配置防火墙。第一个选项听起来不太好,因为您有许多用户,并且他们的 IP 地址不是完全静态的。这些问题可以通过使用 Cloud SQL 代理来解决。通过使用第二种方法,您必须在用户端配置代理才能连接到实例。

Cloud SQL Proxy 的工作原理是在本地环境中运行一个本地客户端(称为代理)。您的应用程序使用数据库使用的标准数据库协议与代理进行通信。代理使用安全隧道与服务器上运行的配套进程进行通信。

虽然代理可以监听任何端口,但它只会在端口 3307 上创建到 Cloud SQL 实例的传出连接。如果您有出站防火墙策略,请确保它允许连接到 Cloud SQL 实例 IP 上的端口 3307。


要了解如何使用代理,请参阅此文档:https://cloud.google.com/sql/docs/mysql/connect-admin-proxy

答案2

有一种方法可以帮助您获得所需的架构。

我将列出可执行此操作的步骤。

基本上,您想要的是从一个可公开访问的 IP 到多个不公开可用的 IP 的端口转发,通过该 IP 您可以连接到 Cloud SQL 后端服务器。

要做到这一点 -

创建两个 MySQL 类型的 Cloud SQL 实例,并将其配置为仅使用私有 IP 地址。要了解如何配置私有 IP,请按照以下步骤操作这个文件

使用 Ubuntu 16.04 LTS 映像创建一个 Compute Engine 实例,并在创建时启用 IP 转发。您可以关注这个文件知道如何做到这一点。

通过 SSH 进入 Compute Engine 实例

gcloud compute ssh FIRST_COMPUTE_ENGINE_INSTANCE_NAME

运行以下命令编辑 /etc/sysctl.conf 文件。

sudo nano /etc/sysctl.conf

现在取消注释该行以启用 IP 转发

#uncomment the below line
net.ipv4.ip_forward=1

现在运行以下命令,如果未设置,则将 ip_forward 设置为 1。

sudo su
echo 1 >| /proc/sys/net/ipv4/ip_forward
exit

现在我们必须配置 IP 表。运行以下命令

sudo iptables -F

上述命令将刷新或删除所有当前存在的 IP 规则。

sudo iptables -F -t nat

上述命令将刷新或删除所有类型网络地址转换(NAT)的 IP 规则。

 sudo iptables -t nat -A PREROUTING -p tcp -d INTERNAL_IP_OF_COMPUTE_ENGINE --d port 4479 -j DNAT --to-destination PRIVATE_IP_OF_FIRST_SQL_INSTANCE:3306

 sudo iptables -t nat -A PREROUTING -p tcp -d INTERNAL_IP_OF_COMPUTE_ENGINE --d port 4480 -j DNAT --to-destination PRIVATE_IP_OF_SECOND_SQL_INSTANCE:3306

上述命令将请求从 Compute Engine 路由到 Cloud SQL 实例。由于我有两个 SQL 实例,因此我必须使用不同的端口(即 4479 和 4480)运行两次该命令。您可以根据要连接的 Cloud SQL 实例数量指定不同的端口多次运行上述命令。请注意,我们必须添加防火墙规则以允许在我们的虚拟专用网络 (VPC) 中连接这些端口号。3306 端口与 MySQL 数据库一致,因为 Cloud SQL 实例是 MySQL 类型。

sudo iptables -t nat  -A POSTROUTING -j MASQUERADE

上述命令将掩盖/屏蔽试图连接数据库的 IP。

sudo iptables -L -t nat

上述命令将列出 NAT 类型的 iptables。

上述步骤将配置通过单个 IP 连接到多个 Cloud SQL 实例,这些实例将可供公众访问。现在,要测试它是否真的有效,您可以在 Compute Engine 中创建一个测试实例并连接到数据库。

欲了解更多详情,请关注本文

或者,您也可以探索 这个文件了解 Compute Engine 实例中的协议转发,这可能会对您的用例有所帮助。

相关内容