Question?


Client vpn 을 사용하여 서비스를 이용 중입니다. vpn 연결 시 특정 ALB로 통신하고 싶은데 방법이 있을까요?




Answer


Client VPN 이란?


AWS Client VPN 서비스는 사용자가 연결할 수 있는 확장 가능한 엔드포인트을 제공합니다. 신축성이 뛰어나며 늘어난 연결에 맞춰 확장할 수 있습니다. 기본적으로 엔드포인트는 최대 2,000개의 동시 연결을 확장할 수 있습니다.

Client VPN End point는 AZ당 하나 이상의 서브넷에 연결됩니다. 고가용성을 위해 서브넷을 두 개 이상 사용하는 것이 좋습니다. 첨부 파일은 서브넷에 ENI(탄성 네트워크 인터페이스)를 생성합니다. 클라이언트 서브넷에서 전송되는 모든 네트워크 트래픽은 ENI IP 주소로 NAT(네트워크 주소 변환)됩니다. 이렇게 하면 연결된 클라이언트가 서브넷 경로 테이블을 사용하여 VPC 내부 및 외부의 리소스에 연결할 수 있습니다.



특정 ALB로 NAT 통신하는 방법은 ALB가 위치하는 VPC에 따라 다릅니다.



1. ALB가 Client vpn endpoint가 위치한 VPC 와 같은 경우


Client vpn endpoint 에서 vpc로 접근할 때 ENI의 IP로 Mapping 되어 들어오며 같은 VPC 안에서 내부 통신을 할 수 있게되는 구조입니다.


이 경우, Split-Tunneling 기능을 활성화 해야 합니다.


Split-Tunneling 기능을 활성화 하는 방법은 아래와 같습니다.

  1. Client vpn endpoint에서 해당 endpoint를 선택하시고 [Actions] → [Modify Client VPN Endpoint]를 선택합니다.




  2. Other Optional Parametes에서 Enable split-tunnel 을 선택합니다.




  3. 이 기능을 활성화하시면 기존 default Route가 자동으로 제거되지만, 간혹 삭제되지 않는 경우가 있습니다. 이런 경우에는 명시적으로 default route를 삭제해주셔도 됩니다.


ALB가 동일한 VPC에 있는 경우, 기본 route가 필요하지 않습니다. 같은 vpc안에 있으므로 내부통신을 할 수 있으며 별도의 route table 설정하지 않고도 가능합니다.



2. ALB가 Client vpn endpoint 와 다른 VPC에 위치한 경우.


이 경우에는 Client vpn endpoint 의 VPC에서 퍼블릭 인터넷을 통해 ALB가 위치한 VPC의 ALB의 공인  IP 주소로 접근해야 합니다.


  1. 먼저 ALB의 IP 주소를 확인해야 하며(CLI 로 확인 가능합니다.) 인프라 환경에 맞는 보안 설정을 사전에 설정하셔야 합니다.

  2. 그 다음, 위와 같이 Split-tunnel 기능을 활성화 합니다. (1~3번과 동일하게 작업)

  3. Client VPN endpoint route table에 ALB의 IP 주소를 넣어줍니다.

    /32 로 넣어주셔야 합니다.

    이 때 주의하실 점으로는, 확인 가능한 모든 ALB의 IP 주소를 추가해주셔야 합니다(최소 2개 이상)

    또한 ALB의 IP 주소는 변경될 수 있으므로, 변경될때마다 변경해주셔야 합니다. (이 작업이 곤란할 시 NLB를 사용하시는 것을 추천드립니다.)




Split-tunnel 및 Client vpn endpoint에 관련된 내용은 아래 문서를 참고해주시길 바랍니다.


split-tunnel

https://docs.aws.amazon.com/ko_kr/vpn/latest/clientvpn-admin/split-tunnel-vpn.html


Client vpn end-point routing

https://docs.aws.amazon.com/ko_kr/vpn/latest/clientvpn-admin/cvpn-working-routes.html


마지막으로 아래 링크를 참고하시어 Client vpn 구성에 관한 시나리오를 참고하시길 바랍니다

https://docs.aws.amazon.com/ko_kr/vpn/latest/clientvpn-admin/scenario.html