Nền tảng Mạng máy tính/NAT & Port Forwarding — một IP công cộng cho nhiều máy
10/17
Bài 10 / 17~22 phútĐịa chỉ & Định tuyếnMiễn phí lượt xem

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 đàiNAT
Một số công khai cho cả công tyMộ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 305SNAT — reply về đúng máy
Khách bấm nhánh 108 → phòng 108DNAT / 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ỉ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

192.168.1.10:51001 ↔ 113.161.45.20:40001
192.168.1.11:52050 ↔ 113.161.45.20:40002
192.168.1.10:51002 ↔ 113.161.45.20:40003

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:8080 thì chuyển tới 192.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).
⚠️ Hairpin NAT

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

📚 Spec & reference chính thức

Đọc khi muốn tới gốc NAT:

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ổng tới nộ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

Tự kiểm tra
Q1
Cả 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?
Nhờ port (kỹ thuật PAT/NAPT). Mỗi kết nối đi ra được NAT map sang một port public riêng và ghi vào NAT table (vd 192.168.1.10:51001 ↔ public:40001). Reply về cổng public nào, router tra bảng là biết trả cho máy private nào. Một IP public + nhiều port = phân biệt được rất nhiều kết nối đồng thời.
Q2
Phâ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).

Q3
Bạ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?
Đây là một rule DNAT (port forwarding): "ai và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.
Q4
Vì 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?
Vì máy đó mang IP private, vô hình với Internet — không có địa chỉ public nào trỏ tới nó. NAT table chỉ có mapping cho các kết nối do nội bộ chủ động mở ra; một kết nối đến bất ngờ từ ngoài không khớp mapping nào nên router không biết chuyển cho ai, bỏ gói. Muốn nhận, phải tạo DNAT (mở cổng / -p) tường minh để định nghĩa "public:cổng này → máy nội bộ nào".
Q5
Vì sao nói 'NAT che máy nội bộ nhưng không phải firewall'?
NAT khiến máy nội bộ không có cổng vào sẵn từ Internet — một tác dụng phụ giống như được ẩn đi. Nhưng đó không phải kiểm soát bảo mật chủ đích: khi bạn đã mở cổng (DNAT) hoặc khi máy nội bộ chủ động kết nối ra, traffic vẫn đi qua NAT bình thường, không bị lọc theo chính sách. Bảo mật thật cần firewall với quy tắc rõ ràng (cho/chặn theo IP, port, hướng) — NAT không thay thế được.
Q6
Vì 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ộ?
Mọi mạng nội bộ có hai chiều, mỗi chiều là một loại NAT. Chiều đi ra (máy nội bộ chủ động kết nối Internet) = SNAT/MASQUERADE — router đổi nguồn từ IP private sang IP public, ghi NAT table để reply về đúng máy. Chiều đi vào (cho phép người ngoài truy cập một service nội bộ) = DNAT/port forwarding — router đổi đích từ 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

Đặt 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