이번 시간에는 AWS Client VPN을 사용하여 Private 서브넷에 위차한 서버에 접근을 해보겠습니다.
시나리오
현재 Private Subnet에 인스턴스가 있습니다. 해당 인스턴스는 콘솔로 접속하는 것이 아닌 외부에서
접속을 하게끔 설정을 해야 합니다. 하지만 Bastion Host를 이용한 접속은 불가능한 상태입니다.
이런 시나리오를 가지게 되었을 때 우리는 “어떻게 Private Network에 접근을 하지?” 란 고민을 하게 될 겁니다.
이럴 때 사용할 수 있는 기술이 VPN 기술입니다.
외부 네트워크에서 내부망 네트워크를 안전하게 터널링을 하여 접속을 할 수 있는 방법 입니다.
여기서 저는 VPN 장비를 사용하지 않고 SSL-VPN 기술을 이용한 Client VPN 서비스를 소개를 드려
보도록 하겠습니다.
비용
AWS Client VPN 엔드포인트 요금은 시간당 요금과 시간당 연결 요금 두가지로 청구가 되겠습니다.
AWS Client VPN 엔드포인트 요금 : 시간당 0.10USD
AWS Client VPN 연결 요금 : 시간당 0.50USD
아키텍처
Client VPN 서비스를 사용을 하게 된다면 Private Subnet에 접근하기 위한 아키텍처 입니다.
1단계 : 서버와 클라이언트 인증서 및 키 생성(Window 방법)
– AWS 인증서 생성 링크
https://docs.aws.amazon.com/ko_kr/vpn/latest/clientvpn-admin/client-authentication.html#mutual
Easy-RSA 3.X 소프트웨어를 설치하고 이 소프트웨어를 사용하여 서버 및 클라이언트 인증서와 키를 생성합니다.
https://github.com/OpenVPN/easy-rsa/releases
위에 링크에서 Windows버전에 해당하는 ZIP 파일 다운로드 후 압축을 풀어 줍니다.
저는 EasyRSA-3.1.4-win64.zip을 다운로드를 해주겠습니다.
다운로드 후 압축을 풀어주었습니다.
해당 경로에서 CMD 창을 열어줍니다.
.\EasyRSA-Start.bat – EasyRSA 3 셸을 엽니다.
./easyrsa init-pki – 새 PKI 환경을 시작합니다.
./easyrsa build-ca nopass – 새 CA(인증 기관)를 빌드하려면 이 명령을 실행하고 표시되는 메시지를 따릅니다.
./easyrsa build-server-full server nopass – 서버 인증서 및 키를 생성합니다.
#중간에 입력란이 나오면 Yes를 입력을 해줍니다.
./easyrsa build-client-full client1.domain.tld nopass – 클라이언트 인증서 및 키를 생성합니다.
#중간에 입력란이 나오면 Yes를 입력을 해줍니다.
exit – EasyRSA 3 셸을 종료합니다.
mkdir C:\custom_folder
copy pki\ca.crt C:\custom_folder
copy pki\issued\server.crt C:\custom_folder
copy pki\private\server.key C:\custom_folder
copy pki\issued\client1.domain.tld.crt C:\custom_folder
copy pki\private\client1.domain.tld.key C:\custom_folder
cd C:\custom_folder
– 만든 인증서들을 custom_folder를 만들고 해당 custor_folder로 옮겨줍니다.
해당 인증서가 만들어진 것을 확인할 수 있습니다.
이제 인증서를 AWS ACM에 등록을 해보겠습니다.
저희는 서버 인증서와 클라이언트 인증서 두가지를 가져와야합니다.
ACM(AWS Certificate Manager(ACM) → 인증서 가져오기로 접속을 해줍니다.
인증서 본문(총 두번 등록을 해줘야합니다.)
- server.crt 내용 입력(클라이언트용 client1.domain.tld.crt)
인증서 프라이빗 키
- server.key 내용 입력(클라이언트용 client1.domain.tld.key)
인증서 체인
- ca.crt 내용 입력(클라이언트용 ca.crt(공용으로 사용됩니다.))
값을 넣어주실 때는
—-BEGIN CERTIFICATE—–
…..
—-END CERTIFICATE——
BEGIN CERTIFICATE, END CERTIFICATE 포함되게 안에 값들을 넣어줍니다.
검토 후 가져오기 클릭을 해줍니다.
똑같은 방법으로 클라이언트 인증서를 가져와줍니다.
검토 후 가져오기를 클릭을 해줍니다.
이렇게 인증서가 가져와 진 것을 확인할 수 있습니다.
2단계 : 클라이언트 VPN 엔드포인트 생성
VPC → Client VPN 엔드포인트로 이동을 해주겠습니다.
클라이언트 VPN 엔드포인트 생성을 클릭을 해줍니다.
IPv4 CIDR을 설정하실 때 (연결할 서브넷 IP와 Overlap 되면 안됩니다.)
CIDR 블록은 /12 보다 크거나 /22 이하여야 합니다.
상호 인증 사용을 체크를 해주시고
서버 인증서 – 서버인증서 ARN 등록
클라이언트 인증서 – 클라이언트 인증서 ARN 등록
VPN 포트 번호를 1194로 바꿔주고 클라이언트 VPN 엔드포인트 생성을 눌러줍니다.
이제 클라이언트 VPN 엔드포인트가 만들어졌으면 네트워크 연결을 해보겠습니다.
Pending-associate는 네트워크 연결을 진행하면 상태가 변경이 될 것입니다.
3단계 : 대상 네트워크 연결
만든 Client-VPN을 선택을 해주시고 밑에 목록에서 대상 네트워크 연결을 선택 해줍니다.
해당 서브넷을 VPN 엔드포인트와 연결을 한다고 생각하면 되겠습니다.
대상 네트워크 연결을 클릭을 해줍니다.
연결을 눌러주면 해당 서브넷이 추가가 되고 Associating → Available로 자동으로 변경됩니다.
또한 로컬 라우팅이 자동으로 생성이됩니다.
VPC의 기본 보안그룹도 자동으로 Client VPN 엔드포인트에 생성이 됩니다.
조금 기다리다 보면 대상네트워크 연결, 클라이언트 VPN 엔드포인트 상태가 정상적으로 확인이 되겠습니다.
4단계 : VPC에 대한 권한 부여 규칙 추가하기
이번에는 클라이언트가 VPC 액세스 하기 위한 권한 부여 규칙을 만들어 보겠습니다.
해당 클라이언트 VPN을 클릭을 하고 밑에 권한 부여 규칙을 선택을 해줍니다.
권한 부여 규칙 추가를 클릭을 해줍니다.
저희는 10.0.1.0/24 쪽 서브넷에만 접근을 하기 때문에 CIDR을 Subnet01로 해줍니다.
권한 부여 규칙 추가를 클릭을 해줍니다.
5단계 : 인터넷 액세스 제공
AWS 서비스, 피어링된 VPC, 온프레미스 네트워크, 인터넷 등 VPC에 연결된 추가 네트워크에 대한 액세스를 제공하는 것도 가능합니다.
각 추가 네트워크에 대하야 Client VPN 엔드포인트 라우팅 테이블에 해당 네트워크 경로를 추가하고 권한 부여 규칙을 구성하여
클라이언트에 액세스 권한을 부여합니다.
실습을 위하여 전체 허용을 해주겠습니다.
라우팅 테이블로 넘어와 경로 생성을 클릭을 해줍니다.
경로 생성을 클릭을 해줍니다.
권한부여 규칙 작성을 위하여 권한부여규칙 추가를 해줍니다.
6단계 : 보안 그룹 요구 사항 확인
보안그룹이 자동으로 지정된 것을 기본으로 사용되는 보안그룹으로 사용이 됩니다.
아웃 바운드 0.0.0.0/0 을 확인을 해줍니다.
7단계 : Client VPN 엔드포인트 구성 파일 다운로드
Client VPN 엔드포인트 구성 파일을 다운로드하고 준비 합니다.
구성 파일
- VPN 연결 설정에 필요한 세부 정보
- 인증서 정보
구성파일에는 위에 두가지가 포함이 되어있습니다.
Client VPN 엔드포인트에 연결해야하는 최종 사용자에게 해당 파일을 전달해야합니다.
해당 파일을 사용하여 VPN 클라이언트 애플리케이션을 구성 할 수 있습니다.
클라이언트 구성 다운로드 클릭
클라이언트 구성 다운로드 클릭
다운로드 후 해당 파일을 메모장을 이용해서 열어줍니다.
<cert>
Contents of client certificate (.crt) file
</cert>
<key>
Contents of private key (.key) file
</key>
구성 파일에 해당 내용을 붙여 넣기를 해준 후
<cert></cert> 안에는 client certificate 내용을 넣어줍니다.
<key></key> 안에는 private key 값을 넣어준 후 저장을 해줍니다.
마지막으로 구성파일에서 DNS 행을 찾아줍니다.
- 원래 DNS 이름:
cvpn-endpoint-0102bc4c2eEXAMPLE.prod.clientvpn.us-west-2.amazonaws.com
- 수정된 DNS 이름:
asdfa.cvpn-endpoint-0102bc4c2eEXAMPLE.prod.clientvpn.us-west-2.amazonaws.com
해당 DNS 이름 앞에 임의 문자를 넣어준 후 저장을 해줍니다.
8단계 : Client VPN 엔드포인트 연결
https://openvpn.net/community-downloads/
해당 사이트에서 Windows 용 OpenVPN을 다운로드 해줍니다.
실행 파일을 실행하여 설치를 해줍니다.
설치가 완료가 된다면 자동으로 실행이 되실 겁니다.
오른쪽 밑에 화살표 부분을 클릭하면 실행 중인 것을 알 수 있습니다.
Import 부분을 눌러주겠습니다.
파일 불러오기를 클릭을 해주시고 기존에서 설정했던 구성파일을 넣어줍니다.
파일을 넣어주시고
해당 VPN을 우측키로 눌러 연결을 눌러줍니다.
연결이 완료가 되었습니다. (저에게 할단된 IP는 192.168.0.162 입니다.)
해당 서브넷에 있는 서버로 연결이 되었는지 확인을 해보겠습니다.
저의 서버는 10.0.1.105의 IP를 가지고 있습니다.
핑이 제대로 나가고 있으며
SSH 접속도 제대로 되는 것을 확인할 수 있습니다.
현재 저는 Client VPN을 사용할 때 인터넷을 사용하지 못하게 설정을 했습니다.
오로지 private 대역에서만 사용하게끔 설정을 해뒀습니다.
혹시라도 인터넷과 Private 대역을 같이 사용하시고 싶으신 분은
Client VPN 설정시 파라미터에서 분할 터널 활성화를 해주시면 되겠습니다.
쉽게 설명하자면 트래픽을 오로지 VPN으로 보내는 것이 아니고 분할하여 트래픽을 보내기 떄문에 인터넷을 사용할 수 있게끔
해주는 것 입니다.
이렇게 오늘 Client VPN을 구성하는 방법을 배웠습니다.
봐주셔서 다들 감사합니다.
요금이 나가기 때문에 실습이 끝나면 바로 삭제하는거를 권장 드립니다.