[Practice] VPC, Public/Private 서브넷, NAT (1)

2020. 9. 10. 11:51AWS/Practice

1. 목적

NAT 인스턴스를 Bastion 호스트 서버로 Private 서브넷에 존재하는 인스턴스에 접근하도록 한다. 어떻게 구성하느냐에 따라 외부에서 Private 서브넷에 존재하는 인스턴스의 접근여부가 달라질 수 있지만, 일반적으로는 접근이 불가능하다. NAT 게이트웨이로는 포트 포워딩이 불가하기에 외부에서 접근이 불가능하지만, NAT 인스턴스의 경우 포트 포워딩 설정이 가능하기에 외부에서 접근하도록 설정 할 수 있다.

 

해당 글에서는 AWS 문서의 내용대로 NAT 인스턴스를 Bastion 호스트 서버로 구성하고, 이를 통해 Private 서브넷의 인스턴스 접근과 해당 인스턴스에서의 인터넷 연결을 목적으로 작성되어있다.

목적

 

 

 

2. VPC

1) VPC 생성

VPC의 IP 대역대는 10.0.0.0/16으로 설정한다.

VPC 생성

2) 서브넷 생성

Public, Private 서브넷을 생성하되, 각 서브넷의 CIDR 블록이 다르게 설정한다. (Public의 경우 10.0.0.0/24, Private 10.0.1.0/24)

서브넷 생성

3) 인터넷 게이트웨이 생성 및 연결

VPC에서 외부와 통신이 가능하도록 인터넷 게이트웨이를 생성해주고 생성한 VPC에 연결해준다.

인터넷 게이트웨이 생성 및 연결

4) 라우팅 테이블 생성 및 설정

라우팅 테이블은 Public, Private 서브넷용 두 개를 생성하고, 각각의 서브넷과 연결해준다. Public 서브넷용 라우팅 테이블의 라우팅 설정에는 모르는 주소에 대한 트래픽(0.0.0.0/0)을 인터넷 게이트웨이로 향하도록 설정을 한다. 이렇게 설정할 경우 Public 서브넷에 생성된 모든 인스턴스는 외부의 인터넷과 통신이 가능해진다.

 

Private 서브넷용 라우팅 테이블의 모르는 주소에 대한 트래픽(0.0.0.0/0) 라우팅 설정은 이 후에 생성될 NAT 인스턴스로 향하도록 설정해주어야 한다. 해당 단계는 NAT 인스턴스가 생성된 이후에 설정해주도록 한다. (Private 서브넷에서 인터넷과 통신하기 위해서는 NAT 인스턴스를 반드시 거쳐야 하기 때문이다.)

라우팅 테이블 생성 및 설정

 

 

 

3. NAT

1) NAT 보안 그룹 생성

NAT 인스턴스를 생성할 때 보안 그룹으로 사용될 NAT 전용 보안 그룹을 생성해준다. NAT 인스턴스가 Private 서브넷에 있는 인스턴스로부터의 인터넷 바인딩 트래픽뿐 아니라, 네트워크로부터 SSH 트래픽도 수신할 수 있도록 한다. NAT 인스턴스는 인터넷으로 트래픽으로 전송할 수 있기에 Private 서브넷의 인스턴스가 소프트웨어 업데이트를 받을 수 있다.

인바운드
프로토콜 포트 대상 설명
HTTP 80 [Private IP 대역] Private 서브넷의 서버로부터의 인바운드 HTTP/HTTPS 트래픽 허용
HTTPS
443 [Private IP 대역]
SSH 22 내 주소  홈 네트워크에서 NAT 인스턴스에 대한 인바운드 SSH 엑세스 허용
아웃바운드
프로토콜 포트 대상 설명
HTTP 80 0.0.0.0/0 인터넷에 대한 아웃바운드 HTTP/HTTPS 액세스 허용
HTTPS
443 0.0.0.0/0

NAT 보안 그룹 생성

2) NAT 인스턴스 생성

NAT 인스턴스는 반드시 Public 서브넷에 생성이 되어야한다.

NAT 인스턴스 생성

3) 원본/대상 확인 비활성화

각각의 EC2 인스턴스는 기본적으로 원본/대상 확인을 수행합니다. 이는 인스턴스가 보내거나 받는 트래픽의 원본 또는 대상이어야 한다는 의미입니다. 하지만, NAT 인스턴스는 원본 또는 대상이 그 자신이 아닐 때 트래픽을 보내고 받을 수 있어야 합니다. 따라서 NAT 인스턴스에서 원본/대상 확인을 비활성화해야 합니다.

원본/대상 확인 비활성화


비활성화를 해도 동작하지 않는 경우에는 연결된 네트워크 인터페이스도 비활성화가 되어있는지 확인해준다.

네트워크 인터페이스 설정

4) 탄력적 IP 할당 및 연결

탄력적 IP를 할당받아 고정 IP로 사용할 수 있도록 연결을 해준다.

탄력적 IP 할당 및 연결

5) 라우팅 설정

이전에 설정해주지 못한 Private 서브넷의 라우팅 테이블 설정을 마저 진행해준다.

라우팅 설정

6) NAT 보안 그룹 수정

NAT 인스턴스를 Bastion 서버로 사용하여 Private 서브넷의 인스턴스가 NAT 인스턴스를 통해 인터넷에 액세스할 수 있는지 확인하는 테스트를 수행하기 위해서는 인바운드 및 아웃바운드 ICMP 트래픽과 아웃바운드 SSH 트래픽을 허용하도록 수정한다.

NAT 보안 그룹 수정

 

 

 

4. Private 서브넷 인스턴스

1) Private 서브넷 인스턴스 생성

생성시 Private 서브넷으로 네트워크를 설정하고, Public IP 자동 할당 항목이 비활성화 되어야 한다. 키 페어는 NAT 인스턴스 생성할 때의 기존 키 페어를 사용하도록 한다.

Private 서브넷 인스턴스 생성

2) 보안 그룹 수정

NAT 인스턴스에서 SSH 연결을 할 수 있도록 보안 그룹을 수정해주어야 한다.

보안 그룹 수정

 

 

 

5. Private 서브넷 인스턴스 접속

SSH 에이전트를 이용하여 키를 Bastion 호스트 서버에 전달하고, 전달받은 키를 통해 Bastion 호스트에서 Private 서브넷의 인스턴스에 접근한다. 대부분의 문서나 글에서는 해당 내용까지만 기술되어 있다. 하지만 여기까지 진행을 하더라도 Private 서브넷의 인스턴스에서 인터넷으로 트래픽(ping 8.8.8.8)이 전달 되지 않기에, NAT인스턴스에 추가로 구성해주어야 한다.

// 권한 수정
chmod 400 [키 파일(.pem)]
// SSH 키 추가
ssh-add [키 파일(.pem)]

// SSH 키 전달
ssh -A ec2-user@[배스천 호스트 혹은 NAT 인스턴스 Public 주소]

// 배스천 호스트 혹은 NAT 인스턴스에서 Private 서브넷 인스턴스 접속
ssh ec2-user@[Private 서브넷 인스턴스 Private 주소]
// SSH 키 확인
ssh-add -l

// 모든 SSH 키 삭제
ssh-add -D

Private 서브넷 인스턴스 접속

 

 

 

6. NAT 추가 설정, 수정 사항

1) 라우팅 테이블

Private 서브넷 라우팅 테이블을 따로 생성하였지만 AWS의 문서에 따르면, VPC의 Private 서브넷은 사용자 지정 라우팅 테이블과 연결되지 않으므로 기본 라우팅 테이블을 사용한다고 한다. 따라서 문서대로 기존에 생성한 Private 서브넷용 라우팅 테이블 설정을 기본 라우팅 테이블에 적용하도록 한다. (기본 라우팅 테이블은 '기본' 항목이 '예'로 되어 있다.)

라우팅 테이블

2) 포워딩, 매스커레이딩 설정

NAT 인스턴스에서 패킷 포워과 매스커레이딩을 설정해주어야 Private 서브넷 인스턴스에서 인터넷으로 통신이 가능해진다.

// 포워딩 설정
sudo sysctl net.ipv4.ip_forward=1

// 매스커레이딩
sudo iptables -t nat -A POSTROUTING -o eth0 -s [Private 서브넷 IP 대역] -j MASQUERADE

// iptable 규칙 확인
sudo iptables -t nat -v -L POSTROUTING -n --line-number

 

포워딩, 매스커레이딩 설정

3) 보안 그룹

최종적으로 구현한 NAT 보안 그룹과 Private 서브넷 인스턴스 보안 그룹이다.

보안 그룹

 

 

 

7. 참고사항

1) Amazon NAT AMI

해당 글에서는 프리티어 기준으로 가장 많이 사용하는 AMI를 통해 NAT 인스턴스를 구성하였지만, Amazon은 NAT 인스턴스로 작동하도록 구성된 Amazon Linux AMI를 제공한다. 제공되는 'amzn-ami-vpc-nat' 문자열이 포함된 AMI에는 NAT 설정이 구성되어있다. '/etc/sysctl.d/10-nat-settings.conf'에서 IPv4 전달을 사용하며 ICMP 리다이렉션은 사용하지 않고 시작 시 '/usr/sbin/configure-pat.sh'에 위치한 스크립트가 실행되며 iptables IP 매스커레이딩이 구성되어있다.

 

이미 NAT 인스턴스가 있는 경우 주기적으로 보안 업데이트를 적용해주어야 한다.

sudo yum update --security

2) Bastion 호스트, SSH 에이전트

동일한 vpc 내의 인스턴스는 Private IP 주소를 통해 서로 연결할 수 있다. 따라서 Public 서브넷의 인스턴스에서 Private 서브넷의 인스턴스에 연결할 수 있다. 하지만 이 과정에서, 배스천 호스트에게 개인 키를 보안상 노출시켜서는 안된다. 그래서 사용하는 방식은 SSH 에이전트 전달을 사용하는 것이다. 사용자가 Bastion에 개인키를 저장하지 않고도 Bastion에서 다른 인스턴스로 연결할 있다. SSH 에이전트는 사용자의 id 키와 해당 암호를 추적하는 프로그램이다.


[참고] docs.aws.amazon.com/ko_kr/vpc/latest/userguide/VPC_NAT_Instance.html

[참고] medium.com/@labcloud/nat-instance-%EC%82%AC%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0-b026d3c53ee7

[참고] medium.com/@rakeshkanagaraj1990/aws-nat-instance-port-forwarding-475fbcf2585f

[참고] medium.com/@rakeshkanagaraj1990/aws-nat-instance-bb0911ba19d5

728x90

'AWS > Practice' 카테고리의 다른 글

[Practice] ElastiCache  (0) 2020.10.15
[Practice] VPC, Public/Private 서브넷, NAT (2)  (0) 2020.09.10
[Practice] Practitioner Lightsail  (0) 2020.09.06
[Practice] Practitioner IAM  (0) 2020.09.05