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

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:

  1. Đặt trong public subnet — vì nó cần route ra internet qua Internet Gateway (IGW)
  2. Gắn Elastic IP — để internet có thể gửi response về
  3. Disable Source/Destination Check — chi tiết ở phần tiếp theo
  4. Cấu hình route table — private subnet phải có route 0.0.0.0/0 → eni-xxx trỏ đế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 internet

NAT 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:

EntityIP
EC2 (private subnet)10.0.2.20
NAT Instance (public subnet)Private: 10.0.1.30, EIP: 12.34.56.78
Server ngoài internet3.5.6.7

Chiều đi (Outbound):

#Vị trísrcdstHành động
1EC210.0.2.203.5.6.7Tạo packet
2Route Table (private)10.0.2.203.5.6.7Match 0.0.0.0/0 → eni-xxx → forward đến NAT Instance
3NAT Instance10.0.2.2010.0.1.303.5.6.7iptables thay src IP, lưu mapping vào conntrack table
4Route Table (public)10.0.1.303.5.6.7Match 0.0.0.0/0 → igw-xxx → forward đến IGW
5IGW10.0.1.3012.34.56.783.5.6.7NAT 1:1 private → EIP
6Internet12.34.56.783.5.6.7Server nhận request

Chiều về (Return):

#Vị trísrcdstHành động
1Server3.5.6.712.34.56.78Gửi response
2IGW3.5.6.712.34.56.7810.0.1.30NAT 1:1 EIP → private
3Route Table (public)3.5.6.710.0.1.30Match 10.0.0.0/16 → local
4NAT Instance3.5.6.710.0.1.3010.0.2.20Tra conntrack, thay dst IP về EC2 gốc
5Route Table (private)3.5.6.710.0.2.20Match 10.0.0.0/16 → local
6EC23.5.6.710.0.2.20Nhậ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:

TypePortSourceMục đích
HTTP8010.0.2.0/24 (Private Subnet CIDR)Cho phép traffic HTTP từ private subnet
HTTPS44310.0.2.0/24 (Private Subnet CIDR)Cho phép traffic HTTPS từ private subnet
SSH22Your IPQuản trị NAT Instance (qua IGW)

Outbound Rules:

TypePortDestinationMục đích
HTTP800.0.0.0/0Forward traffic HTTP ra internet
HTTPS4430.0.0.0/0Forward 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:3306

Nhờ 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:

  1. Tạo NAT Gateway trong public subnet
  2. Gắn Elastic IP
  3. 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 InstanceZonal NAT GatewayRegional NAT Gateway
Bản chấtEC2 instance chạy AMI có cấu hình NATDịch vụ managed, hoạt động trong 1 AZDị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-AZHA tự động trong 1 AZHA tự động trên toàn region (multi-AZ)
Băng thôngPhụ thuộc instance typeTự scale 5–100 GbpsTự scale 5–100 Gbps
Chi phíTrả tiền EC2 instance (rẻ hơn với instance nhỏ)$0.045/giờ + $0.045/GBTương đương Zonal NAT Gateway
Security GroupCó thể gắnKhông hỗ trợ (chỉ dùng NACL)Không hỗ trợ (chỉ dùng NACL)
Dùng làm Bastion hostCó thểKhông thểKhông thể
Port forwardingHỗ trợKhông hỗ trợKhông hỗ trợ
Source/Destination CheckPhải disable thủ côngKhông cần (AWS tự xử lý)Không cần (AWS tự xử lý)
Elastic IPCó thể dùng EIP hoặc public IPBắt buộc gắn EIPHỗ trợ (tùy chế độ)
Public subnetBắt buộcBắt buộcKhông cần
Private NATCó thể cấu hìnhHỗ trợChưa hỗ trợ
Routing khi multi-AZRoute table riêng mỗi AZRoute table riêng mỗi AZ1 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.micro chỉ 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

Liên quan