NAT (Network Address Translation) là gì? Tại sao backend có thể ra Internet mà không có IP public?
Trong thực tế triển khai backend trong môi trường cloud (AWS, GCP, Azure), chúng ta thường xếp các service backend vào private subnet để đảm bảo an toàn. Tuy nhiên, các service này vẫn cần gọi request ra ngoài (gửi webhook, gọi mail, truy cập API bên ngoài như Stripe, Mongo Atlas, S3, v.v.). Vậy làm sao chúng vẫn kết nối ra Internet mà không có IP public?
1. NAT là gì?
NAT (Network Address Translation) là kỹ thuật cho phép các máy trong mạng private (IP riêng) gửi request ra ngoài mà không cần IP public. NAT sẽ thay đổi ("dịch") địa chỉ IP nguồn trước khi request ra Internet, và duy trì một bảng mapping để khi có phản hồi quay lại thì forward đúng về máy gốc.
Nó giống như một cổng dịch đứng giữa service của bạn và Internet.
2. Phân loại NAT
a. SNAT (Source NAT)
- Thay đổi IP nguồn của packet trước khi gửi ra ngoài.
- Dùng trong tình huống: service backend gửi request ra Internet.
b. DNAT (Destination NAT)
- Thay đổi IP đích khi packet được nhận.
- Dùng khi muốn forward request từ Internet vào service nội bộ.
Trong cloud, SNAT thường được sử dụng hơn DNAT.
3. Tình huống: Gọi API từ private subnet trong AWS
Giả sử:
- VPC có 2 subnet:
public-subnet
vàprivate-subnet
- EC2 A trong
private-subnet
(không có public IP) - EC2 B/NAT Gateway trong
public-subnet
(có Elastic IP)
Bước 1: EC2 A gửi request đến Internet
- Nó sẽ gửi packet ra route table
- Route table của
private-subnet
được cấu hình:0.0.0.0/0 → NAT Gateway
Bước 2: NAT Gateway dịch IP
- NAT thay IP nguồn (vd:
10.0.1.10
) thành Elastic IP (vd:54.12.34.56
) - Gửi request ra Internet
Bước 3: Phản hồi quay lại NAT
- Response được NAT forward về IP gốc
4. NAT Gateway vs NAT Instance (AWS)
Tính năng | NAT Gateway | NAT Instance (EC2) |
---|---|---|
Quản lý | Fully managed | Tự cài đặt |
Tự động scale | Có (multi-AZ, HA) | Tự scale, phụ thuộc EC2 |
Chi phí | Theo data transfer + giờ | Theo EC2 + bandwidth |
Bồ sung bảo mật | Chặn port inbound mặc định | Phải cài iptables, route |
Khuyên dùng: NAT Gateway cho hầu hết use-case trừ khi muốn tiết kiệm chi phí cực đối.
5. NAT trong Docker và Kubernetes
Docker
Mỗi container chạy trong Docker bridge network thường dùng NAT để truy cập Internet.
$ docker run busybox ping google.com
# container (172.x.x.x) NAT qua IP host để ra ngoài
Kubernetes
Khi pod gửi request ra ngoài cluster, NAT được thực hiện bởi kube-proxy hoặc CNI plugin (vd: Calico, Cilium).
Trong cloud, IP outbound của pod có thể đi qua NAT Gateway (AWS), Cloud NAT (GCP)...
6. Bạn cần NAT khi nào?
Tình huống | Có cần NAT? |
---|---|
Service trong private subnet gọi API | ✅ Cần |
Service đã có public IP | ❌ Không cần |
Gọ i webhook từ bên ngoài vào | ❌ NAT không dùng |
Container trong local/Docker | ✅ Có (mặc định) |
7. Thực hành: Dùng NAT Gateway trong AWS
Bước 1: Tạo VPC và 2 subnet
public-subnet
: đính tuyến qua Internet Gatewayprivate-subnet
: đính tuyến qua NAT Gateway
Bước 2: Tạo NAT Gateway
- Gắn vào public subnet
- Gắn Elastic IP
Bước 3: Tạo route table cho private subnet
Destination Target
0.0.0.0/0 NAT Gateway
Bước 4: Launch EC2 trong private subnet
- Không có public IP
- SSH vào qua bastion hoặc SSM
Bước 5: Kiểm tra truy cập Internet
curl https://api.github.com
# → hoạt động
8. Kết luận
- NAT là kỹ thuật cốt lõi trong mạng backend modern
- Giúc service trong mạng private gọi request ra Internet mà vẫn an toàn
- AWS cung cấp NAT Gateway và NAT Instance: đơn giản hay tuỳ chọn tuỳ nhu cầu
- Đừng quên NAT chỉ dùng được cho outbound traffic!
✨ Một backend private subnet không có NAT giống như người trong phòng cách âm – không bao giờ gọi đięn ra ngoài. Đừng quên trang bị cho chúng trước khi quá muộn.