💡 NAT 게이트웨이의 역할은?
NAT는 Network Address Transaction의 약자다.
Private 서버가 가진 IP는 사설 IP다. (ex. 10.0.1.5)
채점 서버를 Private 서버에 두었는데 초기 세팅을 위해 Docker설치와 파이썬등을 설치하려면 공인 IP가 있어야한다.
그래서 공인 IP를 가진 NAT로 패킷 헤더의 주소를 갈아 끼워줘야 외부와 통신이 가능해지는 것이다.
💡 AWS NAT Gateway를 안쓰고 EC2로 만든 이유
처음에는 NAT Gateway를 생성해줬었는데 NAT Gateway는 시간당 요금으로 과금이 된다.
한달 사용 비용이 약 43달러나 된다.
물론 NAT Gateway를 사용하는 것이 관리적인 측면에서 더 편리하겠지만, 비용 절감을 위해서 EC2로 만들어줬다.
1. EC2 인스턴스 생성하기
EC2 대시보드에 진입 > 인스턴스 시작 버튼 클릭

이름은 알아보기 쉽게 프로젝트명-nat-instance로 작명해줬다.

키페어가 없기 때문에 새로운 키페어를 생성해준다.

프로젝트를 위해 만들어둔 vpc를 선택한다.
public 서브넷을 선택한다.
인바운드 보안 그룹 규칙에는 2개의 규칙을 만든다.
SSH는 관리자 접속용 보안규칙이고 모든 트래픽을 허용하되 10.0.0.0/16으로 지정하는 것은 내부 VPC 통신만 허용한다는 의미다.
(캡쳐본에는 보안그룹 이름이 sg로 시작하는데 이렇게 작성하니 인스턴스 생성이 안됐다. sg를 뒤로 보내주거나 다른 단어를 써주자.)

NAT 인스턴스는 공유기 역할만 하기 때문에 8GB 그대로 둬도 충분하다.
이제 인스턴스 시작 버튼을 누르면 끝!
2.EC2 - NAT 인스턴스 설정
1) NAT 인스턴스 네트워킹 설정 변경하기


EC2는 기본적으로 수취인이 내가 아닌 패킷은 보안상 무조건 버리도록 되어있다.
그런데 NAT 인스턴스는 수취인이 내가 아닌 패킷을 대신 전달해줘야하는 EC2 인스턴스다.
그래서 '소스/대상 확인'을 중지해준다.
프라이빗 EC2가 NAT를 통해 외부와 통신하는 것과 퍼블릭 EC2가 외부와 통신하는 것을 비교해보자.
✅프라이빗 EC2가 NAT 인스턴스를 통해 외부와 통신하는 과정

프라이빗 EC2는 공인 IP가 없기때문에 외부와 통신을 할 수 없다.
그래서 NAT 인스턴스의 공인IP를 빌려서 통신을 한다.
✅퍼블릭 EC2가 외부와 통신하는 과정

퍼블릭 EC2는 공인IP를 가지고 있다. 그래서 외부와 바로 통신을 할 수 있다.
2) 리눅스 내부 IP 포워딩 설정
리눅스는 기본적으로 패킷의 목적지 IP가 내 IP랑 다르면 패킷을 폐기하도록 설정되어있다.
그래서 NAT 인스턴스가 라우터의 역할을 할 수 있도록 내부 IP 포워딩 설정을 해줘야한다.
왜냐하면, NAT 인스턴스는 프라이빗 EC2의 요청을 대신 처리하려는 목적으로 만들었기때문이다.
내부 IP 포워딩 설정을 해주려면 NAT EC2 에 SSH로 접속을 해야한다.
그 전에 시크릿키 접근권한을 변경해줘야한다.
✅시크릿키 접근권한 변경
리눅스는 터미널에 명령어 한줄만 입력해주면 되지만 윈도우는 파일 속성으로 들어가서 해줘야한다.
sudo chmod 400 시크릿키파일명
내 PC는 윈도우라서 파일탐색기로 들어가서 설정해줬다.

NAT EC2를 만들때 선택했던 pem키 파일 우클릭 → 속성 → 보안탭 → 고급 버튼 클릭
→ 상속 사용 안함 클릭 → "이 개체에서 상속된 사용 권한을 모두 제거합니다" 선택
→ 보안탭에서 편집 버튼 클릭 → 추가 버튼 클릭 → 입력창에 윈도우 계정명 입력 → 이름 확인 → 확인
→ 권한에서 "읽기 및 실행", "읽기" 체크 → 모두 확인 누르고 닫기
이제 이렇게 pem키의 권한을 변경해주면 ssh로 접속할 수 있다.
✅ssh 접속
NAT EC2의 퍼블릭IP를 확인한다.
그리고 아래 명령어를 터미널에 입력한다.
ssh -i 키파일상대경로/시크릿키파일명 ec2사용자명@퍼블릭IP

접속에 성공하면 이렇게 뜬다.
✅네트워크 인터페이스 이름 확인
ip addr
lo 말고 eth0 또는 ens5와 같은 것이 인터페이스 이름이다.
✅IP 포워딩 설정
# 1. 루트 권한 획득
sudo -i
# 2. IP 포워딩 활성화
sysctl -w net.ipv4.ip_forward=1
# 3. 재부팅 후에도 설정 유지되도록 파일에 기록
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 4. iptables 서비스 설치
yum install -y iptables-services
# 5. NAT 설정 (Masquerading)
iptables -t nat -A POSTROUTING -o 인터페이스이름 -j MASQUERADE
# 6. 현재 iptables 규칙 저장 (재부팅 시 날아가지 않도록함)
service iptables save
# 7. iptables 서비스 시작 및 활성화
systemctl enable iptables
systemctl start iptables
✅설정 적용됐는지 확인
# 포워딩 설정 확인 (1이 나와야 함)
cat /proc/sys/net/ipv4/ip_forward
# iptables 규칙 확인 (MASQUERADE 규칙이 보여야 함)
iptables -t nat -L -v
이렇게 하면 EC2 IP 포워딩 설정 끝!
3) Private Subnet에서 NAT 쓰게하기
IP 포워딩 설정을 했으면 이제 프라이빗 EC2가 NAT EC2를 쓸 수 있도록 해줘야한다.
NAT EC2의 존재이유를 잊으면 안된다!!
EC2 대시보드로 이동 > 프라이빗 EC2의 인스턴스 ID 클릭 > 인스턴스 요약에 있는 "서브넷 ID" 클릭

서브넷 ID를 클릭하면 VPC 대시보드로 이동하게 된다.
가로 스크롤을 오른쪽으로 쭉 땡겨서 라우팅 테이블 ID를 확인한다.
VPC 대시보드 > 왼쪽 메뉴 라우팅 테이블 클릭 > 확인했던 라우팅 테이블 ID 클릭
> 라우팅 편집 클릭

인터넷으로 가는 모든 트래픽을 허용하기 위해
대상에 0.0.0.0/0 입력 > 타겟으로 "인스턴스"선택 > NAT EC2 인스턴스를 클릭 > 변경사항 저장
4) 프라이빗 EC2에서 인터넷 되는지 확인하기
프라이빗 EC2로 접속해서 curl 명령어를 날려보면 된다.
그런데, 프라이빗 EC2는 내 로컬 PC에서 바로 접속이 안되기 때문에 NAT 서버를 중간다리로 이용해야된다.
ssh 접속을 할 때, pem키를 사용했었다.
pem키는 로컬에 있고 NAT 서버에는 pem키가 없다.
그렇다고 NAT 서버에 pem키를 넣어두면 EC2가 뚫리는 순간 키까지 털릴 수 있기때문에 보안상 위험하다.
SSH 에이전트에 pem키를 잠시 등록해서 테스트만 해보자.
PowerShell을 관리자 권한으로 실행한다.
#SSH 에이전트 서비스 켜기
Set-Service ssh-agent -StartupType Manual
Start-Service ssh-agent
#키등록하기 (시간제한 3600초)
ssh-add -t 3600 ./키파일명
#키확인하기
ssh-add -l
#키삭제하기
ssh-add -D
위 명령어 대로 SSH 에이전트 서비스를 켜고 시간제한을 걸어서 키를 등록한다.
ProxyJump로 프라이빗EC2에 접속한다.
ssh -J [NAT EC2사용자명]@[NAT EC2 퍼블릭IPv4주소] [프라이빗EC2 사용자명]@[프라이빗EC2 IPv4주소]
Are you sure you want to continue connecting (yes/no/[fingerprint])?
이렇게 뜨면 yes를 입력하고 엔터를 누르면 접속 완료!
# 네이버 웹사이트 헤더만 가져오기
curl -I https://www.naver.com

HTTP 200코드가 떴고 헤더 정보를 주르륵 가져오는데에 성공했다!
마지막으로 exit 명령어를 쳐서 로컬PC로 돌아오고 SSH 에이전트에 등록한 키를 삭제해주자 ssh-add -l 명령어로 키가 없어진 것을 최종확인하면 진짜 끝이다!
수동으로 NAT Gateway 만들기.. 온갖 시행착오 끝에 드디어 성공했다.
다음에 또 EC2로 NAT 서버를 만들게 되면 이번에 했던 것보단 잘 해낼 수 있을 것 같다.
'Cloud' 카테고리의 다른 글
| [AWS] RDS & ElastiCache 데이터 저장소 만들기 - 3편 (0) | 2025.12.29 |
|---|---|
| [AWS] RDS & ElastiCache 데이터 저장소 만들기 - 2편 (0) | 2025.12.29 |
| [AWS] RDS & ElastiCache 데이터 저장소 만들기 - 1편 (0) | 2025.12.29 |
| [AWS] VPC 네트워크 생성 실습 - 가상의 데이터센터 만들기 (0) | 2025.12.26 |
| 네이버 클라우드 플랫폼(NCP) (1) 서버 생성하기 - CI/CD 파이프라인 (0) | 2025.08.18 |