Trong series: DevOps
  1. 1 API Gateway là gì? Cổng vào thống nhất cho Microservices
  2. 2 NAT là gì? Network Address Translation trong mạng máy tính
  3. 3 GitLab CI/CD là gì? Pipeline tự động hóa build, test và deploy
  4. 4 Kafka là gì? Nền tảng Event Streaming phân tán cho hệ thống lớn
  5. 5 Serverless là gì? FaaS, Cold Start và khi nào nên dùng Serverless
  6. 6 Subnet và CIDR là gì? Chia mạng IP và định tuyến hiện đại
  7. 7 Kubernetes là gì? Nền tảng điều phối container phổ biến nhất hiện nay
  8. 8 Proxy là gì? Forward Proxy, Reverse Proxy và SOCKS5
  9. 9 Nginx là gì? Web server, reverse proxy và load balancer trong một
✦ Tóm tắt nhanh
NAT (Network Address Translation) là kỹ thuật chuyển đổi địa chỉ IP cho phép nhiều thiết bị dùng chung một IP công cộng. Tìm hiểu cơ chế PAT, Static NAT, Dynamic NAT và cách NAT hoạt động trong router...
Bài này thế nào?

NAT (Network Address Translation) là kỹ thuật mạng cho phép hàng triệu thiết bị trong nhà và văn phòng cùng chia sẻ một địa chỉ IP công cộng duy nhất — giải pháp thực tế cho bài toán cạn kiệt IPv4. Bài viết giải thích NAT là gì, cơ chế PAT, và cách NAT hoạt động trong router gia đình, cloud VPC và Docker.

NAT là gì?

NAT (Network Address Translation) là quá trình router hoặc firewall chuyển đổi địa chỉ IP trong header của packet khi packet đi qua thiết bị đó. Mục tiêu ban đầu: cho phép nhiều thiết bị trong mạng nội bộ dùng chung một địa chỉ IP công cộng.

Năm 1996, IANA dự báo IPv4 sẽ cạn kiệt — và họ đúng (thực tế xảy ra vào năm 2011). NAT là "phao cứu sinh" kéo dài tuổi thọ của IPv4 thêm 15+ năm bằng cách tách biệt không gian địa chỉ riêng khỏi internet công cộng.

Private IP ranges (không route được trên internet):

  • 10.0.0.0/8 — Class A, lên đến 16 triệu địa chỉ nội bộ
  • 172.16.0.0/12 — Class B, dành cho mạng doanh nghiệp vừa
  • 192.168.0.0/16 — Class C, phổ biến trong mạng gia đình (65,536 địa chỉ)

Thiết bị trong mạng nội bộ có thể dùng bất kỳ địa chỉ nào trong các dải này mà không cần đăng ký với IANA, vì chúng không bao giờ xuất hiện trực tiếp trên internet công cộng.

Kiểm tra IP của bạn đang ở dải nào

Chạy ip addr (Linux) hoặc ipconfig (Windows) để xem private IP. Nếu thấy địa chỉ bắt đầu bằng 10., 172.16–31., hoặc 192.168. — bạn đang ở sau NAT. Dùng curl ifconfig.me để xem public IP thực sự mà router đang dùng để giao tiếp với internet.

3 Loại NAT phổ biến

Static NAT (NAT tĩnh)

Ánh xạ 1-to-1 cố định: một private IP luôn tương ứng với một public IP cố định. Phù hợp cho web server, mail server cần địa chỉ cố định để người dùng bên ngoài có thể kết nối vào.

Ví dụ: 192.168.1.10203.0.113.10 (cố định, luôn luôn)

Dynamic NAT (NAT động)

Router duy trì một pool nhiều public IP và cấp tạm thời cho thiết bị khi cần. Khi thiết bị ngắt kết nối, IP được trả lại pool. Ít phổ biến hiện nay vì vẫn cần nhiều public IP.

PAT — Port Address Translation (NAT Masquerade)

Đây là loại phổ biến nhất — nhiều private IP dùng chung một public IP, phân biệt nhau bằng port number. Còn gọi là "IP Masquerading" trên Linux hay "NAT Overload" trên Cisco.

99% home router và hầu hết corporate router dùng PAT. Một router gia đình với một public IP có thể phục vụ hàng chục thiết bị đồng thời nhờ cơ chế này.

Cơ chế PAT hoạt động chi tiết

Khi máy tính 192.168.1.10 gửi DNS request đến 8.8.8.8:53:

  1. Packet gốc: src=192.168.1.10:52341, dst=8.8.8.8:53
  2. Router thay thế: src=203.0.113.1:40001, dst=8.8.8.8:53
  3. Router lưu vào NAT table: 192.168.1.10:52341 ↔ 203.0.113.1:40001
  4. DNS response về: dst=203.0.113.1:40001
  5. Router tra NAT table → forward về 192.168.1.10:52341

NAT table là bộ nhớ trạng thái (stateful) — router theo dõi mọi connection đang hoạt động. Khi connection kết thúc hoặc timeout, entry được xóa.

NAT table có giới hạn — cẩn thận với connection flood

Router/firewall lưu mỗi TCP/UDP session vào NAT table với bộ nhớ hữu hạn. Khi bảng đầy (thường gặp với DDoS, port scanner, hoặc ứng dụng tạo hàng nghìn connection ngắn), các connection mới bị drop im lặng — không có thông báo lỗi rõ ràng. Trên Linux kiểm tra giới hạn bằng sysctl net.netfilter.nf_conntrack_max và mức sử dụng hiện tại bằng conntrack -C.

NAT trên Linux với iptables

Linux có thể hoạt động như một NAT router với iptables. Đây là cấu hình phổ biến cho home lab hoặc cloud instance làm gateway:

Bash
 1# Bật IP forwarding (cho phép Linux forward packet giữa các interface)
 2echo 1 > /proc/sys/net/ipv4/ip_forward
 3
 4# Cố định qua sysctl
 5echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
 6sysctl -p
 7
 8# NAT Masquerade: traffic từ mạng nội bộ ra internet qua eth0
 9iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
10
11# Port forwarding (DNAT): chuyển port 8080 bên ngoài vào 192.168.1.10:80
12iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
13  -j DNAT --to-destination 192.168.1.10:80
14iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
15
16# Lưu rules để tồn tại qua reboot
17iptables-save > /etc/iptables/rules.v4

Để xem NAT table hiện tại:

Bash
1# Xem connection tracking table (conntrack)
2conntrack -L
3# hoặc
4cat /proc/net/nf_conntrack
5
6# Xem iptables NAT rules
7iptables -t nat -L -n -v

NAT trong Docker

Docker tự động tạo NAT rules khi khởi động container trong bridge network:

Bash
1# Docker bridge network tự động tạo NAT rules
2docker network inspect bridge
3
4# Xem iptables rules Docker tạo ra
5sudo iptables -t nat -L DOCKER -n -v
6
7# Port mapping (-p 8080:80) tạo DNAT rule
8docker run -p 8080:80 nginx
9# Tương đương: iptables DNAT :8080 → 172.17.0.2:80

Container trong bridge network nhận IP từ dải 172.17.0.0/16 theo mặc định. Khi container gửi traffic ra ngoài, Docker host thực hiện MASQUERADE thay IP container bằng IP của host.

NAT trong Cloud (AWS VPC)

AWS VPC sử dụng NAT Gateway để cho private subnet có thể truy cập internet mà không cần public IP:

Luồng traffic: Private subnet EC2 → NAT Gateway (trong public subnet) → Internet Gateway → Internet

Đặc điểm AWS NAT Gateway:

  • Có Elastic IP (static public IP) — cần whitelist ở phía đối tác
  • Managed service — AWS tự scale, không cần quản lý
  • Tính phí theo giờ ($0.045/giờ) + data processed ($0.045/GB)
  • High availability trong một AZ — cần tạo NAT Gateway trong mỗi AZ để redundancy
Chi phí AWS NAT Gateway tăng nhanh với multi-AZ

Để đạt redundancy thực sự, bạn cần một NAT Gateway riêng cho mỗi Availability Zone — vì NAT Gateway chỉ HA trong AZ của nó. Với 3 AZ, chi phí nhân 3: $0.045 × 3 = $0.135/giờ ($97/tháng) chưa tính data. Với workload nhỏ hoặc dev environment, dùng một NAT Gateway duy nhất và chấp nhận rủi ro AZ failure là lựa chọn phổ biến để tiết kiệm.

Terraform example:

hcl
 1resource "aws_eip" "nat" {
 2  domain = "vpc"
 3}
 4
 5resource "aws_nat_gateway" "main" {
 6  allocation_id = aws_eip.nat.id
 7  subnet_id     = aws_subnet.public.id
 8}
 9
10> [Subnet  CIDR  gì? Chia mạng IP  định tuyến hiện đại](/subnet-cidr-la-gi/)
11
12
13resource "aws_route" "private_internet" {
14  route_table_id         = aws_route_table.private.id
15  destination_cidr_block = "0.0.0.0/0"
16  nat_gateway_id         = aws_nat_gateway.main.id
17}

Vấn đề của NAT: NAT Traversal

NAT chặn inbound connections — thiết bị bên ngoài không thể chủ động kết nối vào thiết bị sau NAT vì không biết private IP là gì. Đây là vấn đề với:

  • VoIP & Video call: WebRTC cần kết nối P2P trực tiếp. Giải pháp: STUN (phát hiện public IP/port) + TURN (relay server khi P2P không được) + ICE framework
  • P2P gaming: Game console sau NAT cần "hole punching" — cả hai bên cùng gửi packet để mở cổng trong NAT table
  • Self-hosted server: Cần port forwarding hoặc VPN reverse tunnel (như Cloudflare Tunnel, ngrok)
  • Symmetric NAT: Dạng NAT khắt khe nhất — dùng port khác nhau cho mỗi destination, làm WebRTC khó hoạt động hơn

VPN là gì? Mạng riêng ảo, WireGuard và OpenVPN

NAT64: Cầu nối IPv4 ↔ IPv6

Khi internet dần chuyển sang IPv6, NAT64 cho phép client IPv6 kết nối đến server IPv4:

  • Client IPv6 → NAT64 gateway → Server IPv4
  • NAT64 gateway dịch IPv6 packet thành IPv4 và ngược lại
  • Kết hợp với DNS64 để resolve tên miền IPv4-only thành địa chỉ IPv6 tổng hợp

Kubernetes là gì? Container orchestration và Pod networking

Câu hỏi thường gặpQ&A
NAT là gì ngắn gọn?
NAT (Network Address Translation) là kỹ thuật cho phép router chuyển đổi địa chỉ IP riêng (private IP) của các thiết bị trong mạng nội bộ thành một địa chỉ IP công cộng (public IP) duy nhất khi giao tiếp với internet. Đây là lý do tại sao hàng tỷ thiết bị có thể kết nối internet dù IPv4 chỉ có ~4.3 tỷ địa chỉ.
PAT khác Static NAT thế nào?
Static NAT ánh xạ cố định một private IP sang một public IP — thường dùng cho server cần truy cập từ internet. PAT (Port Address Translation), còn gọi là NAT Masquerade, ánh xạ nhiều private IP sang MỘT public IP bằng cách phân biệt qua port number — đây là loại NAT phổ biến nhất trong router gia đình và doanh nghiệp.
NAT có ảnh hưởng đến hiệu năng không?
Có, nhưng thường không đáng kể với phần cứng hiện đại. Router phải duy trì NAT translation table và tra cứu mỗi packet. Vấn đề thực sự của NAT là: (1) NAT traversal phức tạp cho P2P/VoIP/gaming cần kết nối inbound; (2) Full Cone NAT vs Symmetric NAT ảnh hưởng đến WebRTC; (3) NAT table có giới hạn số lượng connection đồng thời.
Docker dùng NAT như thế nào?
Docker bridge network mặc định dùng NAT (iptables MASQUERADE) để container có internet access. Container nhận private IP trong dải 172.17.0.0/16. Khi container gửi packet ra ngoài, Docker daemon dùng iptables MASQUERADE để thay source IP của container bằng IP của Docker host. Port mapping (-p 8080:80) tạo DNAT rule chuyển traffic đến container.
IPv6 có còn cần NAT không?
Về lý thuyết, không — IPv6 có 340 undecillion địa chỉ, đủ cấp cho mỗi nguyên tử trên Trái Đất. Tuy nhiên NAT66 (NAT cho IPv6) vẫn tồn tại trong một số triển khai doanh nghiệp vì lý do bảo mật (ẩn cấu trúc mạng nội bộ) hoặc khi ISP chỉ cấp một prefix IPv6 nhỏ. Xu hướng là dùng IPv6 end-to-end không cần NAT.
NAT traversal là gì?
NAT traversal là tập hợp kỹ thuật cho phép hai thiết bị phía sau NAT kết nối trực tiếp với nhau — vì NAT chặn inbound connection. Các kỹ thuật phổ biến: STUN (phát hiện public IP/port), TURN (relay server khi direct không được), ICE (framework kết hợp STUN+TURN dùng trong WebRTC). VoIP, WebRTC, peer-to-peer game đều cần NAT traversal.