🪧 NAT Gateway란?

NAT Gateway는 외부 인터넷에서 서브넷으로 접근할 수는 없지만 서브넷에서 외부 인터넷으로 접근할 수 있게 해주는 장치다.

인터넷 게이트웨이는 외부 인터넷에서 서브넷의 방향이든 서브넷에서 외부 인터넷의 방향이든 양방향으로 통신이 가능했지만, NAT Gateway는 서브넷에서 외부 인터넷의 방향으로만 통신이 가능하다. 즉, 내부에서 외부로만 나갈 수 있는 특수한 출입구라고 생각하면 된다.

  • 외부 인터넷 → 서브넷 방향의 통신

    • 서브넷에 포함된 EC2 인스턴스의 백엔드 서버로 API 요청
    • 서브넷에 포함된 EC2 인스턴스에 SSH로 접속
  • 서브넷 → 외부 인터넷 방향의 통신

    • 서브넷에 포함된 EC2 인스턴스에서 외부 API(ex. 날씨 API, OpenAI API 등) 호출
    • 서브넷에 포함된 EC2 인스턴스에서 소프트웨어(ex. Nginx, git 등) 설치

 

NAT Gateway를 어떻게 추가해야 하는 지 아래 그림으로 살펴보자. 특이하게도 NAT Gateway는 VPC도, Private Subnet도 아닌 Public Subnet에 연결을 해야 한다. Private Subnet을 외부 인터넷에 직접적으로 노출시키지 않으면서도, 인터넷에 접근은 할 수 있게 만들어야 해서 나온 구조로 예상된다.

이제 NAT Gateway를 직접 생성해보자.

NAT Gateway가 생성된 이후에는 Private Subnet에 연결시킬 라우팅 테이블을 만들어야 한다.

라우팅 편집에서 VPC 내부에서 보내는 IPv4에 대한 모든 트래픽은 NAT Gateway로 보내는 것으로 설정했다. 이렇게 하면 NAT Gateway를 활용해서 외부 인터넷에서 접근할 수 없는 Private Subnet을 만드는 과정을 모두 완료한 것이다.

이제 Private Subnet에 EC2 인스턴스를 생성해서 실제 외부 인터넷에서 접근할 수 없는지, 인스턴스에서는 외부 인터넷으로 요청을 보낼 수 있는지도 직접 눈으로 확인해보자.

이제 Private Subnet에 EC2를 배치하고 연결해보면 아래와 같은 경고 팝업이 뜬다.

외부에서 접근을 막기 위해 의도적으로 퍼블릭 IP 주소를 할당하지 않았고, 인스턴스를 Public Subnet에 배치하지 않았기 때문에 해당 EC2 인스턴스에 접근할 수 없다는 경고 메시지다.

근데 이렇게 만든 EC2 인스턴스에 백엔드 프로젝트를 배포하거나 관리 및 디버깅해야 할 때는 EC2 인스턴스로 들어가야 할 텐데, 접속할 수 있는 방법이 없으면 안 되는 것 아닌가 하는 의문점이 생긴다.

 

🔐 Private Subnet에 있는 EC2에 접근하기

생각해보면 같은 VPC 내부에서는 기존에 만들어 놓은 Public Subnet의 리소스와 Private Subnet의 리소스가 자유자재로 통신이 가능하다. 그 점을 활용해서 Private Subnet에 있는 EC2 인스턴스에 접근할 수 있다.

일단 터미널에서 키페어를 활용하여 Public Subnet에 존재하는 EC2 인스턴스에 접속해보자.

성공적으로 Public Subnet에 있는 EC2에 접속했다. 이제 여기서 Private Subnet에 있는 EC2 인스턴스에 접속해야 한다.

근데 그러려면 그 인스턴스의 키페어가 있어야 하는데 현재 접속해있는 EC2에는 당연히 키페어 파일이 존재하지 않는다. 따라서 현재 내 컴퓨터에서 web-server 인스턴스로 키페어 파일을 옮겨야 한다.

새로운 터미널에서 아래 명령어로 키페어 파일을 옮기도록 하자.

scp -i web-server.pem practice-server.pem ubuntu@[인스턴스 Public IPv4]:~/

이제 Public Subnet에 있는 EC2의 내부에 정상적으로 키페어 파일이 전송된 것을 확인할 수 있다.

이제 동일하게 Public Subnet 내부의 EC2 인스턴스에서 Private Subnet에 있는 practice-server에 접속하기 위해 명령어를 입력해주면 정상적으로 접속되는 것을 확인할 수 있다.

 

👮🏻 Bastion Host란?

Bastion Host는 외부 인터넷에서 내부 네트워크(VPC)에 있는 리소스에 접근할 때 보안을 위해 가장 먼저 거치는 컴퓨터를 말한다. 근데 Bastion Host가 꼭 필요할까? 만약 Bastion Host가 없는 아키텍처라면 아래와 같은 문제가 발생한다.

보다시피 Public Subnet에 있는 EC2 인스턴스가 외부 인터넷에 노출된다. 해커 입장에서는 Public Subnet에 있는 모든 리소스에 접근할 수 있기 때문에 서비스를 운영하는 입장에서는 공격이 들어올 수 있는 포인트가 많아서 보안적으로 대비가 힘들어진다. 따라서 아래와 같이 Public Subnet에 Bastion Host를 배치해줘야 한다.

Bastion Host를 활용해 외부에서 접근할 수 있는 경로는 딱 하나만 만들어줬다. 외부에서 접근할 수 있는 경로는 단 하나이기 때문에 보안적인 조치를 하기도 쉽고 관리도 쉬워진다.

 

⚓️ Bastion Host를 Public Subnet에 배치하기

먼저 Public Subnet에 있는 EC2에 터미널을 이용해서 접속해보자.

$ cd [키 페어 파일이 존재하는 경로]
$ ssh -i "web-server.pem" ubuntu@[bastion-host 인스턴스의 Public IP]

 

접속한 후에 해당 EC2가 Bastion Host라는 것을 쉽게 알아보기 위해 인스턴스의 호스트 이름을 바꿔준 후에 인스턴스를 재시작하도록 하자.

$ sudo vi /etc/hostname
$ sudo reboot # EC2 인스턴스 재시작하기

다시 Bastion Host에 접속하면 아래와 같이 정상적으로 호스트 이름이 변경되 상태로 접속된 것을 확인할 수 있다.

0개의 댓글