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/MASQUERADE rewrite nguồn khi đi ra, DNAT/port forwarding mở đường đi vào. Hiểu vì sao reply về đúng máy, vì sao mở cổng trên router cho phép truy cập từ ngoài, và vì sao NAT phá một số giao thức.
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 port) để 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:port nội bộ — đây chính là 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. Hiểu NAT là hiểu cả chiều đi ra (egress) lẫn chiều mở cổng vào 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) — và 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ả port để 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 port 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 port để tách các kết nối.
NAT table (ví dụ) — ánh xạ kết nối nội bộ ↔ port public
Reply về cổng 40002 → router biết trả cho 192.168.1.11
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ề:
flowchart LR
A["Laptop<br/>192.168.1.10:51001"] -->|"goi di"| R["Router NAT<br/>ghi NAT table"]
R -->|"doi nguon"| S["Server thay<br/>public:40001"]
S -->|"reply"| R
R -->|"tra dung may"| A- 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 (cổng mạng vật lý/ảo 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".
flowchart LR
C["Client ngoai<br/>-> 113.161.45.20:8080"] --> R["Router DNAT<br/>doi dich -> 192.168.1.10:80"]
R --> A["Web server noi bo<br/>192.168.1.10:80"]- DNAT (Destination NAT): đổi địa chỉ đích (destination) của gói đi vào.
- Đây chính xác là tính năng "mở cổng 8080" trên router gia đình: 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.
5. Vì sao NAT phá một số thứ
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. Đây là lý do 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.
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 port (PAT): mỗi kết nối map sang một port 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 port (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— chính là 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'.▸
- SNAT (Source NAT): đổi địa chỉ nguồn, dùng cho traffic đi ra (private → public). MASQUERADE là SNAT khi IP public động.
- DNAT (Destination NAT): đổi địa chỉ đích, dùng cho traffic đi vào (public:cổng → nội_bộ:cổng) — tức port forwarding.
Nhớ gọn: ra ngoài đổi nguồn (SNAT), vào trong đổi đích (DNAT).
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?▸
IP_public:8080 thì đổi đích thành 192.168.1.10:80". Request từ Internet tới IP_public:8080 đến router → router đổi địa chỉ đích thành 192.168.1.10:80 rồi chuyển vào LAN → web server trên máy nhà lắng nghe cổng 80 nhận được. Không có rule DNAT này, traffic từ ngoài không có đường vào máy nội bộ vì IP private vô hình với Internet.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?▸
-p) tường minh để định nghĩa "public:cổng này → máy nội bộ nào".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ộ?▸
public:cổng sang nội_bộ:cổng. Nắm hai loại NAT này là hiểu trọn cơ chế vào/ra của bất kỳ mạng sau NAT nào, từ router nhà tới cloud VPC.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?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên