[AWS][계정 분산 관리] 4. NAT Server & Port Forwarding: NAT Server를 사용해 프로젝트별 Private Subnet 접근
AWS|계정 분산 관리|NAT Server & Port Forwarding|프로젝트별 Private Subnet 접근
1. NAT Server & Port Forwarding
- NAT(Network Address Translation) Server는 내부 네트워크의 사설 IP 주소를 외부 네트워크에서 사용할 수 있는 공인 IP 주소로 변환하거나, 그 반대로 변환하는 역할을 합니다.
프로젝트별로 NAT Server를 구축하고 Port Forwarding을 통해 각 프로젝트 VPC의 Private Subnet에 위치한 RDS 인스턴스나 ElastiCache 클러스터 등의 리소스에 접근할 수 있도록 구성합니다. 이러한 방식을 통해 얻을 수 있는 이점은 다음과 같습니다.
보안 강화
Private Subnet에 위치한 인스턴스는 외부에서 직접 접근할 수 없으므로, 외부 공격으로부터 더 안전합니다.
NAT Server를 통해 인터넷 접근은 허용되지만, 외부에서 Private Subnet으로 직접 연결은 불가능합니다.인터넷 접근 허용
NAT Server가 외부와의 연결을 대행하므로, Private Subnet의 인스턴스는 공인 IP 없이도 인터넷을 사용할 수 있습니다.비용 효율성
NAT Gateway는 관리가 간편하고 안정성이 높지만, 비용이 상대적으로 비쌉니다.
직접 구축한 NAT Server를 사용하면 필요에 따라 크기를 조정하거나 커스터마이징하여 비용을 절감할 수 있습니다.데이터 유출 방지
Private Subnet 내 민감한 데이터를 외부로부터 보호하면서도, 필요한 외부 리소스에만 접근할 수 있도록 설정할 수 있습니다.
- 이 글에서는 Bastion Host Server → NAT Server → Private Subnet의 RDS로 접근하는 방식을 설명합니다. 구조는 아래와 같습니다.
2. 구성 방법
사전 조건:
- 통합 관리 계정에 Bastion Host Server가 필요합니다.
- 프로젝트 계정의 Public Subnet에 NAT Server로 사용할 EC2 인스턴스가 필요합니다. (이 글에서는 Ubuntu 사용)
- 프로젝트 계정의 Private Subnet에 RDS 인스턴스가 필요합니다. (이 글에서는 MariaDB 사용)
1. RDS 인스턴스의 보안 그룹 설정
- NAT Server에서 RDS 인스턴스에 접근할 수 있도록 DB 포트(기본 3306)에 대해 NAT Server의 사설 IP를 소스로 추가합니다.
해당 글에서는 하나의 인스턴스만 사용합니다. 그러나 사용할 인스턴스가 다수가 될 것을 예상해, 외부에서 접근할 포트에 대한 전략을 수립하는 것도 좋습니다.
2. NAT Server의 보안 그룹 설정 및 Bastion Host Server → NAT Server로 접속
- NAT Server의 보안 그룹 인바운드 규칙에서 3306 포트에 대해 Bastion Host Server의 사설 IP를 소스로 추가합니다.
- NAT Server의 보안 그룹 인바운드 규칙에서 SSH 포트(기본 22)에 대해 Bastion Host Server의 사설 IP를 소스로 추가합니다.
- SSH 터널링이나 직접 접속을 통해 Bastion Host Server → NAT Server로 연결합니다.
3. Port Forwarding 설정
NAT Server에서 패킷 포워딩을 활성화하려면
/etc/sysctl.conf
파일에 아래 설정을 추가합니다.1
net.ipv4.ip_forward = 1
설정을 적용하고 확인합니다.
1 2 3 4 5
# 즉시 적용 sudo sysctl -p # 적용 확인 sysctl net.ipv4.ip_forward # 출력: net.ipv4.ip_forward = 1
RDS 인스턴스의 사설 IP는 아래 명령어로 확인할 수 있습니다. (AWS 콘솔에서는 사설 IP를 확인할 수 없습니다.)
1
dig <RDS 인스턴스의 엔드포인트>
특정 포트로 외부 접근 시 RDS 인스턴스로 라우팅되도록 iptables NAT 테이블의 PREROUTING 및 POSTROUTING Chain에 규칙을 설정합니다.
1 2 3 4
# PREROUTING Chain sudo iptables -t nat -A PREROUTING -i <내부 네트워크 인터페이스> -p tcp --dport <외부 접근 포트> -j DNAT --to-destination <RDS 인스턴스의 사설 IP>:3306 # POSTROUTING Chain sudo iptables -t nat -A POSTROUTING -o <내부 네트워크 인터페이스> -d <RDS 인스턴스의 사설 IP> -j MASQUERADE
FORWARD Chain이 ACCEPT 상태여야 합니다. 기본적으로 모든 패킷이 ACCEPT 상태이지만, 보안을 위해 규칙을 추가로 설정하는 것이 좋습니다.
4. Bastion Host Server → NAT Server → Private Subnet의 RDS 접속
- SSH 터널링을 통해 로컬에서 RDS에 접근합니다. 아래와 같은 방법을 사용할 수 있습니다.
- SSH 명령어와 MySQL CLI를 사용
- Bastion Host에서 직접 MySQL CLI를 사용
- SSH 터널링을 지원하는 GUI 사용 (해당 글에서는 DBeaver 사용)
- NAT Server에서 RDS로의 Port Forwarding 정보를 입력 후 연결을 확인합니다.
3. 주요 요약
- NAT Server 활용: Private Subnet의 리소스에 대한 외부 접근을 NAT Server를 통해 안전하게 관리.
- 포트 포워딩 설정: NAT Server에서 iptables를 이용해 특정 포트로의 외부 접근을 RDS로 라우팅하도록 설정.
다음 글: [AWS][계정 분산 관리] 5. Switch Role 활용: 통합 콘솔 관리(完)
이전 글: [AWS][계정 분산 관리] 3. Bastion Host Server: 중앙 집중형 인스턴스 접근