在AWS上,要访问Private Subnet中的EC2、RDS、内部ALB、EKS API Endpoint等,以前通常会使用Bastion Host。然而,Bastion Host需要直接运营可从外部访问的服务器,这带来了SSH端口管理、账户管理、安全补丁、访问日志管理等运营负担。
在这种情况下,AWS Client VPN是可用的替代方案之一。
AWS Client VPN是一种托管式Client-to-Site VPN服务,它允许用户通过VPN客户端从笔记本电脑或PC连接到AWS VPC内部网络。简而言之,它是一项功能,使外部用户能够像进入VPC内部网络一样通过VPN访问资源。

什么是AWS Client VPN?
AWS Client VPN是基于OpenVPN的托管式VPN服务。
用户安装AWS VPN Client或OpenVPN兼容客户端,导入管理员提供的VPN配置文件并连接。连接完成后,用户可以在VPC内部的私有IP段进行通信。
简化后的结构如下:
사용자 PC
↓
AWS VPN Client
↓
AWS Client VPN Endpoint
↓
VPC Private Subnet
↓
Private EC2 / RDS / 내부 ALB / EKS
重要的一点是,它不是在VPC本身上“开启VPN客户端功能”的概念,而是创建Client VPN Endpoint并将此Endpoint连接到VPC的Subnet的方式。
何时使用?
AWS Client VPN在以下情况下非常有用:
- Bastion Host 없이 Private EC2에 SSH 접속하고 싶을 때
- Private Subnet의 RDS에 로컬 PC에서 접속해야 할 때
- 내부 ALB, 내부 API, 사설 도메인에 접근해야 할 때
- 재택근무자나 외부 운영자가 VPC 내부망에 접근해야 할 때
- 사용자 단위로 VPN 접속을 제어하고 싶을 때
特别是在希望消除Bastion Host的环境中,它是一个很好的选择。Bastion Host需要直接运营暴露在外部的EC2实例,而Client VPN是托管服务,可以减轻运营负担。
用户连接方法
如果管理员配置了Client VPN,用户可以相对简单地连接。
1. AWS VPN Client 설치
2. 관리자가 제공한 .ovpn 설정 파일 가져오기
3. VPN 프로파일 Import
4. Connect 클릭
5. VPN 연결 후 VPC 내부 리소스 접속
VPN连接完成后,用户可以直接访问内部私有IP。
例如,要SSH连接到Private EC2,可以按如下方式连接:
ssh ec2-user@10.30.1.10
如果存在内部Web服务,可以通过浏览器使用私有IP或内部DNS进行访问。
http://10.30.1.20
http://internal-service.local
也就是说,用户在VPN连接后,就像在VPC内部网络中一样访问资源。
整体配置流程
配置AWS Client VPN的流程如下:
1. 인증 방식 준비
2. Client VPN Endpoint 생성
3. Target Network Association 설정
4. Authorization Rule 추가
5. Route Table 확인 또는 추가
6. Security Group 설정
7. Client 설정 파일 다운로드
8. 사용자 접속 테스트
核心步骤可以这样记忆:
Endpoint 생성
→ VPC Subnet 연결
→ 접근 권한 허용
→ 라우팅 설정
→ 보안 그룹 허용
→ 사용자 접속
1. 准备认证方式
Client VPN在用户连接到VPN时执行认证。
典型的认证方式如下:
1. Mutual Authentication
- 인증서 기반 인증
- 실습이나 소규모 환경에 적합
2. Active Directory Authentication
- AWS Managed Microsoft AD 등과 연동
3. SAML-based Federated Authentication
- IAM Identity Center, Okta, Microsoft Entra ID 등과 연동
- 운영 환경에 적합
在实验环境中,基于证书的相互认证是最简单的。但对于生产环境,使用SAML或AD基于的认证在管理方面会更好。
2. 创建Client VPN Endpoint
在AWS控制台中,可以通过以下路径创建:
VPC Console
→ Client VPN Endpoints
→ Create Client VPN endpoint
主要设置示例如下:
Name tag : client-vpn-demo
Client IPv4 CIDR : 172.16.0.0/22
Server certificate : ACM에 등록된 서버 인증서
Authentication : Mutual Authentication 또는 SAML/AD
Transport protocol : UDP
VPN port : 443
Split tunnel : Enable
VPC ID : 접속할 VPC
Security Group : Client VPN Endpoint용 Security Group
这里重要的值是Client IPv4 CIDR。
Client CIDR是分配给连接到VPN的用户的IP地址范围。例如,如果设置为172.16.0.0/22,VPN用户将在此范围内获得IP地址。
需要注意的是,Client CIDR不能与VPC CIDR重叠。
例如,如果VPC如下所示:
VPC CIDR : 10.30.0.0/16
Client CIDR应设置为不同的范围,如下所示:
Client CIDR : 172.16.0.0/22
Client CIDR在创建后难以更改,因此在初始设计时应谨慎确定。
3. 配置目标网络关联
创建Client VPN Endpoint后并不能立即连接。
您需要将Endpoint连接到VPC的Subnet。此操作称为目标网络关联(Target Network Association)。
Client VPN Endpoints
→ 생성한 Endpoint 선택
→ Target network associations
→ Associate target network
→ VPC 선택
→ Subnet 선택
此步骤是实际将VPN Endpoint附加到VPC的核心步骤。
如果可能,最好连接两个或更多不同可用区的Subnet。虽然只连接一个Subnet也能工作,但在生产环境中,为了高可用性,连接两个或更多可用区的配置更合适。
4. 添加授权规则
即使关联了目标网络,用户也无法立即访问VPC内部网络。
在Client VPN中,您必须通过授权规则(Authorization Rule)明确允许用户访问哪些网络。
例如,要允许访问整个VPC范围,请按如下方式设置:
Destination network to enable access : 10.30.0.0/16
Grant access to : Allow access to all users
Description : Allow access to VPC
在生产环境中,最好按组限制访问范围,而不是允许所有用户完全访问VPC。
例如,可以按如下方式划分:
개발자 그룹 → 개발 VPC만 접근
운영자 그룹 → 운영 VPC 접근
DBA 그룹 → RDS Subnet만 접근
보안 담당자 그룹 → 전체 점검 대역 접근
5. 配置路由表
Client VPN Endpoint有自己的路由表。
VPN用户可以访问哪些网络由路由决定。
VPC CIDR的路由通常在目标网络关联过程中自动添加。
示例如下:
Destination : 10.30.0.0/16
Target : 연결된 Subnet
但是,如果流量需要发送到其他VPC、本地网络或互联网,则需要添加单独的路由。
例如,如果VPN用户需要通过AWS出站互联网流量,则需要以下路由:
Destination : 0.0.0.0/0
Target : 연결된 Subnet
在这种情况下,还需要检查Subnet的路由表、NAT Gateway和Internet Gateway配置。
通常,如果只需要内部网络访问,则更常使用启用Split Tunnel的配置。
Split Tunnel Enabled
→ VPC 내부 트래픽만 VPN으로 전달
→ 일반 인터넷 트래픽은 사용자 PC의 기존 인터넷 경로 사용
6. 配置安全组
Client VPN配置中最常遇到的问题是安全组。
如果VPN连接成功但无法连接到EC2或RDS,通常是以下情况之一:
- 대상 리소스의 Security Group에서 VPN 대역을 허용하지 않음
- Client VPN Endpoint의 Security Group을 허용하지 않음
- NACL에서 차단됨
- Authorization Rule이 없음
- Route가 없음
例如,要SSH连接到Private EC2,EC2安全组需要以下入站规则:
Type : SSH
Port : 22
Source : Client VPN Endpoint Security Group
或者,您也可以直接允许Client CIDR。
Type : SSH
Port : 22
Source : 172.16.0.0/22
从运营角度来看,如果可能,使用安全组引用方式进行管理会更好。
7. 下载客户端配置文件
配置完成后,需要下载客户端配置文件,以便用户连接。
在AWS控制台中,可以在以下位置获取:
Client VPN Endpoints
→ Endpoint 선택
→ Download client configuration
对于CLI,可以使用以下命令:
aws ec2 export-client-vpn-client-configuration
--client-vpn-endpoint-id cvpn-endpoint-xxxxxxxx
--output text > client-vpn.ovpn
如果使用基于证书的相互认证,则必须将客户端证书和私钥信息添加到.ovpn文件中。
<cert>
client certificate 내용
</cert>
<key>
client private key 내용
</key>
将此文件提供给用户后,用户可以在AWS VPN Client中导入并连接。
8. 简单CLI配置示例
以下是使用AWS CLI创建Client VPN Endpoint的简单示例。
REGION="ap-northeast-2"
PROFILE="my-sso"
VPC_ID="vpc-xxxxxxxx"
SUBNET_ID="subnet-xxxxxxxx"
CLIENT_VPN_SG_ID="sg-xxxxxxxx"
VPC_CIDR="10.30.0.0/16"
CLIENT_CIDR="172.16.0.0/22"
SERVER_CERT_ARN="arn:aws:acm:ap-northeast-2:123456789012:certificate/server-cert-id"
CLIENT_CERT_ARN="arn:aws:acm:ap-northeast-2:123456789012:certificate/client-cert-id"
创建Client VPN Endpoint:
ENDPOINT_ID=$(aws ec2 create-client-vpn-endpoint
--region "$REGION"
--profile "$PROFILE"
--client-cidr-block "$CLIENT_CIDR"
--server-certificate-arn "$SERVER_CERT_ARN"
--authentication-options Type=certificate-authentication,MutualAuthentication={ClientRootCertificateChainArn=$CLIENT_CERT_ARN}
--connection-log-options Enabled=false
--transport-protocol udp
--vpn-port 443
--split-tunnel
--vpc-id "$VPC_ID"
--security-group-ids "$CLIENT_VPN_SG_ID"
--query 'ClientVpnEndpointId'
--output text)
echo "$ENDPOINT_ID"
添加目标网络关联:
aws ec2 associate-client-vpn-target-network
--region "$REGION"
--profile "$PROFILE"
--client-vpn-endpoint-id "$ENDPOINT_ID"
--subnet-id "$SUBNET_ID"
添加VPC访问授权规则:
aws ec2 authorize-client-vpn-ingress
--region "$REGION"
--profile "$PROFILE"
--client-vpn-endpoint-id "$ENDPOINT_ID"
--target-network-cidr "$VPC_CIDR"
--authorize-all-groups
下载客户端配置文件:
aws ec2 export-client-vpn-client-configuration
--region "$REGION"
--profile "$PROFILE"
--client-vpn-endpoint-id "$ENDPOINT_ID"
--output text > client-vpn.ovpn
9. 连接测试
VPN连接后,可以按如下方式进行测试:
Private EC2 Ping测试:
ping 10.30.1.10
Private EC2 SSH连接:
ssh ec2-user@10.30.1.10
内部DNS检查:
nslookup internal-service.local
内部Web服务检查:
curl http://10.30.1.20
常见问题
如果VPN配置后无法连接,应检查以下项目:
1. Client VPN Endpoint가 available 상태인지 확인
2. Target Network Association이 정상인지 확인
3. Authorization Rule이 추가되어 있는지 확인
4. Client VPN Route Table에 목적지 Route가 있는지 확인
5. 대상 EC2, RDS, ALB의 Security Group이 VPN 접근을 허용하는지 확인
6. NACL에서 트래픽을 차단하지 않는지 확인
7. Client CIDR과 사용자 로컬 네트워크 대역이 겹치지 않는지 확인
8. DNS 서버 설정이 올바른지 확인
特别是如果VPN连接成功但无法访问内部资源,最好优先检查授权规则、路由表和安全组。
与Bastion Host比较?
虽然AWS Client VPN和Bastion Host的目的不完全相同,但Client VPN可以替代Bastion Host用于操作员或开发人员的内部网络访问。
Bastion Host
- 외부 접속용 EC2 필요
- SSH 포트 관리 필요
- OS 패치 필요
- 계정 및 키 관리 필요
- 서버 침해 시 내부망 접근 위험
AWS Client VPN
- 관리형 VPN Endpoint 사용
- 사용자 단위 접근 제어 가능
- Private IP로 직접 접근 가능
- SAML/AD 연동 가능
- Bastion Host 없이 내부망 접근 가능
因此,如果目的是“为了连接Private EC2而设置Bastion Host”,Client VPN可以是一个非常好的替代方案。
但是,如果需要更强的运营控制和会话日志记录,也建议考虑AWS Systems Manager Session Manager。
总结
AWS Client VPN是一种托管式VPN服务,它允许外部用户安全地访问VPC内部资源。
配置的核心是以下五点:
1. Client VPN Endpoint 생성
2. VPC Subnet과 Target Network Association
3. Authorization Rule로 접근 대역 허용
4. Route Table로 목적지 네트워크 지정
5. Security Group으로 실제 리소스 접근 허용
使用Client VPN可以在没有Bastion Host的情况下访问Private EC2、RDS、内部ALB、EKS API Endpoint等。特别是在远程工作、外部操作员访问、开发人员内部网络访问等环境中,它可以创建比Bastion Host更简洁的访问结构。
在生产环境中,使用SAML或AD基于的认证而不是简单的证书方式,并按用户组划分访问权限,会更安全。
参考链接:
发表回复