클라우드

AWS EC2 인스턴스를 이용해 NAT 구성하기

jeff_kim 2024. 10. 2. 16:15

저번에 VPC를 구성하고 퍼블릭, 프라이빗 서브넷을 구축한 후에 IGW(인터넷 게이트웨이)까지 연결을 했습니다. 

아직 테스트까진 안헀는데요!! 오늘은 테스트하고 NAT 게이트웨이를 일반적으로  AWS에서 제공하는 NAT 게이트웨이가 아닌 인스턴스를 이용하여 구성해보겠습니다.

 

이렇게 구성하는 이유는?? 바로 비용 효율적인 측면 때문인데요.

클라우드를 사용하면 일시적으로 빠르고 쉽게 사용할 수 있다는 장점이 있습니다. 하지만 단점으로는 지속적으로 사용할 시 관리가 되지 않는다면 비용 폭탄을 받게 될 수도 있다는 단점이 있죠....! 그래서 프리티어가 끝난 저 또한 비용에 대해서 매우 민감합니다...ㅋㅋㅋ 

 

VPC 구성만으로는 비용이 나오지 않습니다.

EC2 인스턴스를 이용하면 컴퓨팅 비용(t2.micro 제외)과 EBS 볼륨에 대해서만 비용을 부과하고,

NAT 게이트웨이...비용이 생각보다 쌥니다...!

 

그럼 보안 그룹부터 구성을 해보겠습니다.

 

NAT 인스턴스 구성만 보실 분들은 4. NAT 게이트웨이 부터 보시면 됩니다.

 

1. 보안 그룹

보안 그룹(Security Group)은 AWS에서 인스턴스에 대한 인바운드 아웃바운트 트래픽을 제어하는 가상의 방화벽입니다.

물론 보안 그룹도 기본적으로 하나 생성이 되는데요. 저는 따로 생성을 해주겠습니다.

일반적으로 리눅스를 다운받고 테스트하기 위해서 VMware Workstation를 사용하는데요 이럴때는 firewalld, iptabels, ufw 와 같은 방화벽에 의해서 지배를 받습니다. 물론 어떤걸 사용하냐에 따라 다르겠지만요.

하지만 AWS같은 경우는 인스턴스에서 방화벽 설정을 해줄 필요 없이 쉽게 콘솔에서 설정이 가능하다는 것입니다.

 

보안 그룹의 특징

a) 인스턴스 기준 적용 (1차 보안 계층)

b) 룰에 대한 허용 규칙만 적용

c) 아웃바운드 요청에 대한 응답 자동 허용

d) 등록된 모든 규칙을 평가하여 트래픽 허용

e) 특정 그룹을 지정시에만 인스턴스에 적용

 

말이 점점 길어지는데요... AWS Network ACL과도 비교하고 싶지만,,, 그것은 나중에 심도깊게 가고 오늘은 실습 위주로 진행 해보겠습니다.

 

1) "보안 그룹 생성"

보안 그룹을 생성하면 인스턴스를 만들때 바로 사용할 수 있습니다. 테스트 용도로만 사용할 예정이니 한개만 생성해서 퍼블릭, 프라이빗 구분없이 SSH, ICMP 만 열어서 사용을 하도록 하겠습니다.

 

 

2. 키 페어

AWS EC2 인스턴스를 생성하고 ssh 접근을 하기 위해서는 password 방식을 사용하지 않고 공개키 방식을 사용합니다.

물론, password 방식을 사용하게끔 설정할 수 있지만 보안적으로 좋지 못합니다.

공개키는 암호학적인 부분인데, 공개키 알고리즘은 공개키와 개인키 두 개의 키쌍을 이용하여 함호화, 키 분재, 인증을 하는 방식입니다.

쉽게 설명하면 개인키는 말 그대로 서버의 주인이 가지고 있어야하는 키 입니다. 공개 키는 서버에 접근할 수 있어야 하는 사람에게 제공하게 됩니다.

공개 키는 암호화에 사용되고 개인 키는 복호화에 사용하여 올바른 공개키를 가지고 있는 사람이 공개키를 가지고 인증을 하면 접근을 허용하게 해주는 것입니다.

 

간단하니 바로 실습 진행합니다.

 

1) "키 페어 생성"

키 페어를 생성하기 위해서는 이제 VPC가 아니라 EC2로 접속해야합니다!

키 페어 유형은 공개키 알고리즘을 선택하는 것, 키 파일 형식은 어떤 방식으로 접근을 하냐에 따라 방식이 다릅니다.

putty로 접근을 하는 경우에는 .ppk를 선택하시면 됩니다.

 

키를 생성하면 testKey.pem 파일이 다운 받아집니다. 이 키파일 잃어버리지 않게 조심하고 잘 챙겨야합니다.

삭제를 하거나 잃어버리면 인스턴스로 접근을 할 수 없게 되니 주의!! 또 주의!!! 하셔야합니다.

 

생성하는건 생각보다 간단하죠?

 

 

3. EC2

EC2는 AWS에서 인스턴스 또는 EC2 인스턴스라고 불리우는데요 쉽게 생각하시면 가상머신입니다. 서버를 구성할 때 이 인스턴스로 구성을 하게 되죠. 

 

지금 생성하는 인스턴스는 퍼블릭 서브넷에 패치하여 인터넷이 잘 되는지 테스트하기 위함입니다.

 

1)  "인스턴스 시작" - 퍼블릭 서브넷

인스턴스 이름은 멋있는 원하는 이름으로 지정해주시고 저는 OS를 ubuntu로 해주었습니다. 다른 리눅스가 편하신 분들은 그걸로 진행하시면 됩니다.!!

인스턴스 유형은 인스턴스에 할당되는 하드웨어 부분을 선택할 수 있는 것인데요. 당연히 서버의 성능이 좋아지면 가격도 올라가겠죠?? t2.micro는 프리티어가 사용 가능하니 선택해줍니다!

키 페어 꼭 선택해주시구요. 

다음은 중요한 네트워크 설정입니다. "편집"을 눌러서 창을 크게 키워주세요.

퍼블릭 서브넷, 그리고 인터넷이 되려면.. 퍼블릭 IP 즉 공인 IP가 있어야겠죠? 인터넷 게이트웨이가 있다고 한들 공인 IP가 없으면 인터넷 안됩니다! 

그리고 보안 그룹은 이전에 생성한 보안 그룹으로 설정해 줍니다. 다 하셨으면  우측에 "인스턴스 시작"하여 생성 해줍니다.

 

 

2)  인스턴스 접속

저는 mobaXterm을 자주 이용합니다.

Remote host에는 인스턴스의 공인 IP, 그리고 username에는 ubuntu를 넣으시면 됩니다. 만약 amazon linux를 사용하시는 분은 username을 ec2-user로 하시면 됩니다. 

그리고 중요한 PEM 키를 넣어줘야겠죠? "Use private key"를 체크하여 키 페어(.pem)키의 경로를 입력해줍니다.

"OK"를 누른 후에 이런 창이 뜨면 "Accept"를 눌러줍니다.

성공적으로 접근했죠?? 이제 구글의 dns 주소인 8.8.8.8로 핑을 쏴봅니다.

잘됩니다. 참 간단하죠?

 

동일한 방법으로 프라이빗 서브넷에도 인스턴스를 하나 생성해주겠습니다. 

 

3)  "인스턴스 시작" - 프라이빗 서브넷

이전과 동일한 작업이지만 네트워크 설정만 달라집니다.

퍼블릭 서브넷 인스턴스를 생성할 때는 퍼블릭 IP를 활성화 해줬지만, 프라이빗 서브넷은 퍼블릭 IP가 있으면 안됩니다!! 이게 있으면,,,왜 프라이빗..? 그쵸? 

다 똑같이 진행하지만 퍼블릭 IP만 비활성화 해줍니다.

 

근데 여기서 하나 문제!! 퍼블릭 IP가 없으면 어떻게 프라이빗 서브넷에 있는 인스턴스에 접근합니까??

 

답은 Bastion 인스턴스를 생성해 접근하면 됩니다. Bastion은 jump server, jump box, jump host 등등 으로 불리우는 데요. 프라이빗 서브넷의 인스턴스에 접근하기 위한 일종의 게이트웨이 입니다. 프록시 서버랑은 살짝 다른 개념이에요~

 

Bastion은 주로 내부 네트워크 보안 접근을 제공하기 위해 사용되며, 외부 사용자가 내부 서버에 직접 접속하는 것을 방지합니다. 내부 서버로 들어가기 위한 중간 다리라고 생각하심 됩니다.

 

프록시 서버는 클라이언트와 서버 간의 통신을 중계하는 것입니다. 사용자의 요청을 대신하여 외부 서버와 통신하는 것이므로 Bastion과 차이가 있습니다~

 

4)  내부 인스턴스 접근

점프서버를 따로 생성해야 할까요..?? 아니요~ 이전에 테스트 용으로 만들어 놓은 인스턴스는 이제 Bastion 입니다...ㅋㅋ

ssh를 이용하여 접근해보죠 근데 그렇게 하기 위해서는 이 인스턴스에도 공개 키가 있어야겠죠?? 파일을 옮겨와 사용해보겠습니다. 

mobaXterm의 가장 유용한 기능 파일을 드래그만 하면 바로 가져올 수 있습니다..!

다른 방법은 그냥 testKey.pem 파일을 노트패드로 열어 복사해와도 됩니다!

 

이제 접근해보겠습니다. 그전에 내부 서버의 사설 IP를 확인해야겠죠?

인스턴스를 선택하면 아래 프라이빗 주소가 나옵니다.

testKey.pem 파일을 chmod를 이용해 600(-rw-------)으로 변경해주고 ssh 를 통해 접근해주니 성공적으로 접근했죠?

 

외부 핑테스트 까지 해보겠습니다.

네 트래픽이 나가지 않죠? 정상입니다. 오해하지 마세요!!

 

NAT 게이트웨이는 프라이빗 서브넷에 있는 인스턴스가 외부와 통신할 수 있게끔 도와줍니다. 하지만 따로 생성을 하지 않았죠??

 

이제 해보겠습니다.

 

 

 

4. NAT 게이트웨이

NAT게이트웨이는 퍼블릭 서브넷에 존재해야합니다. 프라이빗 서브넷의 인스턴스가 외부로 통신하게끔 도와주려면 NAT 게이트웨이도 공인 IP가 할당되어 있어야 하기 때문이죠

 

하지만 비용이 너무 비쌉니다. 그 해결법 중 하나가 인스턴스를 하나 생성해 마스커레이드 설정하여 NAT로 사용하는 것입니다.

리눅스에는 iptalbes나 netfilter와 같은 유용한 네트워크 기능이 많고 커널단에서 NAT와 같은 기능이 지원합니다. 많은 트래픽을 보내야한다면 그냥 NAT 게이트웨이를 쓰는 편이 더 좋겠지만 테스트용 서버일 경우에는 안정성이나 성능이 크게 상관없기 때문에, 진행해보겠습니다.

 

하지만 약간 손이 가는 작업이라면, 고가용성을 위해서 MultiAZ를 사용하는 경우에는 각 AZ 마다 생성을 해줘야한다는 점!!

 

여기서부터는 좀 복잡합니다!

https://docs.aws.amazon.com/ko_kr/vpc/latest/userguide/work-with-nat-instances.html

 

프라이빗 리소스가 VPC 외부에서 통신할 수 있도록 지원 - Amazon Virtual Private Cloud

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

AWS에서 제공하는 docs 입니다. 참고하셔서 작업하시면 됩니다.

 

저는 이전에 프라이빗은 2c 퍼블릭은 2a에 만들어서 얼릉 2c에 퍼블릭 서브넷을 만들어 보겠습니다.

빠르게 2c에 퍼블릭 서브넷을 생성하고 라우팅 테이블에 추가하였고, 인스턴스까지 생성했습니다.

보안 그룹도 NAT 인스턴스에 맞게 설정해줬습니다. 위 가이드 docs 사이트에 AWS에서 권장하는 보안그룹 설정이 있으니 참고하시면 됩니다.

 

 

1)  서버 사전 작업

# set root passwd
sudo passwd

# update && upgrade 
sudo apt update && sudo apt upgrade -y

# install net-tools
sudo apt install -y net-tools

업그레이드 되면 재부팅 해주시면 됩니다!!

# reboot
sudo reboot

 

 

2)  IP Forwading과 마스커레이딩 활성화

# enable ip forwarding
sudo sysctl -w net.ipv4.ip_forward=1
또는
/proc/sys/net/ipv4/ip_forward 값을 1로 변경

하지만 둘다 영구적으로 활성화되는 것이 저장되지 않는다.

# 영구 활성화
sudo vi /etc/sysctl.conf

ip_forward 부분 주석 해제

# 구성 파일 적용
sudo sysctl -p

# 마스커레이딩 활성화할 인터페이스 확인
netstat -i

# 마스커레이딩 활성화
sudo /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 저장
sudo /sbin/iptables-save

 

3)  소스/대상 확인 변경

라우터에는 Reverse Path Forwarding이라는 개념이 있는데, 기본적으로 쓸데없는 패킷이 라우터간에 왔다 갔다 돌아나오는 것을 방지하도록 설정되어 있습니다.

인스턴스로 NAT를 사용하려면 이것을 비활성화 해야합니다. 그렇지 않으면 다 잘 되있어도 패킷이 오지 않습니다.!

이렇게 설정 후 저장 해줍니다.

 

4)  라우팅 테이블 편집

위 작업까지 다 했다면 라우팅 테이블 편집을 하면 됩니다.

프라이빗 라우팅 테이블을 선택해주고 라우팅 편집을 해야합니다.

모든 IP를 대상으로 nat 인스턴스를 선택해줍니다. -> 변경사항 저장

 

 

5)  테스트

이제 테스트만 남았습니다. 위 사진은 프라이빗 서브넷에 있는 10.0.10.10의 IP를 가지고 있는 인스턴스입니다. 물론 이전에는 통신이 안됬는데요. 설정을 하고나니 이제 통신이 되는 모습입니다.

 

이렇게 인스턴스를 통해서 NAT 게이트웨이를 구성했습니다. AWS docs에 자세한 설명도 있으니 잘 참고해서 직접 실습해보시면 도움 많이 될 것 같습니다.