NAT & Port Forwarding — một IP công cộng cho nhiều máy
NAT cho nhiều máy private dùng chung một IP public: SNAT đổi nguồn khi đi ra, DNAT mở cổng đi vào, vì sao reply về đúng máy và NAT phá giao thức nào.
TL;DR: NAT (Network Address Translation, dịch địa chỉ mạng) cho nhiều máy IP private dùng chung một IP public. Khi máy ra Internet, router SNAT/MASQUERADE đổi địa chỉ nguồn private → public, ghi nhớ mapping (kèm cổng) để reply về đúng máy. Chiều ngược lại, DNAT/port forwarding đưa kết nối từ ngoài vào đúng máy:cổng nội bộ, tức tính năng "mở cổng" trên router gia đình. NAT giải bài toán cạn IPv4 nhưng phá kết nối đến từ ngoài (phải mở cổng tường minh) và một số giao thức. Hai chiều đó, đi ra và mở cổng vào, là toàn bộ NAT của mọi mạng nội bộ.
Nhà bạn có chục thiết bị (laptop, điện thoại, TV…) nhưng nhà mạng chỉ cấp một IP public. Cả chục thiết bị cùng lướt web qua một địa chỉ. Vậy khi trả lời về, làm sao router biết gói nào của laptop, gói nào của điện thoại? Và khi bạn muốn chạy một web server trên máy nhà rồi cho bạn bè ở xa truy cập, vì sao phải vào router "mở cổng 8080" thì họ mới vào được?
Cả hai câu trả lời là NAT. Bài này tách rõ hai chiều của NAT, đi ra (SNAT) và đi vào (DNAT), rồi nối thẳng tới cách port forwarding hoạt động trên router thật.
1. Analogy — Tổng đài nội bộ công ty
Tiếp nối hình ảnh "số phòng nội bộ vs địa chỉ toà nhà" ở bài IP: công ty có một số điện thoại công khai, nhưng hàng trăm máy lẻ bên trong. Tổng đài (lễ tân) làm hai việc:
- Gọi đi: nhân viên phòng 305 gọi ra → tổng đài hiện số công ty, ghi sổ "cuộc này của máy lẻ 305". Khi đối tác gọi lại đúng cuộc đó, tổng đài nối về 305.
- Gọi đến: khách gọi số công ty + bấm nhánh "108" → tổng đài nối tới đúng phòng 108.
| Tổng đài | NAT |
|---|---|
| Một số công khai cho cả công ty | Một IP public cho cả LAN |
| Ghi sổ "cuộc này của máy 305" | NAT table (mapping nguồn) |
| Nối cuộc gọi lại về đúng 305 | SNAT (reply về đúng máy) |
| Khách bấm nhánh 108 → phòng 108 | DNAT / port forwarding |
2. NAT cơ bản — dịch địa chỉ + ghi sổ
NAT đứng ở router biên (giữa LAN và Internet). Mỗi kết nối đi ra, NAT đổi địa chỉ và ghi vào NAT table để biết đường về. Mấu chốt là dùng cả cổng để phân biệt: nhiều máy private chung một IP public, nhưng mỗi kết nối được gán một cổng nguồn khác nhau; kỹ thuật này gọi là PAT (Port Address Translation) hay NAPT (Network Address Port Translation), tức NAT có dùng thêm cổng để tách các kết nối.
NAT table (ví dụ): ánh xạ kết nối nội bộ ↔ cổng public
Reply về cổng 40002 → router biết trả cho 192.168.1.11
Bảng này phục vụ cả hai chiều; xét chiều đi ra trước.
3. SNAT / MASQUERADE — chiều đi ra (egress)
Khi máy nội bộ ra Internet, router rewrite địa chỉ nguồn từ private → public, nhớ mapping, rồi rewrite ngược khi reply về:

- SNAT (Source NAT): đổi địa chỉ nguồn (source) của gói đi ra.
- MASQUERADE: một dạng SNAT đặc biệt dùng khi IP public động (đổi theo đường truyền). Thay vì cấu hình cứng một IP public, router tự lấy IP hiện tại của network interface (card mạng vật lý/ảo nối ra ngoài) tại thời điểm gửi. Router gia đình dùng đúng MASQUERADE vì nhà mạng hay đổi IP public.
4. DNAT / port forwarding — chiều đi vào (inbound)
Mặc định, máy ngoài không vào được máy nội bộ (private vô hình với Internet). Để mở đường, cấu hình DNAT: "ai gõ vào IP_public:cổng thì chuyển tới máy_nội_bộ:cổng".

- DNAT (Destination NAT): đổi địa chỉ đích (destination) của gói đi vào.
- Tính năng "mở cổng 8080" trên router gia đình là đúng rule này: bạn khai báo một rule DNAT "khi có ai vào
IP_public:8080thì chuyển tới192.168.1.10:80" (máy chạy web server trong nhà). Người ngoài gõIP_public:8080→ router DNAT đổi đích → gói vào đúng máy nội bộ cổng 80.
Thử ngẫmbạn có hai web server trong nhà, 192.168.1.10:80 và 192.168.1.11:80, nhưng chỉ một IP public. Có mở cả hai ra ngoài cùng lúc được không, và rule DNAT phải khác nhau ở chỗ nào?
5. Vì sao NAT phá một số giao thức?
NAT tiện nhưng có giá:
- Kết nối đến từ ngoài bị chặn mặc định: phải mở cổng (DNAT) tường minh. Vì thế một service trong nhà chỉ nhận được request từ Internet sau khi bạn cấu hình port forwarding trên router.
- Một số giao thức nhúng địa chỉ IP trong payload (FTP active, SIP): NAT đổi header nhưng không đổi IP trong nội dung → hỏng, cần "NAT helper" riêng.
- P2P khó: hai máy đều sau NAT, không bên nào có cổng vào sẵn → cần kỹ thuật "hole punching" hoặc server trung gian (TURN).
Truy cập IP public của chính mình từ bên trong LAN (vd gõ public IP để vào server nhà từ trong nhà) đôi khi hỏng, vì gói không thực sự ra ngoài để được NAT đúng cách, gọi là vấn đề hairpin/loopback NAT. Trong LAN nên gọi nhau bằng IP private.
Thử ngẫmhai người bạn ở hai nhà, đều sau NAT và chưa mở cổng, muốn chơi game nối thẳng P2P. Vì sao "gõ IP nhà kia" không chạy, và ứng dụng game phải xử lý thêm gì?
6. Pitfall — hiểu nhầm thường gặp
❌ Nhầm 1: "NAT là bức tường lửa, đủ bảo vệ rồi." ✅ NAT che máy nội bộ (không có cổng vào) như tác dụng phụ, nhưng không phải firewall. Một khi đã mở cổng (DNAT) hoặc máy nội bộ chủ động kết nối ra, traffic vẫn đi qua. Vẫn cần firewall/quy tắc riêng.
❌ Nhầm 2: "Chạy service trong nhà là người ngoài Internet truy cập được ngay." ✅ Không. Khi chưa có rule DNAT (chưa mở cổng/port forwarding trên router), traffic từ ngoài không có đường vào máy nội bộ. DNAT là bước bắt buộc để công khai một service ra Internet.
❌ Nhầm 3: "Nhiều máy chung một IP public thì reply sẽ lẫn lộn." ✅ Không, vì NAT phân biệt bằng cổng (PAT): mỗi kết nối map sang một cổng public riêng. Reply về cổng nào, router tra NAT table biết trả cho máy nào.
7. 📚 Deep Dive — tài liệu gốc
Đọc khi muốn tới gốc NAT:
- RFC 3022 — Traditional IP Network Address Translator (NAT): định nghĩa NAT/NAPT cổ điển.
- RFC 2663 — NAT Terminology and Considerations: thuật ngữ SNAT/DNAT và những thứ NAT phá.
Ghi chú: NAT vốn là giải pháp tạm cho cạn IPv4 nhưng đã thành nền tảng mọi mạng nội bộ (nhà, doanh nghiệp, cloud). Trên Linux, các rule NAT này được hiện thực bằng iptables -t nat (hoặc nftables); bạn có thể xem chúng trực tiếp trên router/host.
8. Tóm tắt
- NAT cho nhiều máy IP private dùng chung một IP public, phân biệt kết nối bằng cổng (PAT/NAPT) và ghi NAT table để biết đường về.
- SNAT/MASQUERADE = chiều đi ra: đổi địa chỉ nguồn private → public; MASQUERADE dùng khi IP public động (router gia đình dùng cái này).
- DNAT / port forwarding = chiều đi vào: đổi địa chỉ đích, đưa
public:cổngtớinội_bộ:cổng, tức tính năng "mở cổng" trên router. - NAT phá: kết nối từ ngoài bị chặn mặc định (phải mở cổng), giao thức nhúng IP (FTP/SIP), P2P; cẩn thận hairpin NAT trong LAN.
- NAT che máy nội bộ nhưng không phải firewall; vẫn cần quy tắc bảo mật riêng.
9. Tự kiểm tra
- Q1Cả chục thiết bị trong nhà chung một IP public. Khi các reply trở về, làm sao router biết gói nào của thiết bị nào?
- Q2Phân biệt SNAT và DNAT theo 'đổi địa chỉ nào' và 'chiều nào'.
- Q3Bạn mở cổng 8080 trên router, trỏ về máy nhà 192.168.1.10 cổng 80. Cơ chế NAT nào được dùng, và một request từ Internet tới IP_public:8080 đi thế nào?
- Q4Vì sao mặc định một máy nội bộ sau NAT không nhận được kết nối đến từ ngoài?
- Q5Vì sao nói 'NAT che máy nội bộ nhưng không phải firewall'?
- Q6Vì sao nói hiểu SNAT/DNAT là nắm được cả hai chiều traffic của một mạng nội bộ?
Bài tiếp theo: ICMP & chẩn đoán — ping và traceroute thực sự làm gì
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Routing & default gateway — gói tin nhảy hop thế nào
Bài tiếpICMP & chẩn đoán — ping và traceroute thực sự làm gì
Thảo luận & góp ý
Hỏi đáp về bài này