AWS VPC 안에서 트래픽을 제어하는 방화벽은 두 계층으로 구성됩니다. 하나는 인스턴스 수준에서 동작하는 Security Group이고, 다른 하나는 서브넷 수준에서 동작하는 NACL(Network Access Control List)입니다. 두 방화벽은 동시에 적용되며, 트래픽은 NACL → Security Group 순서로 검사를 통과해야 인스턴스에 도달합니다.
Security Group은 EC2 인스턴스, RDS 데이터베이스 등 개별 리소스에 연결되는 가상 방화벽입니다.
Security Group의 핵심 특성은 Stateful(상태 저장) 방식입니다.
Stateful이란 인바운드 요청을 허용하면, 그에 대한 아웃바운드 응답 트래픽은 별도 규칙 없이 자동으로 허용된다는 의미입니다. 즉 연결 상태를 추적하여 요청과 응답을 하나의 세션으로 인식합니다.
[클라이언트] ---(인바운드 80 허용)---> [EC2]
[클라이언트] <--(응답 자동 허용)------ [EC2]
(아웃바운드 규칙 불필요)
Security Group의 또 다른 특성은 기본 거부(Implicit Deny)입니다. 규칙에 명시적으로 Allow한 트래픽 외에는 모두 차단됩니다. Deny 규칙은 존재하지 않으며 Allow 규칙만 추가할 수 있습니다.
Inbound Rules (웹 서버용)
+----------+-------+------------------+---------------------+
| Protocol | Port | Source | 설명 |
+----------+-------+------------------+---------------------+
| TCP | 80 | 0.0.0.0/0 | HTTP 허용 |
| TCP | 443 | 0.0.0.0/0 | HTTPS 허용 |
| TCP | 22 | 10.0.0.0/8 | 내부망 SSH만 허용 |
+----------+-------+------------------+---------------------+
Outbound Rules (기본값)
+----------+-------+------------------+---------------------+
| Protocol | Port | Destination | 설명 |
+----------+-------+------------------+---------------------+
| All | All | 0.0.0.0/0 | 모든 아웃바운드 허용|
+----------+-------+------------------+---------------------+
하나의 Security Group을 여러 인스턴스에 연결할 수 있고, 하나의 인스턴스에 여러 Security Group을 동시에 적용할 수 있습니다.
NACL(Network ACL)은 서브넷 경계에서 동작하는 방화벽입니다. 서브넷으로 들어오거나 나가는 모든 트래픽에 적용됩니다.
NACL의 핵심 특성은 Stateless(무상태) 방식입니다. 인바운드 트래픽을 허용했더라도 그에 대한 응답 아웃바운드 트래픽은 별도로 명시적 허용 규칙이 필요합니다. 각 패킷을 독립적으로 평가하기 때문입니다.
[클라이언트] ---(인바운드 80 허용 필요)---> [Subnet]
[클라이언트] <--(아웃바운드 임시포트 허용 필요)-- [Subnet]
NACL 규칙에는 번호 순서가 있습니다. 낮은 번호의 규칙부터 순서대로 평가하며, 조건에 일치하는 첫 번째 규칙이 적용되면 이후 규칙은 더 이상 확인하지 않습니다. Allow와 Deny를 모두 명시할 수 있습니다.
NACL Inbound Rules
+------+----------+-------+-----------+--------+
| 규칙 | Protocol | Port | Source | Action |
+------+----------+-------+-----------+--------+
| 100 | TCP | 80 | 0.0.0.0/0 | Allow |
| 200 | TCP | 443 | 0.0.0.0/0 | Allow |
| 300 | TCP | 22 | 1.2.3.4/32| Deny | <- 특정 IP 차단
| * | All | All | 0.0.0.0/0 | Deny | <- 기본 거부
+------+----------+-------+-----------+--------+
+------------------+------------------+------------------+
| | Security Group | NACL |
+------------------+------------------+------------------+
| 적용 범위 | 인스턴스(ENI) | 서브넷 |
| 상태 추적 | Stateful | Stateless |
| 규칙 유형 | Allow만 가능 | Allow + Deny |
| 규칙 평가 | 모든 규칙 적용 | 번호 순서대로 |
| 기본 동작 | 모두 거부 | 모두 허용(신규) |
| 규칙 수 | 제한적 | 상대적으로 많음 |
+------------------+------------------+------------------+
인터넷
|
v
NACL 인바운드 검사 (서브넷 입구)
|
v
Security Group 인바운드 검사 (인스턴스 입구)
|
v
EC2 인스턴스 (요청 처리)
|
v
Security Group 아웃바운드 검사 (Stateful: 자동 허용)
|
v
NACL 아웃바운드 검사 (Stateless: 명시적 허용 필요)
|
v
인터넷
일반적으로 Security Group만으로도 대부분의 트래픽 제어가 가능합니다. NACL은 특정 IP를 명시적으로 차단(Deny)해야 하거나, 서브넷 전체에 일괄 규칙을 적용해야 할 때 추가로 사용합니다.