...
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 게이트웨이와 NAT 인스턴스를 정리하자면, 다음과 같다.
- NAT Instance : 그냥 EC2 라고 생각하면 된다. 특별한 AMI를 설치한 EC2라고 보면 된다. 그래서 꺼지면 죽는다.
- NAT Gateway : aws에서 제공하는 하나의 서비스이다. 고가용성이 보장되고있어서 죽지를 않는다.
NAT Instance | NAT Gateway |
단일 인스턴스 | AWS에서 제공하는 서비스 |
= EC2 | = 서비스 |
꺼지면 죽음 | 꺼져도 죽지않음(고가용성 보장) |
보안그룹 영향 받음 | 보안그룹 영향 받지않음 |
예전 스타일 | 요즘 스타일 |
Source/Destination을 해제해야 함 | |
Bastion을 겸할 수O | Bastion을 겸할 수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에 있는 서비스들은 인터넷 통신이 가능하게 도었다.
참고로 여러 가용영역에 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과 통신하는 수단이라고 보면 된다.
Bastion Host 실전 구축하기
Bastion Host를 구성하기 위한 구성 순서는 다음과 같다.
- VPC 및 Public/Private Subnet 구성
- Public EC2(Bastion Host) 인스턴스 생성
- Private EC2 인스턴스 생성
- Bastion Host(public EC2)를 통해 Private EC2 접근
실습을 위해서 public 인스턴스와 private 인스턴스를 새로 생성해서 하도록 하겠다.
위에서 ap-northeast-2a 가용영역에 인스턴스 2개를 생성했었으니, 이번엔 다른 가용영역 ap-northeast-2c에 만들어보도록 하겠다.
인스턴스 세부정보 메뉴에서 인스턴스 ↔ VPC 연결은 다음과 같이 세팅 한다.
AMI, EC2 타입, 스토리지는 자유롭게 해줘도 된다. 단, 키페어는 보다 보안적인 설계를 위해 public용 키페어, private 키페어 둘을 나눠서 만들어보겠다.
[ap-northeast-2c / public 서브넷 인스턴스 만들기]
퍼블릭 IP 자동 할당을 활성화 해주는걸 잊지말자
[ap-northeast-2c / private 서브넷 인스턴스 만들기]
private 서브넷 인스턴스 보안 그룹 설정에서 유의할점이 있는데,
public 서브넷 인스턴스 만들땐, 전체 트래픽 0.0.0.0/0 이라고 명시한 것과 달리, privte는 외부와의 연결을 차단하고 public 인스턴스에서 온것만 허용할 것이기 떄문에, 소스에 위에서 등록한 퍼블릭 보안그룹인 my_Bation_SG를 등록해 public 서브넷에서만 온것만 허용할꺼라고 명시한다.
이것이 Bastion Host등록을 한것이다.
public / private 인스턴스 생성을 완료한다면 다음과 같이 구성되어질 것이다.
Bastion Host 로 private EC2에 접근하기
public과 private 서브넷 인스턴스를 만들었다면, public 인스턴스에 먼저 외부에서 ssh 접속을 해보도록 하겠다.
putty로도 충분히 가능하지만, 이 강의에선 mobaXterm을 이용해보도록 하겠다.
mobaXterm에 대한 포스팅을 따로 정리하였다.
정말 유용하고 편리한 툴이니 개인적으로 반드시 습득하길 권하는 바다.
준비가 되었으면, 다음과 같이 설정해준다.
접속이 문제없이 되었다면, 이제 public 인스턴스에서 private 인스턴스에게 ping을 때려보도록 하겠다.
$ ping <private 인스턴스 사설IP>
ping이란 다른 호스트 (Host)에 IP 데이터그램이 정상적으로 도달했는지 여부를 검사하는 것을 의미한다.
ping은 ICMP echo request 메세지를 전송하여 reply 메세지를 수신할 때 까지 대기한다.
이제 private 인스턴스로 ssh로 접속해보도록 하자.
다시한번 말하지만 private EC2 인스턴스에 접속하기 위해선, Bastion Host로 SSH 접속을 한 후 다시 Bastion Host에서 Private EC2로 SSH 접속을 하는 식으로 private 인스턴스 접속을 하는 것이다.
왜냐하면 Private EC2에 접근하고 싶어도 Public IP 주소가 없기 때문이다.
우리는 private 인스턴스를 생성할때 따로 private용 키페어를 생성했었다.
따라서 public 인스턴스(Bastion Host)에서 private 인스턴스에 접속하려면, 당연히 private 키페어가 필요하다.
그말은 ftp를 통해 키페어 파일을 public 인스턴스(Bastion Host)에 옮겨야 한다는 말이다.
putty를 사용한다면 따로 ftp툴(파일질라)를 이용해서 옮겨야 되겠지만 mobaXterm을 사용하면 매우 간편하게 옮길수 있다.
그 후 my_privatekeypair.pem 파일의 권한을 600으로 바꿔준다. (바꾸지 않으면 키페어의 퍼미션이 너무 공개되어 있다는 오류가 나타날 수 있기 때문이다.)
$ chmod 600 my_private_keypair.pem
그리고 ssh 명령어를 통해 private 인스턴스에 접속해준다.
$ ssh -i my_private_keypair.pem ec2-user@<private 인스턴스 사설IP>
정상적으로 구성된 경우 Bastion Host에서 Private EC2로 접속되어 터미널 상에서 마치 Private EC2로 직접 연결된 것 처럼 보이게 될 것이다.
Host PC -> Bastion Host -> Private EC2로 SSH 연결된 것이지만 터미널 상에서는 Private EC2의 Bash 출력되기 때문에 직접 연결한 것 처럼 Private Subnet의 EC2를 사용하면 된다.
이처럼 Bastion Host를 이용하면 Private Subnet의 인스턴스에 관리자가 접속함으로서 보안과 외부접속 두마리의 토끼를 잡는 식으로 구성이 가능하다.
MobaXterm으로 편하게 Bastion → private 접근하기
그러나 Bastion 인스턴스에 접속하고 일일히 ssh 명령어를 치기 매우 귀찮다.
클릭 몇번으로 한방에 private 인스턴스에 접속할수 있는 기능이 없을까?
다행히 mobaXterm에는 SSH Gateway 라는 독점적인 기능을 제공한다.
마치 Bastion을 SSH 게이트웨이로서 중간다리 역할을해서 한방에 private 인스턴스로 접속할 수 있게 하는 기능이다.
먼저 해왔듯이 Basic SSH 세팅을 등록한다.
이때 등록하는건 Bastion이 아닌 private 인스턴스의 IP를 등록해준다.
그리고 위의 탭에서 Network settings 탭으로 이동하고 SSH gateway (jump host) 버튼을 눌러준다.
그러면 SSH jump Host 를 등록할수 있는데, 여기다가 Bastion 인스턴스의 IP를 기재해준다.
이렇게 하면 단 클릭 한방으로 Bastion IP를 점프해서 바로 private IP로 접속할수 있게 된다!
private EC2에서 mysql 설치해보기
ssh 연결을 했으면 이제 private EC2 에서 mysql 설치 명령어를 실행해보자.
$ yum install mysql
만일 위처럼 설치가 안되면 public 서브넷에 NAT 게이트웨이를 등록을 안해준 것이다.
이는 당연하다. Bastion Host는 외부에서 내부로 접근하는 호스트이지 외부 인터넷으로 나가는 것이 아니다.
따라서 외부 인터넷으로 접속할수 없기 때문에 mysql 설치가 안되는 것이다.
바로 위에서 배운 NAT 게이트웨이를 다시한번 방금 생성한 private 서브넷 라우팅 테이블에 등록을 해주면, private EC2에서 마치 외부와 인터넷이 연결된 것처럼 yum install을 할수 있게 된다.
반면 위에서 NAT 게이트웨이를 정상적으로 잘 등록해주었다면 다음과 같이 깔끔하게 설치가 진행될 것이다.
# 참고자료
https://www.youtube.com/@AWSClassroom
https://aws-hyoh.tistory.com/58
https://jesuisjavert.github.io/2021/01/26/aws-study5/
https://kimjingo.tistory.com/180
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.