NAT Instance vs NAT Gateway: Tự Quản Lý hay Để AWS Lo?
Bạn đang review hóa đơn AWS tháng này. Dòng NAT Gateway nổi bật với con số không hề nhỏ — $0.045/giờ cộng $0.045/GB data processed. Với môi trường dev/staging chạy 24/7, chi phí NAT Gateway có thể lên đến hàng trăm đô mỗi tháng chỉ để EC2 trong private subnet download package hay gọi external API.
Đồng nghiệp gợi ý: “Sao không dùng NAT Instance cho dev? Chạy trên t3.micro, tốn có vài đô.”
NAT Instance — nghe quen thuộc nhưng bạn chưa bao giờ setup. Nó cũng là NAT, nhưng chạy trên EC2 thay vì dùng managed service. Vậy nó hoạt động như thế nào? Tại sao phải tắt Source/Destination Check? Và khi nào thì nên dùng nó thay vì NAT Gateway?
Bài viết giả định bạn đã hiểu cơ bản về VPC, subnet, và route table. Nếu chưa, hãy đọc AWS VPC: Hiểu VPC qua lăng kính của một Packet trước.
1. NAT là gì?
Trong VPC, resource ở private subnet chỉ có private IP. Internet không biết cách route đến private IP (thuộc dải RFC 1918 — dải địa chỉ IP dành riêng cho mạng nội bộ), nên các resource này không thể giao tiếp trực tiếp với internet.
NAT giải quyết vấn đề này bằng cách đặt một “đại diện” ở public subnet: khi EC2 trong private subnet muốn gọi ra internet, packet được gửi đến NAT, NAT thay source IP bằng IP public của mình rồi forward ra internet. Response quay về NAT, NAT tra bảng mapping rồi chuyển về đúng EC2 ban đầu.
AWS cung cấp 2 cách để làm NAT:
- NAT Gateway: dịch vụ managed hoàn toàn bởi AWS — bạn tạo, gắn Elastic IP, xong. AWS lo phần còn lại.
- NAT Instance: một EC2 instance bạn tự cấu hình để đóng vai NAT — bạn quản lý mọi thứ từ A đến Z.
Bài viết này tập trung vào NAT Instance — cách nó hoạt động bên trong, rồi so sánh với NAT Gateway.
2. NAT Instance — Cách hoạt động
2.1. Một EC2 instance đóng vai NAT
NAT Instance thực chất là một EC2 instance chạy AMI có cấu hình sẵn IP forwarding và iptables. Khi packet đến, thay vì xử lý ở tầng application, OS của EC2 này sẽ thay đổi source IP rồi forward packet ra interface khác — đúng như một router NAT truyền thống.
Để hoạt động, NAT Instance cần đáp ứng 4 điều kiện:
- Đặt trong public subnet — vì nó cần route ra internet qua Internet Gateway (IGW)
- Gắn Elastic IP — để internet có thể gửi response về
- Disable Source/Destination Check — chi tiết ở phần tiếp theo
- Cấu hình route table — private subnet phải có route
0.0.0.0/0 → eni-xxxtrỏ đến ENI của NAT Instance
AWS từng cung cấp pre-configured Amazon Linux AMI cho NAT Instance, nhưng AMI này đã hết standard support từ 31/12/2020.
Hiện tại nếu muốn dùng NAT Instance, bạn có 2 lựa chọn: tìm alternative AMI trên AWS Marketplace, hoặc tự cấu hình từ AMI Linux thông thường — enable IP forwarding trong kernel (net.ipv4.ip_forward = 1) và thiết lập iptables NAT rules.
2.2. Source/Destination Check — Tại sao phải tắt?
Đây là phần thú vị nhất khi tìm hiểu NAT Instance. Trước khi hiểu tại sao phải tắt, hãy hiểu tại sao AWS bật nó làm mặc định.
Source/Destination Check là gì?
Mặc định, AWS bật Source/Destination Check trên mọi EC2 instance. Tính năng này kiểm tra: packet đến hoặc đi từ instance này có source IP hoặc destination IP trùng với IP của chính instance đó không? Nếu không — packet bị drop ngay lập tức.
Tại sao AWS bật mặc định?
Đây là một cơ chế bảo mật nhiều lớp, hoạt động độc lập với Security Group và NACL — nghĩa là ngay cả khi SG hoặc NACL bị cấu hình sai, lớp bảo vệ này vẫn ngăn chặn được các hành vi nguy hiểm:
1. Chống IP Spoofing — IP Spoofing là kỹ thuật giả mạo source IP trong gói tin để đánh lừa hệ thống đích. Kẻ tấn công có thể dùng kỹ thuật này trong DDoS reflection attack (giả IP nạn nhân để server trả response về nạn nhân), hoặc bypass firewall bằng cách giả IP trusted. Source/Dest Check đảm bảo gói tin gửi đi phải có source IP đúng là của instance, ngăn mọi hình thức giả mạo.
2. Ngăn Traffic Forwarding trái phép — Nếu không có cơ chế này, một EC2 bị xâm nhập có thể trở thành proxy để forward traffic độc hại đến các instance khác trong VPC, hoặc thực hiện lateral movement. Bằng cách drop mọi gói tin không thuộc về instance, AWS chặn hành vi này ở tầng hạ tầng.
3. Đảm bảo routing nhất quán — Trong môi trường cloud nhiều tenant, AWS cần đảm bảo traffic đi đúng theo route table đã định nghĩa. Nếu cho phép instance tự ý forward traffic, một instance có thể “tự biến thành router” và phá vỡ topology mạng, khiến việc troubleshoot và audit network trở nên cực kỳ phức tạp.
4. Secure by default — AWS áp dụng triết lý Least Privilege: mặc định cấm những hành vi nguy hiểm, ai cần thì phải chủ động bật. Hầu hết workload (web server, app server, database) không cần forward traffic, nên việc bật Source/Dest Check làm mặc định là hợp lý.
Tại sao NAT Instance phải tắt?
Nhưng NAT Instance thì khác — công việc của nó chính là forward packet cho người khác. Hãy xem packet mà NAT Instance nhận từ EC2 trong private subnet:
src: 10.0.2.20 ← IP của EC2 trong private subnet
dst: 3.5.6.7 ← IP của server bên ngoài internetNAT Instance có IP 10.0.1.30. Cả source lẫn destination đều không phải IP của NAT Instance. Với Source/Destination Check bật, packet này bị drop — NAT Instance không bao giờ thấy nó.
Tương tự khi NAT Instance forward packet ra ngoài, source IP ban đầu (10.0.2.20) không phải IP của NAT Instance → check fail → packet bị drop lần nữa.
Vì vậy, bạn phải disable Source/Destination Check trên NAT Instance. Không có bước này, NAT Instance hoàn toàn vô dụng — nó không thể forward được bất kỳ packet nào. Ngoài NAT Instance, các use case khác cần disable cơ chế này bao gồm: VPN instance, software firewall, hoặc bất kỳ instance nào đóng vai trò router.
Với NAT Gateway, bạn không cần lo điều này — AWS tự xử lý vì đây là managed service, không chạy trên EC2 instance thông thường.
2.3. Packet flow chi tiết
Hãy trace một packet từ EC2 trong private subnet ra internet qua NAT Instance:
| Entity | IP |
|---|---|
| EC2 (private subnet) | 10.0.2.20 |
| NAT Instance (public subnet) | Private: 10.0.1.30, EIP: 12.34.56.78 |
| Server ngoài internet | 3.5.6.7 |
Chiều đi (Outbound):
| # | Vị trí | src | dst | Hành động |
|---|---|---|---|---|
| 1 | EC2 | 10.0.2.20 | 3.5.6.7 | Tạo packet |
| 2 | Route Table (private) | 10.0.2.20 | 3.5.6.7 | Match 0.0.0.0/0 → eni-xxx → forward đến NAT Instance |
| 3 | NAT Instance | 10.0.2.20 → 10.0.1.30 | 3.5.6.7 | iptables thay src IP, lưu mapping vào conntrack table |
| 4 | Route Table (public) | 10.0.1.30 | 3.5.6.7 | Match 0.0.0.0/0 → igw-xxx → forward đến IGW |
| 5 | IGW | 10.0.1.30 → 12.34.56.78 | 3.5.6.7 | NAT 1:1 private → EIP |
| 6 | Internet | 12.34.56.78 | 3.5.6.7 | Server nhận request |
Chiều về (Return):
| # | Vị trí | src | dst | Hành động |
|---|---|---|---|---|
| 1 | Server | 3.5.6.7 | 12.34.56.78 | Gửi response |
| 2 | IGW | 3.5.6.7 | 12.34.56.78 → 10.0.1.30 | NAT 1:1 EIP → private |
| 3 | Route Table (public) | 3.5.6.7 | 10.0.1.30 | Match 10.0.0.0/16 → local |
| 4 | NAT Instance | 3.5.6.7 | 10.0.1.30 → 10.0.2.20 | Tra conntrack, thay dst IP về EC2 gốc |
| 5 | Route Table (private) | 3.5.6.7 | 10.0.2.20 | Match 10.0.0.0/16 → local |
| 6 | EC2 | 3.5.6.7 | 10.0.2.20 | Nhận response |
Giống NAT Gateway, có 2 lần NAT trên đường đi:
- NAT Instance (hop 3): many-to-1 — nhiều EC2 share cùng IP private của NAT Instance, phân biệt nhau bằng source port
- IGW (hop 5): 1-to-1 — EIP mapping cố định
2.4. Security Group cho NAT Instance
Vì NAT Instance là EC2, bạn có thể (và phải) gắn Security Group. Đây vừa là ưu điểm vừa là trách nhiệm.
Security Group tối thiểu cho NAT Instance:
Inbound Rules:
| Type | Port | Source | Mục đích |
|---|---|---|---|
| HTTP | 80 | 10.0.2.0/24 (Private Subnet CIDR) | Cho phép traffic HTTP từ private subnet |
| HTTPS | 443 | 10.0.2.0/24 (Private Subnet CIDR) | Cho phép traffic HTTPS từ private subnet |
| SSH | 22 | Your IP | Quản trị NAT Instance (qua IGW) |
Outbound Rules:
| Type | Port | Destination | Mục đích |
|---|---|---|---|
| HTTP | 80 | 0.0.0.0/0 | Forward traffic HTTP ra internet |
| HTTPS | 443 | 0.0.0.0/0 | Forward traffic HTTPS ra internet |
So sánh: NAT Gateway không hỗ trợ Security Group — bạn chỉ có thể kiểm soát traffic qua NACL. Với NAT Instance, bạn có cả hai lớp bảo vệ: Security Group (stateful, ở tầng instance) + NACL (stateless, ở tầng subnet).
2.5. Port Forwarding — Khả năng NAT Gateway không có
Packet flow ở phần 2.3 mô tả SNAT (Source NAT) — thay đổi source IP để resource trong private subnet gọi được ra internet. Đây là chiều outbound. Port forwarding là chiều ngược lại: DNAT (Destination NAT) cho traffic inbound — khi một packet từ internet đi vào, NAT Instance thay đổi destination của packet để chuyển nó đến đúng một instance trong private subnet.
Vì NAT Instance là một EC2 với quyền kiểm soát iptables đầy đủ, bạn chỉ cần thêm một DNAT rule ở chuỗi PREROUTING là có port forwarding. NAT Gateway thì không: nó là managed service chỉ làm SNAT cho outbound, không có bất kỳ tùy chọn nào để cấu hình rule inbound.
Ví dụ, client từ internet gửi request đến EIP của NAT Instance ở port 3306, iptables sẽ rewrite destination về một instance (hoặc RDS) trong private subnet:
iptables -t nat -A PREROUTING -p tcp --dport 3306 \
-d 10.0.1.30 -j DNAT --to-destination 10.0.2.20:3306Nhờ vậy, một instance không có public IP vẫn có thể được truy cập từ bên ngoài thông qua NAT Instance.
Lưu ý bảo mật: expose trực tiếp database hay service nội bộ ra internet theo cách này khá rủi ro — chỉ nên dùng cho truy cập quản trị có kiểm soát, và siết chặt bằng Security Group + NACL. Để expose một service đúng cách, hãy dùng Load Balancer thay vì DNAT trên NAT Instance.
3. Zonal NAT Gateway — Managed Service
NAT Gateway là lựa chọn mà AWS khuyến nghị mặc định. Thay vì tự quản lý EC2, bạn chỉ cần:
- Tạo NAT Gateway trong public subnet
- Gắn Elastic IP
- Cấu hình route table:
0.0.0.0/0 → nat-xxx
AWS lo toàn bộ phần còn lại: patching, monitoring, scaling, high availability trong AZ. Bandwidth tự scale từ 5 Gbps lên đến 100 Gbps — bạn không cần chọn instance type hay lo bottleneck.
Lưu ý: EC2 trong cùng subnet với NAT Gateway không thể sử dụng nó — chỉ EC2 từ subnet khác mới có thể route traffic qua NAT Gateway. Đây không phải giới hạn kỹ thuật của NAT Gateway, mà là hệ quả từ cách route table hoạt động.
Route table gắn với subnet, và trong một route table, mỗi destination CIDR (dải IP đích) chỉ được có đúng một route — không thể tồn tại hai entry 0.0.0.0/0 cùng lúc. NAT Gateway nằm ở public subnet, nên route table của subnet đó bắt buộc phải có 0.0.0.0/0 → igw-xxx để chính NAT Gateway ra được internet. Muốn một EC2 trong cùng subnet đó đi qua NAT Gateway, bạn phải đổi entry đó thành 0.0.0.0/0 → nat-xxx — nhưng làm vậy sẽ ghi đè mất route ra IGW, khiến ngay cả NAT Gateway cũng không còn đường ra internet, và traffic vòng ngược về chính nó. Hai route này overlap và loại trừ lẫn nhau.
Vì vậy cách giải quyết là tách subnet: NAT Gateway đặt ở public subnet (route table trỏ 0.0.0.0/0 → igw-xxx), còn EC2 cần NAT nằm ở private subnet với route table riêng trỏ 0.0.0.0/0 → nat-xxx. Mỗi subnet có route table độc lập nên hai route không còn xung đột.
Chi tiết về cách NAT Gateway hoạt động (PAT, double NAT, connection tracking) đã được giải thích trong bài AWS VPC: Hiểu VPC qua lăng kính của một Packet — Flow 3: EC2 → Stripe.
Lưu ý quan trọng về High Availability: NAT Gateway có HA tự động trong một AZ. Nếu AZ đó down, NAT Gateway cũng down. Để có HA trên toàn region, bạn cần deploy một NAT Gateway ở mỗi AZ và cấu hình route table tương ứng cho private subnet trong AZ đó. Bạn không cần lo về cross-AZ failover — vì khi một AZ down, các EC2 trong AZ đó cũng down theo, nên chúng không cần NAT nữa.
4. Regional NAT Gateway — Bước tiến mới (2025)
Tháng 11/2025, AWS công bố regional availability mode cho NAT Gateway. Với tính năng này, bạn có thể tạo một NAT Gateway duy nhất tự động mở rộng và thu hẹp theo các Availability Zones (AZs) trong VPC dựa trên sự hiện diện của workload, để duy trì high availability đồng thời đơn giản hóa việc setup và quản lý.
Đây là bước tiến quan trọng vì trước đây, để có HA toàn region, bạn phải tự deploy NAT Gateway ở từng AZ. Giờ AWS đã làm việc đó thay bạn.
4.1. Khác biệt so với Zonal NAT Gateway
1. Không cần Public Subnet
Theo truyền thống, NAT Gateway yêu cầu public subnet (subnet có route trực tiếp ra internet qua IGW) để truy cập internet. Khách hàng quan tâm bảo mật phải đảm bảo không ai tạo tài nguyên khác trong public subnet đó. Với Regional NAT Gateway, VPC không cần public subnet — đây là cải thiện bảo mật rất lớn vì VPC giờ có thể hoàn toàn private mà vẫn có internet egress.
2. Tự động mở rộng theo AZ
Regional NAT Gateway hoạt động ở cấp VPC. Khi bạn mở rộng workload sang AZ mới, bạn có thể tái sử dụng cùng một Regional NAT Gateway ID. Regional NAT Gateway tự động mở rộng và duy trì zonal affinity để đảm bảo high availability.
3. Routing đơn giản hơn
Với Zonal NAT Gateway, bạn phải tạo route table riêng cho từng AZ — mỗi route table trỏ đến NAT Gateway của AZ đó. Với Regional NAT Gateway, chỉ cần 1 route table duy nhất với entry 0.0.0.0/0 → rnat-xxx, dùng chung cho mọi private subnet ở mọi AZ.
4. Hai chế độ vận hành
Regional NAT Gateway hoạt động ở 2 chế độ:
- Automatic mode: AWS quản lý IP address và xử lý các thay đổi AZ tự động — bạn không cần can thiệp gì khi thêm hoặc bớt AZ
- Manual mode: bạn tự quản lý IP address và chịu trách nhiệm điều chỉnh gateway ở từng AZ — phù hợp khi cần kiểm soát chặt danh sách IP egress (ví dụ cho allowlisting)
4.2. Giới hạn
1. Không hỗ trợ Private NAT: Regional NAT Gateway yêu cầu Internet Gateway (IGW) trong VPC — tức là chỉ hỗ trợ public NAT (traffic ra internet). Nếu bạn cần private NAT (traffic nội bộ giữa VPC hoặc đến on-premise), vẫn phải dùng Zonal Private NAT Gateway.
2. Chi phí không giảm đáng kể: Regional NAT Gateway đơn giản hóa vận hành, nhưng chi phí tương đương với việc deploy multi-AZ Zonal NAT Gateway. Nếu mục tiêu là giảm chi phí, nên cân nhắc chuyển sang IPv6 thay vì dùng NAT.
4.3. Khuyến nghị từ AWS
AWS đề xuất chuyển sang Regional NAT Gateway cho tất cả các use case ngoại trừ những trường hợp yêu cầu private connectivity — tính năng mà Regional NAT Gateway chưa hỗ trợ.
5. Bảng so sánh chi tiết
| Tiêu chí | NAT Instance | Zonal NAT Gateway | Regional NAT Gateway |
|---|---|---|---|
| Bản chất | EC2 instance chạy AMI có cấu hình NAT | Dịch vụ managed, hoạt động trong 1 AZ | Dịch vụ managed, hoạt động ở cấp region |
| Quản lý | Bạn tự quản lý (patch, update, monitor) | AWS quản lý toàn bộ | AWS quản lý toàn bộ |
| Tính sẵn sàng (HA) | Không có sẵn — phải tự setup bằng ASG multi-AZ | HA tự động trong 1 AZ | HA tự động trên toàn region (multi-AZ) |
| Băng thông | Phụ thuộc instance type | Tự scale 5–100 Gbps | Tự scale 5–100 Gbps |
| Chi phí | Trả tiền EC2 instance (rẻ hơn với instance nhỏ) | $0.045/giờ + $0.045/GB | Tương đương Zonal NAT Gateway |
| Security Group | Có thể gắn | Không hỗ trợ (chỉ dùng NACL) | Không hỗ trợ (chỉ dùng NACL) |
| Dùng làm Bastion host | Có thể | Không thể | Không thể |
| Port forwarding | Hỗ trợ | Không hỗ trợ | Không hỗ trợ |
| Source/Destination Check | Phải disable thủ công | Không cần (AWS tự xử lý) | Không cần (AWS tự xử lý) |
| Elastic IP | Có thể dùng EIP hoặc public IP | Bắt buộc gắn EIP | Hỗ trợ (tùy chế độ) |
| Public subnet | Bắt buộc | Bắt buộc | Không cần |
| Private NAT | Có thể cấu hình | Hỗ trợ | Chưa hỗ trợ |
| Routing khi multi-AZ | Route table riêng mỗi AZ | Route table riêng mỗi AZ | 1 route table dùng chung |
6. Khi nào nên dùng cái nào?
Dùng Regional NAT Gateway khi:
- Môi trường production cần HA multi-AZ mà không muốn quản lý nhiều NAT Gateway
- Muốn đơn giản hóa routing — chỉ cần 1 route table dùng chung cho mọi AZ
- Muốn tăng cường bảo mật — VPC không cần public subnet
- Khi thêm AZ mới, không muốn phải tạo thêm NAT Gateway và sửa route table
- Đây là lựa chọn mới được AWS khuyến nghị thay thế Zonal NAT Gateway cho hầu hết use case
Dùng Zonal NAT Gateway khi:
- Cần private NAT (traffic nội bộ giữa VPC hoặc đến on-premise) — Regional NAT Gateway chưa hỗ trợ
- Đã có hạ tầng multi-AZ NAT Gateway ổn định và chưa cần migrate
Dùng NAT Instance khi:
- Muốn tiết kiệm chi phí cho môi trường dev/test — một
t3.microchỉ tốn ~$7–8/tháng so với ~$32/tháng cho NAT Gateway (chưa tính data processing) - Cần port forwarding — ví dụ forward port 3306 từ internet đến RDS trong private subnet (NAT Gateway không hỗ trợ)
- Muốn dùng luôn làm bastion host
- Cần kiểm soát traffic chi tiết qua Security Group thay vì chỉ dùng NACL
- Lưu lượng truy cập internet thấp và không đột biến
Tip cho SAA exam: Regional NAT Gateway là topic mới và sẽ xuất hiện trong đề thi. Nhớ các keyword chính: Source/Destination Check (phải tắt cho NAT Instance), Security Group (chỉ NAT Instance hỗ trợ), Regional NAT Gateway (HA multi-AZ tự động, không cần public subnet, 1 route table dùng chung), và Private NAT (chỉ Zonal NAT Gateway hỗ trợ, Regional chưa có).
Tổng kết
Quay lại câu hỏi ban đầu: đồng nghiệp gợi ý dùng NAT Instance cho dev environment — đây là lựa chọn hợp lý nếu bạn chấp nhận trade-off về quản lý và HA để đổi lấy chi phí thấp hơn.
Những điểm cốt lõi:
- NAT Instance là EC2 tự quản lý, phải disable Source/Destination Check vì nó forward packet không thuộc về mình — cả source lẫn destination IP đều không phải IP của nó
- Zonal NAT Gateway là managed service hoạt động trong 1 AZ — AWS lo HA, scaling, patching — nhưng cần deploy ở mỗi AZ để có HA toàn region
- Regional NAT Gateway là bước tiến mới (2025) — HA multi-AZ tự động, không cần public subnet, chỉ cần 1 route table dùng chung cho mọi AZ
- NAT Instance cho phép gắn Security Group, dùng làm bastion host, và hỗ trợ port forwarding — những thứ NAT Gateway không làm được
- Regional NAT Gateway là lựa chọn mới mà AWS khuyến nghị cho hầu hết use case; NAT Instance phù hợp cho dev/test hoặc khi cần tính năng đặc biệt
- Regional NAT Gateway chưa hỗ trợ private NAT — nếu cần private connectivity, vẫn phải dùng Zonal NAT Gateway