Khi tôi viết "thông thường" ở đây, tôi nghĩ đến bộ định tuyến WLAN-NAT tiêu dùng trung bình của bạn với cấu hình lành mạnh hoặc một số mạng Linux đơn giản với cài đặt mặc định. Như thường lệ, điều này có thể được thực hiện phức tạp hoặc phức tạp khi cần thiết. Vì câu hỏi rất cơ bản, điều này dường như có ý nghĩa nhất đối với tôi thay vì đi thẳng vào bất kỳ giải pháp NAT cấp doanh nghiệp phức tạp hơn.
Bạn đã chấp nhận câu trả lời, nhưng hãy để tôi cố gắng giải quyết trực tiếp câu hỏi bạn đã hỏi:
Làm thế nào để NAT quyết định kết nối nào là trong nước và bên ngoài nào?
Cơ sở cho quyết định (cho bất kỳ quyết định nào trong bộ định tuyến) là một bộ quy tắc dưới một hình thức hoặc thời trang nào đó. Trong trường hợp này, đối với mỗi giao diện liên quan (nghĩa là giao diện LAN bên trong so với giao diện WAN / đường lên bên ngoài), quản trị viên sẽ thực hiện các quy tắc. Các quy tắc này khá khác nhau, tức là các quy tắc cho giao diện LAN trông khác rất nhiều so với các quy tắc của giao diện WAN.
Biết một gói đến từ đâu và đến đâu là bánh mì và bơ của những gì một bộ định tuyến làm.
Hãy để tôi bắt đầu với một
Thí dụ
Trang NAT của Wikipedia có rất nhiều văn bản về vấn đề này, nhưng một trường hợp đơn giản (mạng LAN công ty đơn giản so với đường lên DSL đơn) đây là điều xảy ra:
- PC khách cố gắng khởi tạo kết nối HTTP đến máy chủ dựa trên internet, ví dụ 198.51.100.20. Bản thân PC có một địa chỉ không định tuyến như 192.0.2.2. Bộ định tuyến DSL giá rẻ có hai giao diện, một bên trong (192.0.2.1) và bên ngoài (203.0.113.10, rất có thể thay đổi thường xuyên và được cung cấp thông qua một số giao thức liên kết cục bộ của nhà cung cấp DLS). Vì vậy, PC gửi một gói SYN đến 198.51.100.20:80 thông qua cổng mặc định của nó, đó là 192.0.2.1.
- Bộ định tuyến nhận gói tin tại giao diện 192.0.2.1, giống như nó cũng sẽ làm nếu không có NAT tham gia. Nó đã được cấu hình để thực hiện NAT trên giao diện này, vì vậy nó tiến hành thực hiện những việc sau:
- Phát minh ra một số cổng mới, chưa được sử dụng cho đến nay. Ví dụ 12345.
- Thay đổi địa chỉ "người gửi" trong tiêu đề IP thành 203.0.113.10.
- Hãy nhớ số cổng người gửi ban đầu trong tiêu đề TCP (do PC cung cấp), hãy gọi nó là 4321.
- Thay đổi tiêu đề TCP để chứa số cổng người gửi 12345.
- Thêm một mục (12345; 192.0.2.2; 4321) trong bảng dịch NAT của nó.
- Gửi gói theo cách vui vẻ của nó đến đường lên / cổng riêng của nó.
- 198.51.100.20 cuối cùng nhận được gói, thông báo rằng đó là một SYN ("thiết lập kết nối mới") và gửi tin nhắn SYN-ACK trở lại cho người gửi. Theo quan điểm của mình, đây là địa chỉ IP 203.0.113.10, với cổng đích TCP là 12345.
- Bộ định tuyến nhận gói tin này trên giao diện WAN của nó. Giao diện WAN đã được cấu hình để giải quyết các địa chỉ NATted như thế này. Các bộ định tuyến sau đó ...
- ... kiểm tra bảng dịch NAT của nó, tìm mục ...
- ... Sửa đổi gói thành đích 192.0.2.2 ...
- ... sửa cổng đích TCP trở về 4321 ...
- ... và gửi nó theo cách vui vẻ của nó (trên giao diện LAN).
- PC nhận được gói và không thấy gì về thủ tục NAT. Các chàng gói chỉ như thế nào nếu 198.51.100.20 đã gửi nó, vì nếu router NAT là không có gì cả.
Không có lúc nào chủ đề của một "kết nối" xuất hiện. Bộ định tuyến NAT (ở dạng đơn giản nhất) không cần quan tâm đến nội dung của các tin nhắn. Nó quan tâm đến các địa chỉ IP và các cổng của người gửi và người nhận, nhưng không có gì khác. (Được cấp: điều này có khả năng bỏ qua tất cả các loại vấn đề liên quan đến bảo mật và hiệu suất; nhưng đây là về nguyên tắc rất cơ bản giống như nguyên tắc trong câu hỏi này.)
Vậy làm thế nào để bộ định tuyến biết?
Các bộ định tuyến hoàn toàn không cần biết về "kết nối". Trong thực tế, các quy trình tương tự như được mô tả cho TCP tồn tại đối với giao thức UDP không kết nối (đục lỗ UDP), hoặc thực sự có thể được thực hiện cho bất kỳ giao thức nào có thứ gì đó giống như số cổng trong lớp vận chuyển.
Lý do tại sao bộ định tuyến cần biết giao thức cấp vận chuyển (TCP, UDP, ...) liên quan đến NAT chủ yếu là do các cổng không phải là một phần của IP; và các cổng là những gì làm cho "hack" mà NAT (loại này) có thể dễ dàng thực hiện được.
Vì vậy, với câu hỏi của bạn:
Làm thế nào để NAT quyết định kết nối nào là trong nước và bên ngoài nào?
Các kết nối ngoài là mỗi định nghĩa bắt đầu bằng gói SYN (hoặc cú đấm UDP ban đầu trong trường hợp UDP) xuất hiện tại giao diện LAN. Gọi họ là "kết nối" trong trường hợp NAT là một chút; chúng kết thúc đơn giản chỉ là một mục tạm thời trong bảng dịch NAT (cộng với bất kỳ bảo mật / hiệu suất bổ sung nào mà bộ định tuyến NAT riêng lẻ cũng có thể sử dụng).
Kết nối trong nước không tồn tại trong kịch bản tôi đã sử dụng trong câu trả lời cho đến nay. Tất nhiên có các biến thể của NAT làm điều này; ví dụ: bạn có thể xác định tĩnh một cổng trên giao diện WAN của bộ định tuyến bằng một IP cụ thể: PORT trên giao diện LAN, điều này cho phép chạy một máy chủ bên trong mạng LAN NATted của bạn. Điều này cũng thường được hỗ trợ bởi các bộ định tuyến DSL / WLAN tiêu dùng giá rẻ. Và với các bộ định tuyến "thực", rõ ràng bạn có thể định cấu hình chúng theo bất kỳ hình thức hoặc thời trang nào bạn thích.
Các gói IP trong / ngoài nước khác không khác với các gói được đưa ra trong ví dụ. Khi bắt tay SYN ban đầu đã được thực hiện và bộ định tuyến có mục trong bảng dịch của nó, nó sẽ đi qua (với cùng một bản dịch như được giải thích trong ví dụ) tất cả các gói tiếp theo theo cả hai hướng.
Nếu, trong bối cảnh kết nối TCP được thiết lập như vậy, máy chủ muốn gửi dữ liệu đến máy khách (điều này hoàn toàn có thể - TCP là hai chiều), đây chỉ là các gói IP, theo như bộ định tuyến NAT có liên quan. Nó sẽ không thực sự quan tâm nhiều đến nội dung của các gói đó (nghĩa là chúng có chứa các tải trọng nhất định hay chỉ là các gói "quản lý" của TCP hoặc bất cứ thứ gì).
Không có lúc nào bộ định tuyến "đóng ống" khi bạn đặt nó. Rõ ràng, bộ định tuyến sẽ có một số khái niệm về việc khi nào nó có thể xóa mục nhập khỏi bảng dịch (có thể là khi thông báo bắt tay FIN kết thúc kết nối, hoặc do hết thời gian hoặc một số trạng thái lỗi), nhưng từ đầu đến cuối một cuộc tình liên tục.