Quay lại bài viết
23 thg 5, 2026
7 min read

AWS Network ACL: “Hàng Rào” Stateless Bảo Vệ Subnet

Bạn đang vận hành một hệ thống e-commerce trên AWS. Đội DevOps phát hiện một IP lạ từ nước ngoài liên tục quét port trên các EC2 instance trong private subnet. Security Group đã chặn các port không cần thiết — nhưng bạn muốn block hoàn toàn IP đó, không cho nó chạm đến bất kỳ instance nào trong subnet.

Vấn đề: Security Group chỉ có rule Allow, không có Deny. Bạn không thể viết rule “cấm IP 1.2.3.4”.

Đây chính là lúc NACL (Network Access Control List) phát huy tác dụng. NACL cho phép bạn viết rule Deny để chặn đứng traffic ngay tại cửa ngõ subnet — trước khi nó kịp chạm đến bất kỳ instance nào bên trong.

Bài viết này sẽ giải thích NACL là gì, nó khác Security Group ở điểm nào, và một khái niệm quan trọng mà nhiều người bỏ qua: Ephemeral Ports.


1. NACL là gì?

NACL (Network Access Control List) là một tường lửa ảo (virtual firewall) hoạt động ở cấp subnet. Nếu coi VPC là một khu đô thị và subnet là các khu phố, thì NACL chính là hàng rào bao quanh mỗi khu phố — kiểm soát ai được phép đi vào (Inbound) và ai được phép đi ra (Outbound).

Một vài đặc điểm cốt lõi:


2. NACL Rules hoạt động như thế nào?

NACL sử dụng hệ thống rule theo số thứ tự (rule number) để quyết định traffic nào được phép và traffic nào bị chặn. Cơ chế này khác hoàn toàn so với Security Group.

Nguyên tắc hoạt động:

Ví dụ minh họa:

Rule #TypeProtocolPort RangeSourceAction
100HTTPSTCP4430.0.0.0/0ALLOW
200HTTPSTCP44310.0.0.10/32DENY
*AllAllAll0.0.0.0/0DENY

Trong ví dụ trên, IP 10.0.0.10 gửi request HTTPS đến subnet. NACL kiểm tra từ trên xuống:

  1. Rule #100: source 0.0.0.0/0 (tất cả IP) → khớp → ALLOW
  2. Rule #200 không bao giờ được kiểm tra vì rule #100 đã match trước.

Nếu bạn muốn block IP 10.0.0.10 nhưng vẫn allow HTTPS cho mọi IP khác, bạn cần đảo thứ tự: đặt rule DENY ở số nhỏ hơn rule ALLOW.

Rule #TypeProtocolPort RangeSourceAction
100HTTPSTCP44310.0.0.10/32DENY
200HTTPSTCP4430.0.0.0/0ALLOW
*AllAllAll0.0.0.0/0DENY

Bây giờ IP 10.0.0.10 sẽ bị chặn ở rule #100, còn mọi IP khác sẽ được allow ở rule #200.

AWS khuyến nghị thêm rule theo bội số 100 (100, 200, 300…) để dễ dàng chèn thêm rule mới vào giữa khi cần. Ví dụ: nếu sau này cần thêm rule giữa #100 và #200, bạn có thể dùng #150.


3. Vì sao đã có Security Group, lại cần NACL?

Nhiều người thắc mắc: Security Group (SG) đã kiểm soát traffic rồi, vậy NACL có thừa không? Câu trả lời là không — vì hai thằng này bảo vệ ở hai tầng khác nhau và bổ sung cho nhau.

Bảng so sánh

Đặc điểmSecurity Group (SG)Network ACL (NACL)
Cấp độInstance Level (gắn vào ENI)Subnet Level (gắn vào subnet)
Trạng tháiStateful — tự mở đường cho responseStateless — phải mở cả 2 chiều
Loại ruleChỉ có AllowCó cả AllowDeny
Đánh giá ruleTất cả rule được gộp lạiKiểm tra theo số thứ tự (first match)
Mặc địnhDeny all inbound, Allow all outboundDefault NACL: Allow all
Use case chínhCho phép app cụ thể truy cậpBlock IP/CIDR cụ thể ở subnet level

Stateful vs Stateless — sự khác biệt then chốt

Đây là điểm mấu chốt mà bạn cần hiểu rõ:

Defense in Depth — phòng thủ nhiều lớp

Trong bảo mật, nguyên tắc Defense in Depth (phòng thủ theo chiều sâu) khuyên bạn không nên dựa vào một lớp bảo vệ duy nhất. NACL và SG tạo thành hai lớp phòng thủ bổ sung cho nhau:

  1. Lớp 1 — NACL (Subnet boundary): chặn traffic xấu ngay tại cửa ngõ subnet, trước khi nó kịp chạm đến bất kỳ instance nào. Ví dụ: block IP đang tấn công DDoS.
  2. Lớp 2 — Security Group (Instance boundary): kiểm soát chi tiết từng instance được phép nhận traffic từ đâu. Ví dụ: chỉ cho phép ALB gửi traffic đến EC2 trên port 8080.

Nếu ai đó vượt qua NACL (vì bạn chưa kịp thêm rule block), Security Group vẫn là lớp phòng thủ cuối cùng.


4. Ephemeral Ports — Vì sao NACL cần allow chúng?

Đây là phần mà nhiều người mới học AWS hay bỏ qua, nhưng lại cực kỳ quan trọng khi cấu hình NACL.

Ephemeral Port là gì?

Khi hai thiết bị muốn giao tiếp qua mạng, chúng cần sử dụng port (cổng). Ví dụ: khi bạn truy cập một website HTTPS, trình duyệt kết nối đến port 443 (defined port) trên web server. Nhưng trình duyệt cũng cần một port ở phía client để nhận response — port này được hệ điều hành chọn ngẫu nhiên từ một dải port tạm thời, gọi là Ephemeral Port (port phù du).

Dải ephemeral port khác nhau tùy hệ điều hành:

Hệ điều hànhEphemeral Port Range
IANA & Windows 10+49152 – 65535
Many Linux Kernels32768 – 60999

Ví dụ cụ thể

Trong hình trên, Client (IP 11.22.33.44) truy cập Web Server (IP 55.66.77.88) qua HTTPS:

Vì sao NACL cần allow Ephemeral Ports?

Quay lại đặc điểm stateless của NACL:

Cấu hình NACL outbound rules đúng cách:

Rule #TypeProtocolPort RangeDestinationAction
100CustomTCP1024 – 655350.0.0.0/0ALLOW
*AllAllAll0.0.0.0/0DENY

Port range 1024 – 65535 bao phủ ephemeral port range của cả Windows và Linux, đảm bảo response traffic luôn được phép đi qua.

Đây là một trong những lỗi phổ biến nhất khi cấu hình NACL: allow inbound nhưng quên allow outbound cho ephemeral ports. Kết quả là request đến được server, server xử lý xong, nhưng response không gửi về được client.


Kết luận

NACL và Security Group không phải là hai lựa chọn thay thế nhau — chúng là hai lớp phòng thủ bổ sung cho nhau trong kiến trúc VPC:

Liên quan