IT/Network&Security

[nw] VPN(AWS Client VPN, Site-to-Site VPN etc)

Hayley Shim 2023. 10. 28. 18:08

안녕하세요. 최근 AWS와 온프레미스 환경 간 연동 아키텍처를 생각하며 VPN 관련 내용을 정리하기 위해 작성한 글입니다.

예전 AWS와 온프레미스 환경 연동을 위해 VPN 일종인 Wireguard를 온프레미스의 sdwan 장비와 연동하여 SSL VPN 서비스를 제공한 경험이 있습니다. SDWAN 서비스에 3rd Party 오픈소스인 Wireguard를 연동해서 제공한 사내 첫 비지니스 모델 사례였습니다. 서비스 도입 전 사내 테스트부터 제안, 기술협상, 구축, 서비스 안정화까지 몇년이 지났지만 아직도 생각나는 기술이네요.

SDWAN — AWS 연동 사례

IPSec vs SSL vs Wireguard

이때 AWS의 SSL VPN 서비스인 Client VPN과 Wireguard 프로토콜을 적용한 VPN 간 성능 비교를 하며 AWS의 Client VPN에 대해 간단히 알아보았습니다. AWS Client VPN에 적용된 Open VPN과 Wireguard 프로토콜 간 비교는 해당 링크를 참고해주세요.

WireGuard vs OpenVPN: 7 Big Differences in 2023

VPN 프로토콜 비교

VPN 프로토콜 성능 비교

위와 같이 Wireguard 프로토콜은 기존 IPSec, SSL 대비 장점이 있습니다. 자세한 내용은 Wireguard 홈페이지를 참고해주세요.

AWS Client VPN

  • AWS Client VPN은 AWS 리소스 및 온프레미스 네트워크의 리소스에 안전하게 액세스할 수 있게 해주는 관리형 클라이언트 기반 VPN 서비스입니다. 클라이언트 VPN을 사용하면 OpenVPN 기반 VPN 클라이언트를 사용하여 모든 위치에서 리소스에 액세스할 수 있습니다.

VPC에 액세스 시나리오 예

  1. VPC와 동일한 리전에 클라이언트 VPN 엔드포인트를 생성합니다.
  2. 서브넷을 클라이언트 VPN 엔드포인트와 연결합니다.
  3. 클라이언트에 VPC에 대한 액세스 권한을 부여하는 권한 부여 규칙을 추가합니다.
  4. 리소스의 보안 그룹에 규칙을 추가하여 2단계에서 서브넷 연결에 적용된 보안 그룹의 트래픽을 허용합니다.

AWS Client VPN과 EKS 간 연동 예

AWS 관리형 VPN 서비스인 AWS Client VPN을 사용하여 EKS 클러스터에 대한 개인 액세스를 활성화하고 API 서버에 액세스하는 방법에 대한 예시가 있어 살펴보았습니다.

EKS 클러스터가 생성되면 기본적으로 공개 액세스가 활성화되어 인터넷에서 Kubernetes API 서버에 액세스할 수 있습니다. Public 클러스터에서 클러스터의 보안을 보장하기 위해 여러 조치를 취할 수 있지만 Private network를 통해 액세스를 제한하는 것은 보안을 강화할 수 있는 방법입니다.

AWS ClientVPN을 사용하여 EKS 프라이빗 엔드포인트에 연결

AWS 클라이언트 VPN 서비스는 클라이언트 컴퓨터에 VPN 클라이언트가 설치되어 있는 동안 VPN 서버/프로토콜을 실행 하지만 서버와 클라이언트 간에 VPN 연결이 설정되기 전에 인증 형식이 필요합니다.

  1. 상호인증(Mutual Authentication) : 상호 인증은 연결이 설정되기 전에 클라이언트 와 서버가 서로의 ID를 인증할 수 있도록 하는 보안 기능입니다 . 클라이언트는 초기 연결 중에 서버에 유효한 인증서를 제공해야 합니다. 그러면 서버도 클라이언트에 유효한 인증서를 제공해야 합니다. 그런 다음 클라이언트는 서버의 인증서를 확인하고 서버의 인증서가 유효하고 신뢰할 수 있는 경우에만 보안 연결을 설정합니다.
  2. AD와 같은 디렉토리 서비스 통합(Integrate a Directory service like AWS Directory Service)

상호 인증 프로세스

  1. 인증서 생성
  2. ACM에 인증서 및 키 업로드

EKS와 Client VPN 연동 프로세스 예

  1. 두 개의 퍼블릭 및 프라이빗 서브넷이 있는 VPC를 생성합니다. VPC에 EKS 클러스터를 생성하고 VPC에 4개의 서브넷을 추가합니다.
  2. 두 개의 프라이빗 서브넷에서만 애플리케이션을 실행할 노드 그룹을 만듭니다.
  3. 프라이빗 서브넷과 연결될 VPN 엔드포인트를 생성합니다.
  4. VPN 탄력적 네트워크 인터페이스(ENI)가 서브넷에 생성되며 이를 통해 VPN 연결이 서브넷의 리소스와 통신할 수 있습니다.
  5. openVPN, AWS Client VPN과 같은 일부 VPN 클라이언트 소프트웨어를 실행할 클라이언트 컴퓨터에 접속합니다.
  6. VPN 클라이언트는 인터넷을 통해 SSL/TLS(443)를 통해 VPN Endpoint와 연결을 설정합니다.
  7. VPN Endpoint는 VPN Endpoint(10.6.0.0/16)와 연결된 CIDR 블록에서 EKS VPC(192.168.0.0/16)와 연결된 CIDR 블록으로 SNAT(Source Network Address Translation)를 수행합니다. 클라이언트는 VPC에 액세스할 수 있습니다.
  8. 이제 사용자는 API 서버 프라이빗 엔드포인트에 액세스할 수 있습니다.

참고 : GKE VPN 연동 예

아래와 같이 GKE에 VPN을 연동한 예시도 있습니다.

GKE Istio VPN Demo

테라폼으로 VPN 터널을 연결하는 부분을 참고해보면 아래와 같습니다.

resource "google_compute_vpn_tunnel" "tunnel1_istio" {
  name          = "tunnel1-istio"
  peer_ip       = google_compute_address.vpn_static_ip_gce.address
  shared_secret = "a secret message"
  project       = var.istio_project

  target_vpn_gateway = google_compute_vpn_gateway.target_gateway_istio.self_link

  local_traffic_selector = ["0.0.0.0/0"]

  remote_traffic_selector = ["0.0.0.0/0"]

  depends_on = [
    google_compute_forwarding_rule.fr_esp_istio,
    google_compute_forwarding_rule.fr_udp500_istio,
    google_compute_forwarding_rule.fr_udp4500_istio,
  ]
}

resource "google_compute_vpn_tunnel" "tunnel1_gce" {
  name          = "tunnel1-gce"
  peer_ip       = google_compute_address.vpn_static_ip_istio.address
  shared_secret = "a secret message"
  project       = var.gce_project

  target_vpn_gateway = google_compute_vpn_gateway.target_gateway_gce.self_link

  local_traffic_selector = ["0.0.0.0/0"]

  remote_traffic_selector = ["0.0.0.0/0"]

  depends_on = [
    google_compute_forwarding_rule.fr_esp_gce,
    google_compute_forwarding_rule.fr_udp500_gce,
    google_compute_forwarding_rule.fr_udp4500_gce,
  ]
}

# Ensures that traffic in the Istio project destined for the GCE VM is routed
# to the VPN
resource "google_compute_route" "route_istio" {
  name       = "route-istio"
  network    = google_compute_network.istio.name
  dest_range = google_compute_subnetwork.subnet_gce.ip_cidr_range
  priority   = 1000
  project    = var.istio_project

  next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel1_istio.self_link
}

# Ensures that traffic destined for a pod in the GKE cluster in the GCE project
# is routed to the VPN
resource "google_compute_route" "route_gce_cluster_cidr" {
  name    = "route-istio-cluster-cidr"
  network = google_compute_network.gce.name

  # TODO: figure out how to use declared subnet ranges instead of the variable
  dest_range = google_compute_subnetwork.subnet_istio.secondary_ip_range[0].ip_cidr_range
  priority   = 1000
  project    = var.gce_project

  next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel1_gce.self_link
}

# Ensures that traffic destined for a service in the GKE cluster from the GCE \
# project is routed to the VPN
resource "google_compute_route" "route_gce_services_cidr" {
  name    = "route-istio-services-cidr"
  network = google_compute_network.gce.name

  # TODO: figure out how to use declared subnet ranges instead of the variable
  dest_range = google_compute_subnetwork.subnet_istio.secondary_ip_range[1].ip_cidr_range
  priority   = 1000
  project    = var.gce_project

  next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel1_gce.self_link
}

# Routes traffic destined for the GKE cluster subnet in the GCE project over
# the VPN
resource "google_compute_route" "route_gce" {
  name       = "route-gce"
  network    = google_compute_network.gce.name
  dest_range = google_compute_subnetwork.subnet_istio.ip_cidr_range
  priority   = 1000
  project    = var.gce_project

  next_hop_vpn_tunnel = google_compute_vpn_tunnel.tunnel1_gce.self_link
}

자세한 내용은 다음 링크를 참고해주세요.

AWS Site to Site VPN

Site 간 VPN은 전체 네트워크를 서로 연결하여 마치 동일한 로컬 네트워크에 있는 것처럼 통신할 수 있도록 합니다 . Site 간 VPN은 일반적으로 방화벽, 라우터 등 물리장비를 사용하여 네트워크 간에 보안 연결을 설정합니다. AWS Site-to-Site VPN은 인터넷 프로토콜 보안(IPsec) VPN 연결을 지원합니다.

다중 Site-to-Site VPN 연결

  • VPC에는 가상 프라이빗 게이트웨이가 연결되어 있고, 여러 온프레미스 위치에 여러 Site-to-Site VPN 연결이 있습니다. 네트워크로 바인딩되는 VPC의 모든 트래픽이 가상 프라이빗 게이트웨이로 라우팅되도록 라우팅을 설정합니다.
  • 이 시나리오를 사용하여 여러 지리적 위치에 대한 Site-to-Site VPN 연결을 만들고 사이트 간에 안전한 통신을 제공할 수도 있습니다. 자세한 내용은 VPN CloudHub를 사용하여 사이트 간에 보안 통신 제공 섹션을 참조하세요.

전송 게이트웨이를 통한 다중 Site-to-Site VPN 연결

  • VPC에는 전송 게이트웨이가 연결되어 있고, 여러 온프레미스 위치에 여러 Site-to-Site VPN 연결이 있습니다. 네트워크로 바인딩되는 VPC의 모든 트래픽이 전송 게이트웨이로 라우팅되도록 라우팅을 설정합니다.
  • 이 시나리오를 사용하여 여러 지리적 위치에 대한 Site-to-Site VPN 연결을 만들고 사이트 간에 안전한 통신을 제공할 수도 있습니다.

 

 

blog migration project

written in 2023.6.23

https://medium.com/techblog-hayleyshim/nw-vpn-ad129ccd27ca

'IT > Network&Security' 카테고리의 다른 글

[k8s] Tracing the path of network traffic  (0) 2023.10.29
[k8s] CoreDNS  (0) 2023.10.29
[nw] HTTP/3 QUIC  (0) 2023.10.28
[nw] Traffic Monitoring using sflow/netflow  (0) 2023.10.28
SDWAN  (1) 2023.10.28