Giải thích chi tiết giao thức NAT (network layer)
Nhiều thiết bị trong mạng gia đình và mạng nội bộ công ty sử dụng private IP, chẳng hạn như 192.168.x.x, 10.x.x.x. Các địa chỉ này không thể được định tuyến trực tiếp trên public network, nhưng thiết bị trong mạng nội bộ vẫn có thể truy cập Internet.
Đằng sau việc này thường có NAT hoạt động. NAT chuyển đổi giữa địa chỉ mạng nội bộ và địa chỉ public, giúp nhiều thiết bị trong mạng nội bộ dùng chung một hoặc một số ít public IP để giao tiếp ra bên ngoài.
Bài viết này chủ yếu trả lời các câu hỏi sau:
- NAT chủ yếu giải quyết vấn đề gì?
- NAT translation table ghi lại địa chỉ mạng nội bộ, địa chỉ public và ánh xạ port như thế nào?
- Khi host trong mạng nội bộ truy cập public network, source IP và port sẽ thay đổi như thế nào?
- NAT có những hạn chế nào, chẳng hạn tại sao việc host bên ngoài chủ động truy cập host trong mạng nội bộ lại phức tạp hơn?
Ứng dụng
Giao thức NAT (Network Address Translation) được sử dụng đúng như tên gọi: chuyển đổi địa chỉ mạng từ mạng nội bộ sang mạng bên ngoài. Cụ thể, trong một subnet nhỏ (mạng cục bộ, Local Area Network, LAN), các host sử dụng IP thuộc cùng một LAN, nhưng bên ngoài LAN đó, trong mạng diện rộng (Wide Area Network, WAN), cần một IP thống nhất để xác định vị trí của LAN đó trên toàn bộ Internet.
Trường hợp này thực ra không khó hiểu. Cùng với sự xuất hiện của các văn phòng nhỏ và văn phòng gia đình (Small Office, Home Office, SOHO), nhiều subnet được thiết kế để quản lý các SOHO này, khiến số lượng host trên toàn Internet trở nên rất lớn. Nếu mỗi host đều có một IP “duy nhất tuyệt đối”, không gian địa chỉ IPv4 có thể nhanh chóng đạt giới hạn ($2^{32}$). Vì vậy, trên thực tế, IP trong subnet SOHO là “tương đối”, phần nào giảm áp lực phân bổ địa chỉ IPv4.
“Đại diện” của subnet SOHO, tức cửa sổ kết nối với bên ngoài, thường do router đảm nhiệm. Phía LAN của router quản lý một subnet nhỏ, còn interface phía WAN mới là interface thực sự tham gia vào Internet và có một “địa chỉ duy nhất tuyệt đối”. Giao thức NAT chính là thành phần đóng vai trò chuyển đổi địa chỉ khi host trong LAN giao tiếp với bên ngoài LAN.
Chi tiết

Giả sử bối cảnh hiện tại như hình trên. Ở giữa là một router, phía bên phải tổ chức một LAN có network address là 10.0.0/24. IP của interface phía LAN là 10.0.0.4, và trong subnet đó có ít nhất ba host, lần lượt là 10.0.0.1, 10.0.0.2 và 10.0.0.3. Phía bên trái router kết nối với WAN, IP của interface phía WAN là 138.76.29.7.
Trước hết, cần làm rõ các điểm sau:
- Network address của subnet bên phải router là
10.0.0.0/24(network prefix chiếm 24 bit, host number chiếm 8 bit), địa chỉ của ba host và địa chỉ interface phía LAN của router đều do DHCP cấp phát. DHCP này chạy bên trong router (router tự duy trì một DHCP server nhỏ), từ đó cung cấp DHCP service cho các thiết bị trong subnet. - Địa chỉ interface phía WAN của router cũng do DHCP cấp phát, nhưng địa chỉ này do router nhận từ ISP (Internet Service Provider), tức DHCP thường chạy trên DHCP server trong khu vực đặt router.
Hiện tại, router còn chạy giao thức NAT bên trong để cung cấp dịch vụ chuyển đổi địa chỉ cho giao tiếp LAN-WAN. Vì vậy, một cấu trúc rất quan trọng là NAT translation table. Để giải thích chi tiết hoạt động của NAT, giả sử có request sau:
- Host
10.0.0.1gửi HTTP request (chẳng hạn yêu cầu một trang) đến Web server có IP128.119.40.186(port 80). Lúc này, host10.0.0.1được gán ngẫu nhiên một port, chẳng hạn3345, làm source port của request này, rồi gửi request đến router (destination address là128.119.40.186, nhưng request sẽ đến10.0.0.4trước). 10.0.0.4, tức interface phía LAN của router, nhận request từ10.0.0.1. Router gán cho request này một source port mới, chẳng hạn5001, rồi gửi request packet từ interface phía WAN có địa chỉ138.76.29.7. Đồng thời, NAT translation table ghi lại một translation entry 138.76.29.7:5001——10.0.0.1:3345.- Request packet đến interface phía WAN rồi tiếp tục được gửi đến destination host
128.119.40.186.
Sau đó, response được xử lý như sau:
- Host
128.119.40.186nhận request, tạo response packet rồi gửi đến destination138.76.29.7:5001. - Response packet đến interface phía WAN của router. Router tra NAT translation table, phát hiện
138.76.29.7:5001có entry trong translation table, từ đó chuyển destination address và destination port thành10.0.0.1:3345, rồi gửi đến10.0.0.4. - Response packet sau khi chuyển đổi đến interface phía LAN của router, sau đó được forward đến destination
10.0.0.1.

🐛 Đính chính (xem issue#2009): giá trị Dest ở bước thứ tư trong hình trên phải là 10.0.0.1:3345 thay vì ; đây là lỗi viết nhầm.138.76.29.7:5001
Trọng tâm
Với quy trình trên, cần nhấn mạnh các điểm sau:
- Trường port có 16 bit, không thể suy ra rằng phía sau một NAT nhiều nhất chỉ có khoảng 65.500 host. Giới hạn của không gian port là số lượng mapping có thể được duy trì đồng thời trong điều kiện external address, transport protocol, mapping behavior và mapping lifetime cụ thể, chứ không phải tổng số host trong mạng nội bộ. Một host có thể tạo nhiều mapping, NAT cũng có thể sử dụng nhiều public address.
- Đối với destination server, nó không bao giờ biết “rốt cuộc host nào đã gửi request cho mình”, mà chỉ biết đây là request được router forward từ
138.76.29.7:5001. Vì vậy, có thể nói router đóng vai trò che chắn giữa WAN và LAN: mọi packet do host nội bộ gửi ra ngoài đều có cùng một IP (khác port), còn mọi packet từ bên ngoài gửi vào nội bộ cũng chỉ có một destination (khác port); sau khi được NAT chuyển đổi, packet từ bên ngoài mới có thể đến đúng host nội bộ. - Việc NAT có tái sử dụng mapping sẵn có hay không không thể chỉ dựa vào IP nội bộ. Mapping ít nhất phải phân biệt transport protocol, internal IP và internal port; việc có phụ thuộc vào remote address và port hay không còn tùy mapping behavior cụ thể của NAT. Chỉ khi packet khớp với mapping sẵn có, NAT mới có thể tái sử dụng external address và port tương ứng.
Tóm tắt các đặc điểm của giao thức NAT:
- Giao thức NAT ẩn LAN khỏi WAN, qua đó giảm áp lực phân bổ địa chỉ IPv4 một cách hiệu quả.
- Khi IP của host trong LAN thay đổi, không cần thông báo cho WAN.
- Khi ISP thay đổi địa chỉ interface phía WAN, không cần thông báo cho các host trong LAN.
- NAT ẩn địa chỉ và topology bên trong; filtering behavior của nhiều thiết bị NAT còn khiến traffic bên ngoài không có mapping sẵn khó đến trực tiếp host nội bộ. Tuy nhiên, thứ quyết định packet inbound nào có thể đi qua là filtering policy, không phải bản thân việc chuyển đổi địa chỉ. NAT không thể thay thế stateful firewall, access control và các biện pháp bảo mật cho host.
Tuy nhiên, do tính đặc thù, giao thức NAT cũng gây ra một số tranh luận. Có thể bạn đã nhận ra rằng, khi xác định một host nội bộ bên ngoài LAN, giao thức NAT sử dụng port, vì các IP đều giống nhau. Việc dùng port để định địa chỉ host có thể gây ra một số hiểu lầm. Ngoài ra, router là thiết bị ở network layer nhưng lại sửa nội dung packet của transport layer (sửa source IP và port), cũng là hành vi không chuẩn. Tuy vậy, dù là sản phẩm của thời đại IPv4, giao thức NAT đã giúp giải quyết rất nhiều vấn đề vốn khó xử lý và vẫn được sử dụng cho đến ngày nay.
Lời cuối
Nếu nội dung hữu ích với bạn, hãy tiện tay tặng JavaGuide một Star miễn phí để ủng hộ: GitHub | Gitee.
JavaGuide đã được duy trì gần bảy năm, tích lũy 6100+ commit, với sự chung tay hoàn thiện của 620+ contributor. Star, phản hồi và PR của bạn đều là động lực để dự án tiếp tục cập nhật.
Nếu bạn đang chuẩn bị phỏng vấn backend / phát triển ứng dụng AI, có thể tham khảo Knowledge Planet của tôi, bao gồm các project thực tế về backend và AI, tối ưu CV, hỏi đáp 1-1 và tài liệu về các trọng điểm thường gặp, đã được duy trì liên tục sáu năm.
