DevOps35일차 VPC 사설망

문한성·2023년 4월 25일
0

부트캠프

목록 보기
67/123
post-thumbnail

VPC 사설망 외부 통신

앞서 우리는 public 서브넷과 private 서브넷을 나눠 구축하였다.

public 서브넷은 인터넷과 연결하여 외부에서 접근이 가능한 영역을 말한다. 따라서 public 서브넷과 인터넷 게이트웨이를 연결시킴으로서 외부 인터넷과 통신이 되게 하였다.

private 서브넷은 외부 인터넷을 차단하고 내부에서만 사용하기 위해 만든 Subnet이다. 예를 들어 Database Service인 RDS를 넣어두고, RDS는 중요한 정보이니 외부에서의 접속을 차단하는 형태로 이용한다.

"그런데 만일 RDS가 외부 인터넷을 통해 업데이트를 해야 할 일이 생긴다면 어떻게 해야할까?"

공인 IP를 생성해서 private 서브넷도 Internet Gateway를 통해 연결해줘야할까?

그러면 그건 public 서브넷이지 private가 아니게 된다. 그리고 외부에서도 침입이 가능해져 보안이 문제가 된다.
바로 이러한 경우에 사용하는 것이 NAT Gateway와 Bastion Host 기술이다.

이 둘은 사설망의 구조를 유지시켜주면서 외부와 조건적으로 데이터 통신이 가능하게 해준다.

NAT 게이트웨이 (Network Address Translation)

네트워크 주소 변환(Network Address Translation, 줄여서 NAT)은 IP 패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다.

대표적으로 사설 IP를 외부 인터넷과 통신하기위해 쓰인다.

NAT를 이용하는 이유는 대개 사설 네트워크에 속한 여러 개의 호스트가 하나의 공인 IP 주소를 사용하여 인터넷에 접속하기 위함이다.

Internet 접속이 가능한 Public Subnet에 NAT Gateway를 생성해두고, Private Subnet이 외부 인터넷으로 나아갈 경우에만 사용하도록 라우팅을 추가해주는 것이다.

public 서브넷과 private 서브넷은 같은 VPC안에 있으면 서로 통신할수있다는 점을 이용하여, NAT 게이트웨이를 생성해주면 마치 대리기사 역할처럼 public 서브넷이 외부 인터넷 데이터를 private 서브넷에게 대신 전달해주게 된다.

NAT Gateway는 내부에서 외부로의 접속만 가능하며 외부에서 NAT Gateway를 이용하여 접속하는 것은 불가능하다는 특징을 가지고 있다. 따라서 NAT Gateway를 이용하면 외부 인터넷 연결에 의한 보안 문제도 일석이조로 해결할 수 있게 된다.

앞서 배운 인터넷 게이트웨이(IGW)와 비교하자면, IGW는 NAT GW를 아우르는 상위개념이다.

즉, NAT GW도 IGW 없인 동작할 수 없는 것이다.

다만 NAT GW는 Private Subnet에 소속된 리소스들이 외부 인터넷 통신을 해주게 하는 특징이 있다고 보면 된다.

NAT 게이트웨이 요금

기본적으로 VPC의 구성요소는 서브넷, 보안그룹, NACL, 인터넷 게이트웨이 에 대해서는 따로 사용료가 없다.

다만 유일하게 NAT Gateway에 대한 사용료가 존재한다.

기본적으로 트래픽이 나갈때 데이터 처리 요금이 발생하며, 계속 돌려놓고만 있어도 시간당 요금이 청구되는 꽤 값비싼 서비스이다.

만일 요금을 아끼고 싶다면 바로 다음에 소개될 NAT Instance에 대해 알아두는걸 권장한다.

유형정책
NAT 게이트웨이NAT 게이트웨이 시간당 요금데이터 처리요금 – NAT 게이트웨이를 통해 처리된 각 기가바이트에 적용. 표준 AWS 데이터 전송 요금도 발생

NAT Instance 란?

NAT 게이트웨이를 배우다 보면, NAT 인스턴스라는걸 들어볼 것이다.

같은 NAT인가? NAT 게이트웨이가 있는데 인스턴스는 또 뭐야? 라고 생각들 할 것이다.

NAT 인스턴스도 같은 NAT 역할을 하는 놈이다.

다만 NAT 게이트웨이와 차이점은, NAT 게이트웨이는 AWS에서 제공하는 최신식 서비스이며, NAT 인스턴스는 EC2를 NAT로 사용하는 구식 기술이다.

예전에 NAT 게이트웨이 서비스가 나오기 이전 EC2 인스턴스를 NAT 인스턴스로 활용하여 NAT 통신을 해왔었다.
그러나 NAT 게이트웨이가 출시되면서 NAT 인스턴스 방식은 구식이 되었으며 쓸일이 거의 없어졌지만, NAT 게이트웨이는 NAT 인스턴스보다 가격이 3배 가까이 나간다는 점 때문에 NAT 인스턴스를 애용하는 기업도 있다.

안그래도 VPC 공부하는데 양도 많고 힘들어죽겠는데 굳이 배워야 하는가? 라고 묻는다면 개인적으로 배우길 추천하는 편이다.

앞서 말했듯이 EC2를 NAT용도로 사용하는거라, EC2를 구축할줄만 아면, 그냥 클릭 몇번으로 NAT을 설정할 수 있어 그리 구축 과정이 어렵지 않을 뿐 더러, 무엇보다 NAT 게이트웨이의 정신나간 비용때문에, 만일 개인 공부용이나 포트폴리오용으로 AWS를 사용한다고 하면 강력히 추천하는 바다.

NAT 게이트웨이는 서울 지역 기준으로 시간당 0.059달러의 비용이 발생하는데, 이걸 24시간 내내 가동하고 있다고 생각하자. 며칠만에 요금핵폭탄을 맞게 될 것이다. 이런건 회사 실무에서나 쓰이는 것이다.

반면 NAT 인스턴스는, 만일 프리티어 EC2를 사용한다면 그대로 요금제가 따라가 무료로 사용할수도 있다.

따라서 NAT 게이트웨이와 NAT 인스턴스를 정리하자면, 다음과 같다.

  • NAT Instance : 그냥 EC2 라고 생각하면 된다. 특별한 AMI를 설치한 EC2라고 보면 된다. 그래서 꺼지면 죽는다.
  • NAT Gateway : aws에서 제공하는 하나의 서비스이다. 고가용성이 보장되고있어서 죽지를 않는다.
NAT InstanceNAT Gateway
단일 인스턴스AWS에서 제공하는 서비스
= EC2= 서비스
꺼지면 죽음꺼져도 죽지않음(고가용성 보장)
보안그룹 영향 받음보안그룹 영향 받지않음
예전 스타일요즘 스타일
Source/Destination을 해제해야 함
Bastion을 겸할 수OBastion을 겸할 수X
Public Subnet에 있어야 함Public Subnet에 있어야 함

NAT 게이트웨이 실전 구축하기

AWS Management Console에 접속하여 VPC 서비스에서 NAT 게이트웨이를 선택한다.

NAT 게이트웨이는 Private Subnet과 외부와의 통신 매개체 이기 때문에, 외부에 접근할 수 있어야 하기 위해선 서브넷을 꼭 Public Subnet으로 할당하여야 한다.

정확히 말하자면, NAT Gateway는 반드시 Internet Gateway가 있는 Public Subnet(10.0.1.0/24, 10.0.2.0/24)에 생성해야 한다.

그리고 Elastic IP(탄력적 IP 주소)를 하나 만들어 NAT Gateway에 할당하여야 한다.

그러면 Private Subnet(10.0.3.0/25, 10.0.4.0/25)에 있는 인스턴스들은 외부 인터넷으로 나아갈 때 Elastic IP(공인 IP)로 Source IP NAT되어 나가게 된다.

(EC2(10.0.3.x/24, Private Subnet) - > NAT Gateway - > Internet Gateway - > 외부 인터넷)

이처럼 클릭 몇번 만으로 NAT 게이트웨이를 간단하게 생성할 수 있다.


하지만 NAT 게이트웨이를 생성했다고, Private Subnet에서 외부로 접근할 수 있는 것은 아니다.

위에서 인터넷 게이트웨이를 public subnet 라우팅 테이블에 추가했던 것 처럼, 이번에는 퍼블릭이 아닌 private subnet의 라우팅 테이블의 설정을 변경하면 된다.

Private Subnet의 라우팅 테이블을 보면 다음과 같이 내부 트래픽에 대해서만 local로 보내라는 테이블만 설정되어 있을 것이다.

라우팅 편집을 통해, 0.0.0.0/0 즉 모든 패킷을 nat로 보내라는 테이블을 추가하면 된다.

공인 인터넷(0.0.0.0)에 대해서는 NAT Gateway가 있는 Public Subnet으로 이동하여 Elastic IP(공인 IP)로 주소를 변환한 후 Internet Gateway를 통해 공인 인터넷으로 나아가게 된다.



지금까지의 설정방법을 정리하면 다음과 같다.

  • Internet Gateway가 있는 Public Subnet에 NAT Gateway 생성하고 Elastic IP(공인 IP) 할당
  • Private Subnet의 Routing table에 0.0.0.0/0에 대하여 NAT 게이트웨이(nat-id) 추가
    이를 이미지로 표현하면 아래와 같다. 이제 Private Subnet에 있는 서비스들은 인터넷 통신이 가능하게 도었다.

    Info
    참고로 여러 가용영역에 NAT 게이트웨이를 하나를 공유하게 되면 NAT 게이트웨이 가용영역이 문제가 생겼을 때 다른쪽도 영향을 받게 된다. 따라서 가용영역 당 NAT 게이트웨이를 만드는걸 권장되는 편이다.

Bastion Host

앞서 NAT Gateway를 통해 private 서브넷도 외부 인터넷과 간접적으로 연결될수 있었다.

다만 NAT Gateway는 서브넷에서 외부로 나갈수는 있어도, 거꾸로 외부에서 private 서브넷으로 접속은 못한다.

만일 ssh로 외부에서 인스턴스에 접속해 조정할 일이 있다면, private 서브넷은 어떻게 접속해서 해야할까?

아예 외부에서 private 서브넷으로는 영영 접속을 못하는 것일까?

가능하게 해줄 수 있다.

바로 이러한 역할을 해주는게 Bastion Host이다

Bastion Host란 Public Subnet에 위치하며, Private Subnet과의 통신을 도와주는 대리인이라고 할 수 있다.

좀 더 전문적으로 표현하면 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트이다.

관리자가 Bastion Host으로 SSH 연결을 한 후 Bastion Host에서 Private Subnet의 Host에 SSH 연결을 하는 형태로 Private Subnet에 접근할 수 있게 된다.

여기서 흔히들 착각하는게 있는데 Bastion Host는 인터넷 게이트웨이나 NAT 게이트웨이 같이 서비스를 만들어 등록하는 게 아니라, 그냥 private 서브넷에 연결되어 접속할수있는 public 서브넷을 그냥 Bastion Host라고 일컫는 것이다.

정리하자면, NAT가 Private Subnet에서 외부와 통신하는 수단이라면, Bastion Host는 외부에서 Private Subnet과 통신하는 수단이라고 보면 된다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글