AWS 네트워크 보안에는 두 레이어가 있다. Security Group은 EC2 인스턴스(또는 ENI)에 붙는다. NACL(Network Access Control List)은 서브넷에 붙는다. 둘 다 인바운드/아웃바운드 트래픽을 제어하지만 동작 방식이 근본적으로 다르다.
Security Group — Stateful
Security Group은 연결 상태를 추적(stateful) 한다. 인바운드 요청이 허용되면, 그 연결에 대한 응답(아웃바운드)은 아웃바운드 규칙과 무관하게 자동으로 허용된다.
# Security Group 설정
인바운드: TCP 443 허용 (HTTPS)
아웃바운드: 별도 규칙 없음
클라이언트 → 인스턴스 (443 포트) → 인바운드 규칙 허용 ✓
인스턴스 → 클라이언트 (응답) → 자동 허용 ✓ (stateful이기 때문)
아웃바운드 규칙을 명시하지 않아도 인바운드로 허용된 연결의 응답은 나간다. 반대도 마찬가지다. 아웃바운드 요청이 허용되면 그 응답(인바운드)은 자동 허용된다.
특징
- 허용 규칙만 있다. 거부 규칙이 없다.
- 명시되지 않은 트래픽은 기본 거부.
- 여러 Security Group을 하나의 인스턴스에 붙일 수 있다. 규칙들은 합산(OR)된다.
- 소스/목적지에 다른 Security Group ID를 지정할 수 있다. “이 Security Group이 붙은 인스턴스에서 오는 트래픽"이라는 동적 규칙이 가능하다.
# Security Group 규칙 예시
인바운드:
- 프로토콜: TCP, 포트: 443, 소스: 0.0.0.0/0 # 모든 HTTPS
- 프로토콜: TCP, 포트: 5432, 소스: sg-app-servers # 앱 서버 SG에서만 DB 접근 허용
아웃바운드:
- 프로토콜: 전체, 목적지: 0.0.0.0/0 # 모든 아웃바운드 허용 (기본값)
NACL — Stateless
NACL은 연결 상태를 추적하지 않는다(stateless). 인바운드와 아웃바운드를 완전히 독립적으로 평가한다. 인바운드 요청이 허용돼도 응답(아웃바운드)이 별도 규칙으로 허용되지 않으면 차단된다.
# NACL 설정
인바운드: TCP 443 허용
아웃바운드: 규칙 없음
클라이언트 → 인스턴스 (443 포트) → 인바운드 허용 ✓
인스턴스 → 클라이언트 (응답) → 아웃바운드 규칙 없음 → 차단 ✗
응답이 나가려면 Ephemeral Port(임시 포트) 범위도 아웃바운드로 열어야 한다. 클라이언트는 응답을 받을 임시 포트(1024~65535)를 랜덤으로 선택해 연결한다. NACL을 쓸 때 이 범위를 아웃바운드 허용하지 않으면 응답이 차단된다.
# 올바른 NACL 설정
인바운드: TCP 443 허용 (0.0.0.0/0)
아웃바운드: TCP 1024-65535 허용 (0.0.0.0/0) ← Ephemeral Port
특징
- 허용 규칙과 거부 규칙 둘 다 있다.
- 규칙에 번호(Rule Number)가 있고, 낮은 번호부터 순서대로 평가한다. 첫 번째로 매칭되는 규칙이 적용된다.
- 서브넷 레벨에서 적용된다. 서브넷 안의 모든 인스턴스에 일괄 적용된다.
- 기본 NACL은 모든 트래픽 허용이다.
# NACL 규칙 예시
번호 프로토콜 포트 소스 동작
100 TCP 443 0.0.0.0/0 허용
200 TCP 22 10.0.0.0/8 허용
300 TCP 22 0.0.0.0/0 거부 ← 외부에서 SSH 차단
* 전체 전체 0.0.0.0/0 거부 ← 기본 거부
규칙 번호 300이 SSH를 외부에서 차단하고, 200이 내부 대역(10.x.x.x)에서는 허용한다. 200이 300보다 먼저 평가되므로 내부 → SSH는 통과된다.
비교
| Security Group | NACL | |
|---|---|---|
| 적용 레벨 | 인스턴스(ENI) | 서브넷 |
| 상태 추적 | Stateful | Stateless |
| 거부 규칙 | 없음 (기본 거부) | 있음 |
| 규칙 평가 | 전체 합산 | 번호 순서대로, 첫 매칭 |
| 기본값 | 모든 아웃바운드 허용 | 모든 트래픽 허용 |
언제 무엇을 쓰는가
Security Group이 주요 수단이다. 대부분의 접근 제어는 Security Group으로 충분하다. stateful이라 설정이 단순하고, SG ID를 소스로 지정하는 동적 규칙이 강력하다.
NACL은 서브넷 레벨 추가 방어선이다. 특정 IP 대역을 서브넷 전체에서 완전히 차단해야 할 때 쓴다. DDoS 공격 IP를 빠르게 차단하거나, 특정 서브넷이 절대 접근하면 안 되는 경우에 유용하다. stateless라 Ephemeral Port 관리가 번거로워 기본적으로 NACL은 기본값(모두 허용)으로 두고 Security Group에 집중하는 팀도 많다.