AWS VPC에서 Public Subnet과 Private Subnet을 분리하는 가장 큰 이유는 보안 때문이다.
웹 서비스는 외부 사용자가 접근해야 하는 영역과, 외부에서 직접 접근하면 위험한 내부 영역이 나뉜다.
예를 들어 사용자는 인터넷을 통해 서버에 요청을 보내야 하지만, 데이터베이스나 내부 관리 서버까지 직접 접근할 필요는 없다.
그래서 VPC 안에서 서브넷을 다음과 같이 분리한다.
Public Subnet은 인터넷과 직접 통신할 수 있는 서브넷이다.
Public Subnet은 일반적으로 다음 조건을 가진다.
0.0.0.0/0 → Internet Gateway 경로가 있다.실제 서비스에서는 Public Subnet에 보통 다음 리소스를 배치한다.
예를 들어 사용자가 웹사이트에 접속하면 요청은 먼저 Public Subnet의 Load Balancer로 들어온다.
Private Subnet은 인터넷에서 직접 접근할 수 없는 서브넷이다.
Private Subnet은 외부에서 바로 접근할 수 없기 때문에 보안이 더 강하다.
실제 서비스에서는 중요한 내부 리소스를 Private Subnet에 배치한다.
대표적으로 다음 리소스가 있다.
일반적인 서비스 구조는 다음과 같다.
사용자
↓
Internet Gateway
↓
Public Subnet
↓
Application Load Balancer
↓
Private Subnet
↓
EC2 Application Server
↓
Private Subnet
↓
RDS Database
즉, 사용자는 Load Balancer까지만 접근하고, 실제 애플리케이션 서버와 데이터베이스는 Private Subnet에 숨겨 둔다.
이렇게 하면 외부 공격자가 데이터베이스나 내부 서버에 직접 접근하기 어렵다.
NAT Gateway는 Private Subnet에 있는 리소스가 인터넷으로 나갈 수 있게 해주는 서비스이다.
Private Subnet의 EC2는 인터넷에서 직접 접근되면 안 된다.
하지만 서버 운영 중에는 외부 인터넷으로 나가야 하는 경우가 있다.
예를 들어 다음과 같은 상황이다.
이때 Private Subnet의 EC2가 인터넷으로 나갈 수 있도록 도와주는 것이 NAT Gateway이다.
구조는 다음과 같다.
Private Subnet EC2
↓
NAT Gateway
↓
Internet Gateway
↓
Internet
NAT Gateway는 보통 Public Subnet에 배치한다.
그리고 Private Subnet의 Route Table에는 다음과 같은 경로를 추가한다.
0.0.0.0/0 → NAT Gateway
이렇게 하면 Private Subnet의 EC2는 인터넷으로 요청을 보낼 수 있다.
하지만 외부 인터넷에서 Private Subnet의 EC2로 직접 접속하는 것은 불가능하다.
정리하면 NAT Gateway의 역할은 다음과 같다.
Private Subnet의 리소스가 외부 인터넷으로는 나갈 수 있게 해주지만, 외부에서 Private Subnet으로 직접 들어오는 접근은 막아주는 역할을 한다.
Security Group과 NACL은 둘 다 네트워크 접근 제어를 위해 사용된다.
하지만 적용 위치와 동작 방식이 다르다.
Security Group은 EC2, RDS 같은 리소스 단위에 적용되는 방화벽이다.
특징은 다음과 같다.
여기서 Stateful이란, 들어오는 요청을 허용하면 그에 대한 응답 트래픽은 자동으로 허용된다는 뜻이다.
예를 들어 Security Group에서 80번 포트 inbound를 허용하면, 사용자가 보낸 HTTP 요청에 대한 응답은 별도의 outbound 설정 없이도 정상적으로 나갈 수 있다.
Security Group은 주로 다음과 같이 사용한다.
ALB Security Group
- Inbound: 80, 443 허용
EC2 Security Group
- Inbound: ALB에서 오는 8080 포트만 허용
RDS Security Group
- Inbound: EC2에서 오는 3306 포트만 허용
NACL, Network ACL은 서브넷 단위에 적용되는 네트워크 접근 제어 규칙이다.
특징은 다음과 같다.
여기서 Stateless란, 들어오는 요청과 나가는 응답을 각각 따로 검사한다는 뜻이다.
즉, inbound를 허용했더라도 outbound도 따로 허용해야 정상 통신이 가능하다.
NACL은 주로 서브넷 전체에 대한 1차 방어선 역할을 한다.
| 구분 | Security Group | NACL |
|---|---|---|
| 적용 대상 | EC2, RDS 등 리소스 단위 | Subnet 단위 |
| 동작 방식 | Stateful | Stateless |
| 규칙 종류 | Allow만 가능 | Allow와 Deny 가능 |
| 평가 방식 | 모든 규칙을 종합적으로 평가 | 규칙 번호 순서대로 평가 |
| 기본 Inbound | 차단 | 기본 NACL은 허용, Custom NACL은 차단 |
| 사용 목적 | 리소스별 세밀한 접근 제어 | 서브넷 전체 접근 제어 |
| 동작 계층 | 인스턴스/리소스 레벨 | 서브넷 레벨 |
AWS VPC에서 Public Subnet과 Private Subnet을 분리하는 이유는 보안성과 네트워크 구조 분리를 위해서입니다. Public Subnet에는 인터넷과 직접 통신해야 하는 ALB, Bastion Host, NAT Gateway 등을 배치하고, Private Subnet에는 외부에서 직접 접근하면 안 되는 EC2 애플리케이션 서버, RDS, Redis 등을 배치합니다.
NAT Gateway는 Private Subnet의 리소스가 인터넷으로 나갈 필요가 있을 때 사용합니다. 예를 들어 패키지 설치, OS 업데이트, 외부 API 호출이 필요한 경우 NAT Gateway를 통해 outbound 통신을 할 수 있습니다. NAT Gateway는 Private Subnet에서 인터넷으로 나가는 통신은 가능하게 하지만, 외부에서 Private Subnet으로 직접 들어오는 접근은 허용하지 않습니다.
Security Group은 EC2나 RDS 같은 리소스 단위에 적용되는 Stateful 방화벽이고, NACL은 Subnet 단위에 적용되는 Stateless 방화벽입니다. Security Group은 허용 규칙만 설정할 수 있고, NACL은 허용과 거부 규칙을 모두 설정할 수 있습니다. Security Group은 리소스 보호에 사용하고, NACL은 서브넷 전체에 대한 네트워크 접근 제어에 사용합니다.