
[network] 보안 그룹 vs NACL
방화벽을 인스턴스에 걸까, 서브넷에 걸까. 늘 헷갈리는 보안 그룹과 NACL, 이번엔 확실히 구분해 둡니다.
One-Line Summary
Security Group(SG)은 인스턴스(ENI) 단위의 방화벽이고, Network ACL(NACL)은 서브넷 단위의 방화벽이다. 가장 큰 차이는 SG는 stateful(응답 자동 허용), NACL은 stateless(응답도 규칙으로 명시) 이고, SG는 허용(allow) 규칙만, NACL은 허용+거부(deny) 둘 다 가능하다는 점이다. 이 두 축이 시험의 90%를 가른다.
Why It Exists
트래픽을 어디서 막을지는 두 층위가 있다. 하나는 "이 서버에 누가 접근할 수 있나"(인스턴스 단위), 다른 하나는 "이 네트워크 구획 전체에 무엇을 들이고 내보낼까"(서브넷 단위)다. AWS는 이 둘을 각각 SG와 NACL로 제공해 다층 방어(defense in depth) 를 구성한다.
Internet / other subnet
│
▼
┌─ Subnet ───────────────────────────┐
│ [ NACL ] stateless · allow + deny │ ← 서브넷 경계(1차 필터)
│ │ │
│ ▼ │
│ ┌─ ENI ─────────────────────────┐ │
│ │ [ SG ] stateful · allow-only │ │ ← 인스턴스 앞(2차 필터)
│ │ │ │ │
│ │ ▼ │ │
│ │ EC2 instance │ │
│ └───────────────────────────────┘ │
└────────────────────────────────────┘
시험 감각:
"특정 IP를 차단하라" = NACL(deny 가능). "웹 서버가 DB에만 접근하게 하라" = Security Group.
Abbreviations
| 약어 | 풀네임 | 의미 |
|---|---|---|
SG | Security Group | 인스턴스(ENI) 단위 stateful 방화벽 |
NACL | Network Access Control List | 서브넷 단위 stateless 방화벽 |
Stateful | Stateful | 요청을 허용하면 그 응답도 자동 허용 |
Stateless | Stateless | 요청/응답을 각각 별도 규칙으로 허용해야 함 |
Ephemeral Port | Ephemeral Port | 클라이언트가 응답 받으려 임시로 여는 높은 번호 포트 대역 |
ENI | Elastic Network Interface | 인스턴스에 붙는 가상 네트워크 카드(SG가 여기 적용) |
Stateful vs Stateless — 가장 중요한 개념
Security Group = Stateful
요청을 허용하면 그 응답 트래픽은 규칙 없이도 자동 허용된다. 인바운드로 80 포트를 열면, 그 요청에 대한 응답(아웃바운드)은 아웃바운드 규칙을 따로 안 넣어도 나간다.
인바운드 허용: TCP 80 from 0.0.0.0/0
→ 클라이언트로 돌아가는 응답은 자동 허용 (아웃바운드 규칙 불필요)
Network ACL = Stateless
요청과 응답을 각각 규칙으로 명시해야 한다. 인바운드로 80을 허용해도, 응답이 나가는 아웃바운드(ephemeral 포트) 를 따로 허용하지 않으면 통신이 끊긴다.
인바운드 허용: TCP 80
아웃바운드 허용: TCP 1024-65535 (ephemeral 포트) ← 이걸 빠뜨리면 응답 못 나감
이 ephemeral 포트(임시 포트, 보통 1024–65535) 개념이 NACL 문제의 단골 함정이다. 요청은 80으로 오지만 응답은 클라이언트가 연 높은 번호 포트로 돌아가기 때문에, NACL에서는 그 대역을 열어줘야 한다.
Allow vs Deny — 규칙 종류의 차이
| 구분 | Security Group | Network ACL |
|---|---|---|
| 허용(allow) 규칙 | 가능 | 가능 |
| 거부(deny) 규칙 | 불가 (허용만, 나머지는 암묵적 거부) | 가능 (명시적 deny) |
| 특정 IP 차단 | 못 함(허용 목록 방식이라) | 가능(그 IP만 deny) |
SG는 "허용 목록(allow-list)"만 관리한다. 그래서 특정 악성 IP 하나를 차단하는 건 SG로 불가능하고, NACL의 deny 규칙으로 해야 한다. (빈출)
규칙 평가 방식
| 구분 | Security Group | Network ACL |
|---|---|---|
| 평가 순서 | 모든 규칙을 종합해 허용 여부 판단(순서 없음) | 번호 순(낮은 번호부터) 으로 평가, 처음 매칭되는 규칙 적용 |
| 규칙 번호 | 없음 | 있음(예: 100, 200 …) — 번호 간격을 두는 게 관례 |
| 매칭되면 | 허용 규칙에 맞으면 통과 | 매칭된 첫 규칙의 allow/deny를 즉시 적용(뒤는 무시) |
NACL은 번호가 낮은 규칙이 우선이라,
100 allow가200 deny보다 먼저 평가된다. 규칙 순서 설계가 중요하다.
SG는 다른 SG를 참조할 수 있다 (실무·빈출)
SG 규칙의 소스로 IP뿐 아니라 다른 보안 그룹을 지정할 수 있다. 이를 이용해 계층 간 접근을 IP 없이 논리적으로 연결한다.
DB용 SG 인바운드 규칙:
TCP 3306 from sg-web ← "웹 서버 SG를 가진 인스턴스만 DB 3306 허용"
- 웹 서버 IP가 오토스케일로 계속 바뀌어도, SG를 참조하면 규칙을 안 고쳐도 된다.
- 시험 감각: "app tier만 DB tier에 접근" = DB SG가 app SG를 소스로 참조.
전체 비교표
| 항목 | Security Group | Network ACL |
|---|---|---|
| 적용 범위 | 인스턴스(ENI) 단위 | 서브넷 단위 |
| 상태 | Stateful(응답 자동 허용) | Stateless(응답도 규칙 필요) |
| 규칙 종류 | allow만 | allow + deny |
| 평가 | 전체 규칙 종합 | 번호 순, 첫 매칭 적용 |
| 소스로 SG 참조 | 가능 | 불가(CIDR만) |
| 기본값 | 새 SG: 인바운드 전체 거부, 아웃바운드 전체 허용 | 기본 NACL: 인/아웃 전체 허용 / 커스텀 NACL: 전체 거부 |
| 적용 대상 | 붙인 인스턴스에만 | 서브넷 내 모든 리소스에 |
| 대표 용도 | 인스턴스별 접근 제어, 계층 간 허용 | 서브넷 전체 정책, 특정 IP/대역 차단 |
트래픽이 지나는 순서 (다층 방어)
인바운드: 외부 → [NACL(서브넷)] → [SG(인스턴스)] → EC2
아웃바운드: EC2 → [SG(인스턴스)] → [NACL(서브넷)] → 외부
- 인바운드는 NACL이 먼저(서브넷 경계), 그다음 SG(인스턴스).
- 둘 중 하나라도 막으면 통신 안 됨 → "안 되면 양쪽 다 확인".
- NACL은 서브넷의 모든 리소스에 일괄 적용되고, SG는 붙인 인스턴스에만 적용된다.
언제 무엇을 쓰나
| 요구사항 | 선택 |
|---|---|
| 인스턴스별로 접근 포트/소스 제어 | Security Group |
| 웹→앱→DB 계층 간 접근 허용(오토스케일 IP 변동) | SG가 다른 SG 참조 |
| 특정 악성 IP/대역을 차단 | NACL deny 규칙 |
| 서브넷 전체에 공통 정책(예: DB 서브넷은 특정 포트만) | NACL |
| 기본·간단한 대부분의 접근 제어 | Security Group (NACL은 기본 전체 허용으로 두는 경우 多) |
Common Wrong Directions
| 오답 방향 | 왜 부족한가 |
|---|---|
| SG로 특정 IP를 차단하려 함 | SG는 allow만. 차단은 NACL deny |
| NACL이 stateful이라 응답 자동 허용될 거라 가정 | NACL은 stateless → ephemeral 포트 아웃바운드도 열어야 |
| SG를 서브넷에 붙인다고 생각 | SG는 인스턴스(ENI) 단위. 서브넷 단위는 NACL |
| 계층 간 접근에 IP를 하드코딩 | 오토스케일로 IP 변동 → SG 참조가 정석 |
| NACL 규칙 순서를 무시 | 번호 낮은 것이 우선, 첫 매칭 적용 |
| 통신 장애를 SG만 확인 | NACL·라우트·SG를 함께 확인(다층) |
| 커스텀 NACL 만들고 규칙 안 넣음 | 커스텀 NACL 기본은 전체 거부 → 명시 허용 필요 |
Exam Triggers
| 문제에서 이런 표현이 나오면 | 떠올릴 것 |
|---|---|
| "block/deny a specific IP address or range" | NACL (deny 규칙) |
| "allow only web tier to reach database tier" | SG가 다른 SG 참조 |
| "return traffic is being blocked / responses fail" | NACL stateless → ephemeral 포트 허용 |
| "apply rules to all instances in a subnet" | NACL |
| "instance-level firewall" | SG |
| "rules evaluated in number order, first match" | NACL |
| "auto scaling changes IPs, keep access working" | SG 참조(IP 대신) |
| "custom NACL blocks everything by default" | 명시적 allow 규칙 추가 필요 |
Memory Sentence
SG는 인스턴스(ENI) 단위·stateful·allow만이라 응답이 자동 허용되고 특정 IP 차단은 못 한다. NACL은 서브넷 단위·stateless·allow+deny라 특정 IP를 막을 수 있지만 응답용 ephemeral 포트를 직접 열어야 한다. 계층 간 허용은 SG가 SG를 참조, 악성 IP 차단은 NACL deny. 인바운드는 NACL→SG 순으로 통과한다.
References
댓글
아직 댓글이 없습니다.