NAT (Network Address Translation) là gì? Tại sao backend có thể ra Internet mà không có IP public?

0 0 0

Người đăng: hiệp nguyễn

Theo Viblo Asia

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-subnetprivate-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 Gateway
  • private-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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Javascrpit clean code

Konnichiwa mina-san, hôm nay mình sẽ giới thiệt một số tips để code các bạn được clean hơn. . Variables. Functions.

0 0 37

- vừa được xem lúc

Code tốt hơn bằng cách làm theo các phương pháp hay nhất về JavaScript này

Cho dù bạn là một nhà phát triển dày dặn kinh nghiệm đang tìm cách tinh chỉnh phong cách viết mã của mình hay một người mới bắt đầu mong muốn nắm bắt các yếu tố cần thiết, bài đăng này là dành cho bạn

0 0 29

- vừa được xem lúc

TypeScript Clean Code

TypeScript tricks for Clean Code. Chúng ta sẽ khám phá 10 TypeScript ticks để viết mã sạch, kèm theo các ví dụ minh họa cách chúng hoạt động và lý do chúng hữu ích.

0 0 15

- vừa được xem lúc

[Clean code] Source code hoàn hảo thì không có quá nhiều comments?

Thông qua chương 4 cuốn Clean code - Robert C.Martin sẽ phần nào giải đáp câu hỏi trên.

0 0 6

Clean Architecture là gì - Ưu nhược và cách dùng hợp lý

Clean Architecture là gì - Ưu nhược và cách dùng hợp lý. Clean Architecture là một kiến trúc ứng dụng nổi tiếng, dựa trên nguyên lý loại bỏ sự lệ thuộc giữa các đối tượng cũng như các layer trong ứng

0 0 0

Làm Chủ Strict Mode Trong TypeScript — Biến Trình Biên Dịch Thành "Code Reviewer"

Làm Chủ Strict Mode Trong TypeScript — Biến Trình Biên Dịch Thành "Code Reviewer". Bạn viết TypeScript nhưng vẫn để trình biên dịch dễ dãi như JavaScript? Vậy đã đến lúc bạn làm quen với Strict Mode —

0 0 0