본문 바로가기
AWS

NAT-GW

by YUNZEE 2025. 2. 21.
728x90

📌 NAT(Network Address Translation) Gateway

프라이빗 서브넷(Private Subnet)에 있는 EC2 인스턴스들이 인터넷과 통신할 수 있도록 도와주는 AWS 서비스

❌ 하지만 외부에서 프라이빗 서브넷의 EC2 인스턴스로 직접 접속할 수는 없음
✅ 즉, 프라이빗 서브넷의 인스턴스가 인터넷에 요청을 보낼 수 있지만, 외부에서 직접 접근은 불가능함.

 

📌왜 NAT-GW가 필요할까?

프라이빗 서브넷에 있는 EC2 인스턴스는 퍼블릭 IP가 없어서 인터넷에 직접 접근할 수 없음
하지만 보안상의 이유로 웹 서버처럼 외부에서 접근할 필요가 없는 서버(예: 데이터베이스, 내부 API 서버 등)는 프라이빗 서브넷에 배치하는 게 좋아.

💡 문제

  • 프라이빗 서브넷의 서버가 OS 업데이트를 해야 함.
  • 외부 API나 S3 같은 AWS 서비스에 요청을 보내야 함.
  • 하지만 인터넷에 직접 나갈 수 없음.

💡 해결 방법 → NAT Gateway 사용

  • NAT Gateway를 퍼블릭 서브넷에 배치함.
  • 프라이빗 서브넷의 인스턴스가 NAT Gateway를 통해 인터넷과 통신할 수 있음.

✅ 반드시 주의할점은 이 NAT-GW는 퍼블릭서브넷에 존재한다는점

과금이 많이 되니까 주의!! (시간당 기본요금 + 트래픽요금 + EIP요금)

📌 IGW랑 NAT-GW의 차이

# 사실 VPC에 존재하는 자원들이 통신이 되냐 안되냐의 차이는 기본적으로 공인아이피가 있냐 없냐로 볼 수 있음. 공인아이피를 달고있는 서버가 IGW를 next-hop으로 라우팅이 되어있다면(=퍼블릭서브넷에 있다면) 인바운드, 아웃바운드 다 된다. 마찬가지로 프라이빗 서브넷에 존재하는 서버가 외부로 통신이 안되는 이유는 공인아이피도 없고 라우팅도 안되어있기때문이다. 따라서 아웃바운드라도 가능하게 하기위해서 NAT-GW에 EIP를 붙여서 PAT를 해준다고 생각하면 좋다.

 

- VPC에 존재하는 자원들이 통신이 되냐 안되냐의 차이는 기본적으로 공인아이피가 있냐 없냐로 나뉨.

- 공인아이피를 달고 있는 서버가 IGW를 next-hop으로 라우팅이 되어있다면(= 퍼블릭서브넷에 있다면) 인바운드, 아웃바운드 다 됨. 마찬가지로 프라이빗 서브넷에 존재하는 서버가 외부로 통신이 안되는 이유는 공인아이피도 없고 라우팅도 안되어 있기 때문임. 따라서 아웃바운드라도 가능하게 하기위해서 NAT-GW에 *EIP를 붙여서 PAT을 해준다고 생각하면 좋음 

 

*EIP란?

- AWS에서 제공하는 고정 퍼블릭 IP 주소

- 보통 EC2 인스턴스를 시작하면 동적 퍼블릭 IP가 할당되는데, EC2를 재부팅하면 IP 주소가 변경됩니다. 하지만, EIP를 사용하면 EC2가 재부팅되어도 동일한 IP 주소를 유지할 수 있음

 

❌ 반드시 주의할점❌

NAT-GW는 퍼블릭서브넷에 존재한다는점이다.

과금이 많이 되니까 주의하세요.(시간당기본요금 + 트래픽요금 + EIP요금)

 

 

 

 

 

 

 

실습)
pri-srv를 프라이빗 서브넷에 하나 만들고, bastion을 퍼블릭 서브넷에 하나 만든 다음 scp로 bastion 서버에 pem파일을 전송해보세요.
전송한 pem파일로 pri-srv에 접근해서, 패키지(nginx)가 다운로드되는지 확인해보세요.
이후 외부에서는 웹 접속이 안되지만, bastion에선 curl로 통신이 되는걸 확인해보세요.

정리)
*scp: ssh를 이용하여 파일을 원격 서버와 안전하게 전송하는 프로토콜
*pem: 암호화된 키와 인증서를 저장하는 파일 형식

bastion 생성 

얘는 전에 만든 거 활용

pri-srv 생성

 

관리자 명령 프롬프트 들어가서 확인

 

root@ip-10-10-1-131:/home/ubuntu# chmod 400 aws8.pem

root@ip-10-10-1-131:/home/ubuntu# ssh -i aws8.pem ubuntu@10.10.2.173

# 생성한 서버로 ssh 접속

 

root@ip-10-10-2-173:~# apt install -y nginx

# 웹서버 설치. NAT-GW가 구성되어있기때문에 아웃바운드 트래픽이 가능하다. 

 

 

# bastion에서도 접속이 잘 됨

실습)
172.16.0.0 /16 대역에 tom-vpc를 생성하여web-was-db 3 tier를 구성해보세요.
각 티어별로 서브넷을 생성하고 최소 두개의 가용영역(a,c)을 갖게 하세요.
web서버는 퍼블릭 서브넷, was-db는 프라이빗 서브넷. was는 톰캣, db는 rds를 쓰세요.
web은 tom-web.pem was는 tom-was.pem 키페어를 쓰도록하세요.
was 인스턴스는 web대역을 허용, db는 was 대역에서의 접속만 허용.
RDS의 포트는 33306으로 하세요.

정리)
public
tom-vpc 생성

pri
web, was 인스턴스 생성
db는 RDS
was는 톰캣, db는 rds 생성

key 
web은 tom-web.pem 생성
was는 tom-was.pem 생성

allow
was 인스턴스는 web대역을 허용
db는 was 대역에서의 접속만 허용

 

tom-vpc 생성

IGW(Internet GateWay) - 외부랑 소통 가능하게 만들어주기

퍼블릭 서브넷 생성 - web

web- sub1

 

was- sub2

(캡처 못함)

 

- 프라이빗도 해주기

db- sub3

db 대역도 그렇게 만들어주기

 

라우팅 테이블

- tom-vpc-pub-sub1 연결해주기

- 서브넷을 만들면 이 라우팅테이블이 자동으로 선택되니까(비명시적,따로 라우팅테이블을 지정안하면) 이 기본라우팅테이블을 프라이빗서브넷을 위한 라우팅테이블로 이름을 붙여주자.

 

다른 가용 영역에 라우팅 연결

- 프라이빗 공간에 was랑 db 연결

 

web 인스턴스 생성

- 키 페어 생성

was 인스턴스

- web을 허용해줘야되기 때문에 사용자지정 a서브넷을 허용해줌 

 

근데 80으로 설정해줘야됨 잘못 설정함. 수정해주고 싶을 때는 보안 그룹 클릭

RDS 포트 만들기

- DB 서브넷 그룹 생성 부터

- 데이터베이스

 

was인스턴스에 nat-gw해주기

tam-web 접속

- red hat은 ec2-user

 

tom-web

[ec2-user@ip-172-16-1-203 ~]$ sudo -i
[root@ip-172-16-1-203 ~]# yum install -y httpd

[root@ip-172-16-1-203 ~]# systemctl restart httpd
[root@ip-172-16-1-203 ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@ip-172-16-1-203 ~]# echo 'was-db connection success' > /var/www/html/index.html
[root@ip-172-16-1-203 ~]# curl 3.34.196.182
was-db connection success

 

[root@ip-172-16-1-203 ~]# vi tom-was.pem
[root@ip-172-16-1-203 ~]# chmod 600 tom-was.pem
[root@ip-172-16-1-203 ~]# ssh ubuntu@172.16.4.115 -i tom-was.pem

# was 프라이빗 ip

 

ubuntu@ip-172-16-4-115:~$ 잘 바뀐 걸 확인할 수 있음

ubuntu@ip-172-16-4-115:~$ sudo -i

root@ip-172-16-4-115:~# apt update
root@ip-172-16-4-115:~# apt install -y openjdk-11-jdk

root@ip-172-16-4-115:~# apt install -y unzip

root@ip-172-16-4-115:~# unzip apache-tomcat-10.1.35.zip > /dev/null
root@ip-172-16-4-115:~# mv apache-tomcat-10.1.35/ tomcat
root@ip-172-16-4-115:~# cd tomcat/
root@ip-172-16-4-115:~/tomcat# chmod 777 -R /root/tomcat
root@ip-172-16-4-115:~/tomcat# sh ./bin/startup.sh

728x90