我们有一个生产数据库服务器,它目前不可公开访问,没有公共 IP 地址,并且位于私有 VPC 子网中。
目前,只能从我们在同一 VPC 中的 EC2 上运行的应用程序访问它。
我们现在需要允许我们的 Amazon 账户和 VPC 之外的其他供应商对该数据库进行有限的远程访问。
我有一个预定义的需要访问的 IP 地址列表。
我正在尝试找出实现此目的的最佳方法,同时尽量减少对 VPC 内运行的任何其他应用程序的干扰。
我可以将数据库实例更改为使用公共 IP,但在测试数据库上尝试后,我可以看到 EC2 随后开始将实例端点解析为公共地址。我猜这会弄乱我们的 VPC 路由规则和安全组,并可能破坏我们应用程序的访问。
我希望的是,我们的内部应用程序能够继续通过私有 IP 地址像往常一样访问数据库,但以某种方式为删除应用程序提供一个可以访问数据库的公共地址。
显然,第三方应用程序不能使用 SSH 隧道或 VPN。它需要与公共 IP 地址建立直接 TCP 连接。
我无法在亚马逊上找到有关此类设置的任何文档。
答案1
如果您没有任何基于源 IP 地址的授权或 acl mysqld
,在这种情况下只需创建一个 aws 微型实例,并在其上设置端口转发器,例如rinetd
,将从白名单 IP 地址发往 mysqld 端口的传入连接转发到您的 RDS 实例。
答案2
以防万一它对其他人有用。这就是我最终的做法……
1)在我的私有子网中启动了一个小型EC2。
2)配置最小的 nginx 实例。
软件包版本没有包含流模块,因此我像这样构建了一个...
./configure --with-stream --without-http_rewrite_module
该实例仅用于此特定目的,因此我不需要任何其他 nginx 模块。
3)然后我像这样设置我的nginx.conf...
events {
worker_connections 1024;
}
stream {
upstream rds_db_1 {
server [aurora_endpoint_1]:3306;
}
upstream rds_db_1 {
server [aurora_endpoint_2]:3306;
}
...
server {
listen 33061;
proxy_pass rds_db_1;
}
server {
listen 33062;
proxy_pass rds_db_2;
}
...
}
在我的例子中,我有许多与代理的连接,因此我使用自定义的高端口号来区分每个连接(33061、33062……)。这些端口完全是任意的。
如果您只建立一个连接,那么您就可以让 nginx 监听正常的 mysql 端口号。
4) 在公共子网中设置网络负载均衡器 NLB,以将请求转发到实例。
我也可以将代理实例放在公共子网中,并跳过负载均衡器,但这似乎是一种更安全的方法。
然后,我为该实例设置了安全组,以允许来自 VPC CIDR(用于 NLB->实例健康检查)和来自供应商外部 IP 的请求。
网络负载均衡器不能直接配置安全组,因此需要直接在目标实例上配置安全规则。
5)我专门为供应商创建了自定义 mysql 用户。
6) 最后,我设置了一个客户端友好的 DNS 记录来指向我的 NLB。