그저 내가 되었고

🗺️NAT(Network Address Translation) / NAT Gateway / Bastion Host 본문

개발/Network

🗺️NAT(Network Address Translation) / NAT Gateway / Bastion Host

hyuunii 2023. 4. 5. 22:09

핵심::

NAT: Private Subnet에서 외부와 통신하는 수단(Private Subnet ➡ 외부, 서비스 만들어 등록 필요)

Bastion Host: 외부에서 Private Subnet과 통신하는 수단(외부 ➡ Private Subnet, 따로 서비스 만드는게 아니라 Private Subnet에 연결되어 접속 가능한 Public Subnet을 Bastion Host라고 -복잡하게- 부르는 것)

 

NAT(Network Address Translation) 개념

네트워크 주소 변환(network address translation, 줄여서 NAT)은 컴퓨터 네트워킹에서 쓰이는 용어로서,

IP패킷의 TCP/UDP 포트 숫자와 소스 및 목적지의 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고 받는 기술을 말한다. 

한 마디로 Network Address인 IP를 변환(Translation)하겠다는 뜻이다.

 

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

 

IP 주소에는 Public IP(공인 IP)와 Private IP(사설 IP)가 있다.

IP를 굳이 두 종류로 나눈 이유를 간단히 말하자면

1) IPv4 주소의 낭비를 막고

2) 공인 인터넷을 굳이 사용하지 않아도 되는 단말들에게 어느 망이든 중복 사용 가능한 IP를 주기 위함이다.(공인망에서는 공인 IP만이 유통) 

 

그런데 사설 IP를 할당받은 단말이 인터넷을 사용해야 한다면 단말의 IP는 어떻게 변화하는 것일까?

 

일상 생활 사례를 들어보자. 카페에서 노트북을 한다고 했을때 보통 와이파이로 노트북과 인터넷을 연결 할 것이다. 무선 공유기를 통해 IP를 할당받았고 그 정보는 다음과 같다.

컴퓨터가 할당받은 사설 IP를 확인해보니 172.30.1.36이다.

172.30.1.36은 Private Network에 속하는 약속된 Private IP(사설 IP) 범위대이다. 

Info

Private Network에서 사용 가능한 Private IP( 사설 IP)

10.0.0.0 ~ 10.255.255.255
172.16.0.0 ~ 172.31.255.255
192.168.0.0 ~ 192.168.255.255

카페에 있는 공유기에 연결된 모든 단말들은 Private IP(사설 IP)를 보유하게 된다.

그렇다면 인터넷을 사용할 때는 어떻게 되는 것일까?

인터넷은 공인 IP로만 연결되어 통신이 가능하다.

사설 IP를 Source Address로 유지한 채 인터넷으로 나아가는 것일까?

 

 

공인인터넷망과 내 컴퓨터 사이에는 내 컴퓨터에게 IP를 할당해주는 공유기가 있다.

그리고 공유기는 공인 IP를 보유하며 인터넷과 맞닿아있다.

 

Private IP(172.30.1.36)뿐인 내 컴퓨터가 외부 서비스(8.8.8.8)을 사용하고자 공유기로 나아가면, 

공유기는 Private IP(172.30.1.36)뿐인 내 컴퓨터의 IP를 공유기 자신의 공인 IP로 변환(Translation)하게 된다.

즉 공유기를 지나 외부 인터넷으로 나아갈 때에는 공유기의 공인 IP를 가지고 원하는 Destination Address로 향하는 것이다.

이것이 바로 NAT이라는 기술이다. (다양한 용도가 있지만 극히 일부를 설명한 것이다.)

 


그림을 통해 이해해보자.

공유기에 연결된 컴퓨터들은 각각의 사설 아이피를 부여받는다.
  예) 내 사설아이피 : 192.168.0.3


만일 우리가 위키피디아라는 사이트에 접속하고 싶으면, 컴퓨터는 Gateway address에 해당되는 IP 머신(공유기)에게 신호를 보낸다.

신호를 받은 공유기는 다음 순서에 따라 위키피디아에게 요청을 보낸다.

  1. 먼저 요청받은 내부ip를 기록한다. (192.168.0.4). 누가 요청했는지 알아야하니까.
  2. 요청한 컴퓨터 ip는 외부에서 접속할 수 없는 사설ip다. 따라서 사설ip를 공인ip로 변환한다.

이제, 공유기는 이 요청을 public ip address 로 위키피디아에게 요청을 하고 위키피디아는 그 요청을 처리한다.

그리고 다시 공인ip(59.6.66.238)로 보내고, 공유기에서 다시 사설ip로(192.168.0.4)로 보내서 통신을 완료한다.

 

즉, private ip 를 사용하고 있는 컴퓨터가 사설 바깥쪽에 있는 public ip에 해당되는 외부세계에 접속할 수 있게 된다.

이때 사용되는 기술이 바로 NAT이라고 보면 된다.

단, NAT가 호스트 간의 통신에 있어서 복잡성을 증가시킬 수 있으므로 네트워크 성능에 영향을 줄 수도 있다.

 

 


NAT Gateway(Network Address Translation Gateway) 개념

for 내부 => 외부

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 게이트웨이 실전 구축하기

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를 통해 공인 인터넷으로 나아가게 된다.

 

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

  1. Internet Gateway가 있는 Public Subnet에 NAT Gateway 생성하고 Elastic IP(공인 IP) 할당
  2. Private Subnet의 Routing table에 0.0.0.0/0에 대하여 NAT 게이트웨이(nat-id) 추가

이를 이미지로 표현하면 아래와 같다. 이제 Private Subnet에 있는 서비스들은 인터넷 통신이 가능하게 도었다.

Info

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

 


Bastion Host 개념

for 외부 => 내부

Bastion = Proxy, 외부에서 내부로 통신이 가능하며 내가 문지기로 쓸 놈

 

앞서 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를 구성하기 위한 구성 순서는 다음과 같다.

  1. VPC 및 Public/Private Subnet 구성
  2. Public EC2(Bastion Host) 인스턴스 생성
  3. Private EC2 인스턴스 생성
  4. 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에 대한 포스팅을 따로 정리하였다. 

정말 유용하고 편리한 툴이니 개인적으로 반드시 습득하길 권하는 바다.

 inpa.tistory.com
MobaXterm 리눅스에 Telnet, SSH 접속을 위해 Putty나 XShell을 깔고, FTP/SFTP접속을 위해 FileZilla를 깔고, 그 외 다양한 원격 접속용 프로그램을 복수개 설치하여 관리하면 많이 복잡해지고 번거로워 진다..
 inpa.tistory.com
EC2 외부 접속하기 [PuTTy] 가장 유명하고 많이 사용하는 리눅스(SSH) 접속 툴인 Putty를 이용해서 EC2 인스턴스에 접속하는 방법을 알아보자. 필요한 준비물은 Putty와 Puttygen 두 가지이다. Puttygen은 위

준비가 되었으면, 다음과 같이 설정해준다.

 

접속이 문제없이 되었다면, 이제 public 인스턴스에서 private 인스턴스에게 ping을 때려보도록 하겠다.

SHELL
$ ping <private 인스턴스 사설IP>Copy

Tip

ping이란 다른 호스트 (Host)에 IP 데이터그램이 정상적으로 도달했는지 여부를 검사하는 것을 의미한다. 
ping은 ICMP echo request 메세지를 전송하여 reply 메세지를 수신할 때 까지 대기한다.

 

이제 private 인스턴스로 ssh로 접속해보도록 하자.

Info

다시한번 말하지만 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으로 바꿔준다. (바꾸지 않으면 키페어의 퍼미션이 너무 공개되어 있다는 오류가 나타날 수 있기 때문이다.)

SHELL
$ chmod 600 my_private_keypair.pemCopy

 

그리고 ssh 명령어를 통해 private 인스턴스에 접속해준다.

SHELL
$ ssh -i my_private_keypair.pem ec2-user@<private 인스턴스 사설IP>Copy

정상적으로 구성된 경우 Bastion Host에서 Private EC2로 접속되어 터미널 상에서 마치 Private EC2로 직접 연결된 것 처럼 보이게 될 것이다.

Host PC -> Bastion Host -> Private EC2로 SSH 연결된 것이지만 터미널 상에서는 Private EC2의 Bash 출력되기 때문에 직접 연결한 것 처럼 Private Subnet의 EC2를 사용하면 된다.

이처럼 Bastion Host를 이용하면 Private Subnet의 인스턴스에 관리자가 접속함으로서 보안과 외부접속 두마리의 토끼를 잡는 식으로 구성이 가능하다.

 

 

 

출처::
1) https://inpa.tistory.com/entry/WEB-%F0%9F%8C%90-NAT-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
2) https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-VPC-%EA%B0%9C%EB%85%90-%EC%82%AC%EC%9A%A9-%EC%82%AC%EC%84%A4-IP-%ED%86%B5%EC%8B%A0%EB%A7%9D-NAT-Gateway-Bastion-Host?category=947440#vpc_%EC%82%AC%EC%84%A4%EB%A7%9D_%EC%99%B8%EB%B6%80_%ED%86%B5%EC%8B%A0