更新时间:2022年11月:本文经过审查并更新以确保准确性。
开发人员和数据库管理员通常远程登录到公有子网中的 Amazon Elastic Compute Cloud (Amazon EC2) 实例,并访问 Amazon Relational Database Service (Amazon RDS) 实例。为了提高生产力和使用方便,许多情况下,需要从工作站的常用工具远程登录并访问 RDS 实例,而无需先登录到远程 EC2 实例。
在创建 RDS 实例时,您可以选择使其可公开访问以启用远程连接,但这并不建议。在本文中,我们将演示如何创建一个不公开访问的 RDS 实例,并使用 AWS Client VPN 远程连接。我们特别使用 Microsoft SQL Server 的示例。
什么是 AWS Client VPN?
AWS Client VPN 是一种完全托管的弹性 VPN 服务,能够从任何位置安全地访问 AWS 和本地资源,使用 VPN 软件客户端。它是一项高可用、弹性和按需付费的服务。
概述
下图展示了使用 AWS Client VPN 连接 RDS 实例的高层架构示例。
- 客户端使用基于 OpenVPN 的 VPN 客户端应用程序从本地计算机建立 VPN 连接。所有客户端 VPN 会话都在配置为管理所有客户端 VPN 会话的 AWS Client VPN 终端节点结束。
- DB 子网组是创建在 VPC 中并指定用于 DB 实例的子网集合。每个 DB 子网组应在给定 AWS 区域的至少两个可用区中拥有子网。
- 连接建立后,您可以安全地连接到与 AWS Client VPN 终端节点关联的子网中的 RDS 实例。RDS 实例支持使用 AWS 目录服务的 SQL 和 Windows 身份验证。
在这个用例中,我们创建 AWS Client VPN 以使用互认证。通过互认证,AWS Client VPN 使用证书在客户端和服务器之间进行身份验证。
步骤概述
本文将指导您完成以下步骤:
- 生成服务器证书并将其上传到 AWS Certificate Manager (ACM)。
- 创建 VPC 和子网。
- 创建安全组并设置入站规则。
- 创建客户端 VPN 终端。
- 创建 Active Directory。
- 创建 RDS 实例。
- 下载并安装 VPN 客户端软件。
- 导出并配置 VPN 客户端配置文件。
- 连接客户端 VPN。
- 验证与 RDS 实例的连接。
前提条件
此流程需要以下条件:
- 一个 AWS 账户
- 在您的计算机上安装并配置 AWS 命令行界面 (AWS CLI)
请注意,本文中的 AWS 命令已在 AWS CLI 版本 2 中测试。
生成证书
有关使用 OpenVPN easy-rsa 工具创建服务器证书的说明,请参阅互认证。
使用以下命令将服务器证书上传到 ACM(请用您自己的文件名替换):
bash
aws acm import-certificate \
--certificate fileb://Certificate.pem \
--certificate-chain fileb://CertificateChain.pem \
--private-key fileb://PrivateKey.pem
上传后,系统会生成一个证书 ARN,您将在后续步骤中使用。
创建 VPC 和子网
使用以下代码创建一个 VPC,以承载子网和 RDS 实例的子网组:
bash
aws ec2 create-vpc \
--cidr-block "172.32.0.0/16" \
--tag-specifications "{\"ResourceType\":\"vpc\",\"Tags\":[{\"Key\":\"Name\",\"Value\":\"myrdsvpn\"}]}"
您将使用 VPC ID 创建两个位于不同可用区的子网:
```bash aws ec2 create-subnet \ --vpc-id "vpc-xxxxxxxxxxxxxxxxx" \ --cidr-block "172.32.1.0/24" \ --availability-zone "us-east-1a"
aws ec2 create-subnet \ --vpc-id "vpc-xxxxxxxxxxxxxxxxx" \ --cidr-block "172.32.2.0/24" \ --availability-zone "us-east-1b" ```
您将在后续步骤中使用子网 ID。
创建安全组
使用以下代码创建一个将用于 AWS Client VPN 终端和 RDS 实例的安全组:
bash
aws ec2 create-security-group \
--group-name "mysecuritygroup" \
--description "My security group" \
--vpc-id "vpc-xxxxxxxxxxxxxxxxx"
您还需要为安全组创建两个入站规则。
第一个规则允许来自客户端 IP CIDR 的连接到 UDP 端口 443,以便用户能够连接到 AWS Client VPN 终端。源 IP 是连接到 AWS Client VPN 终端的用户的 IP 地址:
bash
aws ec2 authorize-security-group-ingress \
--group-id "sg-xxxxxxxxxxxxxxxxx" \
--protocol "udp" \
--port "443" \
--cidr "122.183.152.0/24"
第二个规则允许与安全组附加的所有网络接口之间的 TCP 连接,例如安全组之间的连接:
bash
aws ec2 authorize-security-group-ingress \
--group-id "sg-xxxxxxxxxxxxxxxxx" \
--protocol -1 \
--source-group "sg-xxxxxxxxxxxxxxxxx"
创建 AWS Client VPN 终端
使用以下代码创建 AWS Client VPN 终端并将其附加到 VPC。您将使用客户端 IPv4 CIDR 为客户端连接分配 IP 地址。请使用您在上一步中生成的服务器证书 ARN。
bash
aws ec2 create-client-vpn-endpoint \
--client-cidr-block "192.168.128.0/22" \
--server-certificate-arn "arn:aws:acm:xxxxxxxxxxxxxxxxxxxxxxxx" \
--authentication-options "Type=certificate-authentication,
MutualAuthentication={ClientRootCertificateChainArn=arn:aws:acm:xxxxxxxxxxxxxxxxxxxxxxxx}" \
--vpc-id "vpc-xxxxxxxxxxxxxxxxx" \
--connection-log-options "{\"Enabled\": false}" \
--split-tunnel \
--tag-specifications "[{\"ResourceType\":\"client-vpn-endpoint\",\"Tags\":[{\"Key\":\"Name\",\"Value\":\"myclientvpnendpt\"}]}]" \
--security-group-ids "sg-xxxxxxxxxxxxxxxxx"
终端使用分离隧道选项。当您不希望所有用户流量通过 AWS Client VPN 终端时,可以使用分离隧道 AWS Client VPN 终端。
创建的 AWS Client VPN 终端状态为待关联。我们必须将目标网络与终端相关联。以下代码将早前创建的两个子网与新创建的 AWS Client VPN 终端相关联:
```bash aws ec2 associate-client-vpn-target-network \ --client-vpn-endpoint-id "cvpn-endpoint-xxxxxxxxxxxxxxxxx" \ --subnet-id "subnet-xxxxxxxxxxxxxxxxx"
aws ec2 associate-client-vpn-target-network \ --client-vpn-endpoint-id "cvpn-endpoint-xxxxxxxxxxxxxxxxx" \ --subnet-id "subnet-yyyyyyyyyyyyyyyyy" ```
运行这些命令后,VPN 终端的状态将从“关联中”更改为“已关联”,完成后状态为“已关联”。
要授权客户端访问与关联子网位于同一 VPC,您必须创建一个授权规则。授权规则指定哪些客户端可以访问 VPC。在此流程中,我们授予所有用户访问权限。目标网络是应允许访问终端的网络的 CIDR。如下代码所示:
bash
aws ec2 authorize-client-vpn-ingress \
--client-vpn-endpoint-id "cvpn-endpoint-xxxxxxxxxxxxxxxxx" \
--target-network-cidr "172.32.0.0/16" \
--authorize-all-groups
创建 Active Directory
因为 SQL Server RDS 实例也使用 Windows 身份验证,所以创建一个与 RDS 实例关联的 Active Directory:
bash
aws ds create-microsoft-ad \
--name "corp.mydirectory.com" \
--edition "Standard" \
--password "xxxxxxxx" \
--description "My Corp Microsoft AD" \
--short-name "mycorpdirectory" \
--vpc-settings "{\"VpcId\":\"vpc-xxxxxxxxxxxxxxxx\",\"SubnetIds\":[\"subnet-xxxxxxxxxxxxxxxxx\",\"subnet-yyyyyyyyyyyyyyyyy\"]}"
创建 SQL Server RDS 实例
要创建 RDS 实例,您需要进行以下步骤(后续内容将提供)。
以上是通过 AWS Client VPN 远程连接 RDS 实例的完整指南。希望这对您有所帮助!