글의 개요
- Why Nat Instance (Instead of Nat gateway) (1부)
- AWS상에서 제공하는 Nat Instance AMI 이용 하는 방법 (1부)
- Ip-tables를 이용한 Nat Instance 직접 구성 (2부)
1부 포스팅에서는 AWS Community에서 제공되는 Nat Instance AMI를 이용해서 Nat Instance를 구축해보는 작업을 했다. 하지만, 해당 AMI의 서비스가 종료된 OS버전 등의 이슈로 유지 관리하기가 힘들다는 단점이 있다. 따라서 이번 2부 포스팅에서는 AWS에서 직접 제공하는 최신 OS상에서 IP Tabels를 조작해 직접 Nat Instnace를 구성해 볼 것이다.
필자가 구성한 네트워크 개략도는 이미 1부에서 집고 넘어 갔으므로, 상황만 간단히 설명하고 넘어가보고자 한다.
사설망(Private subnet)에 인터넷과 통신이 되게 하기 위해서는 Nat Gateway가 필요하다. (Public IP를 Private IP로 변환해줘야 사설망 내부에서 통신이 가능해지므로 : 공유기 역할) AWS에서 제공되는 서비스중 Nat gateway가 있긴 하지만, 가격 감축을 위해 Nat Instance를 직접 구축하게 되었고, 2부에서는 Nat Instance를 설정하지 않은 기본 운영체제(OS)에서 Nat 역할을 수행하도록 설정하는 방법을 설명하고 있다.
Nat Instnace (EC2) 구성 방법
1. 기본 EC2 생성
커뮤니티가 아닌 AWS에서 직접적으로 대문에 내세우고 있는 AMI(LTS 버전)를 사용한다. 필자는 Ubuntu를 좋아하는 편이라 Ubuntu(24.04LTS)로 선택했다. Nat Instance는 당연히 public subnet에 위치해야하며, 그 외의 routing table 예시는 모두 1부에 포스탱 해 놓았다.
2. EC2 OS iptables조작 (Nat Instance로 설정)
iptables란?
iptables는 Linux 운영체제에서 사용하는 강력한 방화벽 및 패킷 필터링 도구다. 이를 통해 네트워크 트래픽을 관리하고, 방화벽 역할을 수행하며, 네트워크 주소 변환(NAT)을 구현할 수 있다. 이번 포스팅에서는 방화벽용으로 사용하는 것이 아니라 네트워크 주소 변환 기능을 사용할 것이다.
위에서 만든 Nat Instance에 ssh로 접속한다. 그리고 다음과 같은 절차를 밟는다.
1. IP 포워딩 활성화
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Linux 서버에서 IP 포워딩을 활성화하는 과정이다. Nat Instance는 네트워크 트래픽을 자기 자신이 아니라 다른 곳으로 라우팅 해야 하므로, 패킷이 들어오고 나가는 경로를 허용해야 한다.
위의 Command Line을 간단히 분석해보자면, 다음과 같다.
- net.ipv4.ip_forward = 1은 Ip 포워딩 기능을 활성화하는 설정이다.
- /etc/sysctl.conf : sysctl.conf에 추가한 위의 포워딩 설정을 영구적으로 설정한다.
- sudo sysctl -p : 위의 설정을 즉시 적용한다.
또는 sysctl.conf를 편집기로 들어가 보면 net.ipv4.ip_forward=1이 위의 그림 처럼 #으로 비활성화 되어 있는 모습을 볼 수 있을 것이다. 단순히 해당 부분의 주석을 풀고 설정을 적용해 줘도 된다.
2. iptables NAT 설정
sudo iptables -t nat -A POSTROUTING -o {본인의 ethernet} -j MASQUERADE
Nat 기능을 구현하여 프라이빗 네트워크의 IP를 Nat Instance의 퍼블릭 IP로 변환하게 한다. 각 옵션마다의 설명은 다음과 같다.
- -t nat : Nat Table에 규칙을 추가합니다.
- -A POSTROUTING : 패킷이 라우팅된 이후(출발 직전)에 Nat 처리를 수행합니다. (외부 망에서 사설망으로 들어올때)
- -o {본인의 eth} : 본인의 eth(예를 들어 eth0, ens5 등) 인터페이스를 통해 나가는 트래픽에 규칙을 적용한다. (퍼블릭 네트워크 인터페이스를 의미한다)
- -j MASQUERADE : 출발지 IP를 Nat Instance의 퍼블릭 IP로 변환한다. (즉, 사설망에서 인터넷으로 나갈때)
본인의 네트워크 인터페이스 이름을 확인하는 방법 (ip addr이용) : ifconfig를 이용해도 무방 (netstat apt에서 설치한 이후 가능)
ip addr
ip addr / ifconfig를 이용하면 그림3과 같이 네트워크 인터페이스 이름을 알 수 있다. 위의 그림 경우에서는 ens5가 네트워크 이름으로 표기되고 있음을 알 수 있다.
3. iptables 적용 결과 확인
위에서 적용했으면, 잘 적용 됐는지를 확인 하는 과정을 거쳐야 한다.
sudo iptables -t nat -L -n -v
위의 명령어는 iptables에 적용되어 있는 Nat Table들을 확인시켜주는 Command Line이다. 해당 옵션의 설명은 아래와 같다.
- -t nat : Nat Table을 확인 한다.
- -L : 모든 체인과 규칙을 나열 한다.
- -n : 호스트 이름 대신 IP 주소를 표시한다.
- -v : 상세 정보(패킷 수, 바이트 등)를 추가로 표시 한다.
그림4처럼 POSTROUTING 체인에 MASQUERADE 규칙이 추가되어 있어야 한다. 해당 결과를 확인했다면, 이제 재부팅해도 해당 설정이 유지되게 설정해줘야 한다.
4. iptables 설정 / 규칙 저장 (재부팅시 설정 유지하기 위함)
sudo apt-get update
sudo apt-get install -y iptables-persistent
최신 버전을 받기 위해 apt-get update를 한 이후 install해주길 바란다. iptables 규칙을 시스템 재부팅 후에도 유지하기 위해 iptables-persistent 패키지를 설치한다. iptables-persistent은 iptables 규칙을 저장하고 부팅 시 자동으로 로드하는 유틸리티라고 생각하면 된다. 설치 과정에서 현재 설정된 iptables 규칙을 저장할지 묻는데, 모두 yes하면 된다.
sudo netfilter-persistent save
현재 설정된 iptables 규칙을 저장한다. netfilter-persistent은 iptables 및 관련 규칙을 /etc/iptables/rules.v4와 같은 파일에 저정 한다. 저장된 규칙은 시스템이 재부팅되어도 유지된다.
sudo systemctl enable netfilter-persistent
시스템 재부팅 후에도 iptables 규칙이 자동으로 로드되도록 netfilter-persistent 서비스를 활성화 한다.
이렇게 하면 OS상에서 Nat-Instance 설정이 마무리 된 것이다. 나머지 설정은 1부에서 다뤘던 것처럼 private routing table 설정 및 AWS EC2에서 소스 대상/확인 설정을 하면 된다. (1부 글에서 2. Private subnet Routing Table 설정 및 Nat Instance Console창에서 설정 부분을 봐주시면 됩니다)
5. 결과 (Private subnet 인터넷 연결 확인)
위의 설정을 끝내고 Private Subnet에 있는 ec2에 들어가서 sudo apt-get udpate를 하면, 위와 같이 인터넷이 연결된 것을 확인할 수 있을 것이다.
맺음말
이번 2부 글에서는 AMI Community에서 제공하고 있는 Nat Instance를 우리가 직접 OS상에서 설정하고 구성해 본 것뿐이다. 나머지 Routing Table 설정, 콘솔창에서 EC2 대상 확인 체크 등 다른 설정들은 모두 1부 글과 동일하다. 필자는 현재 Reverse Proxy / Nat Instance / Bastion 3가지 역할을 모두 할 수 있게 만들어 놓아야 했기 때문에, 버전 관리가 되는 OS에 위와 같이 직접 설정하여 사용하고 있다.
'클라우드 & 아키텍처 > AWS' 카테고리의 다른 글
[AWS] NAT Instance: 직접 구성 & AMI로 NAT Gateway 대체 (1부) (0) | 2024.12.28 |
---|