Làm thế nào để một máy chủ internet đáp ứng yêu cầu từ một IP riêng?


0

Tôi đang tìm hiểu về IP riêng / công cộng, chuyển tiếp cổng và NAT và vẫn không thấy câu trả lời cho một câu hỏi đơn giản:

Giả sử hai người dùng trên cùng một mạng đang liên lạc với một máy chủ bên ngoài mạng của họ (giả sử, tôi và vợ tôi gửi yêu cầu http đến yahoo.com). Máy chủ xem cả hai người dùng là một ip công khai duy nhất và thường - như trong trường hợp này - giao tiếp trên cùng một cổng. Làm thế nào để bộ định tuyến định tuyến các gói theo hai kết nối khác nhau? Có bất kỳ thông tin định tuyến bên trong gói ngoài ip / port? Có một số 'bảng phiên' được duy trì ở đâu đó? Bởi ai và chính xác nó bao gồm những gì?


Có một bảng NAT trong bộ định tuyến
SpiderPig

Câu trả lời:


2

Trong một máy tính, giữa các quy trình

Đầu tiên chúng ta hãy xem làm thế nào một đơn máy tính phân biệt giữa kết nối đồng thời.

Hầu hết các giao thức truyền tải như TCP, UDP, SCTP sử dụng hai cổng, nguồn và đích - tức là một ở hai đầu của kết nối. Đó là, các gói không chỉ đơn giản là đi "qua" một cổng; thay vào đó họ đi từ cổng X đến cổng Y.

Cổng đích thường nổi tiếng (80 đối với HTTP, 53 đối với DNS,) nhưng cổng nguồn thường được chọn bởi chính HĐH, điều này cũng đảm bảo rằng kết hợp src / dst là duy nhất.

Vì vậy, khi trình duyệt của bạn thực hiện nhiều kết nối "tới cổng 80 của Yahoo", tất cả chúng thực sự có các cổng nguồn khác nhau và HĐH sẽ giữ một bảng ổ cắm như:

PROCESS       PROTO  LOCAL                REMOTE            STATE
9894/firefox  tcp    192.168.6.175:39163  google.server:80  established
9894/firefox  tcp    192.168.6.175:52909  yahoo.server:80   established
17463/chrome  tcp    192.168.6.175:64981  yahoo.server:80   established
9894/firefox  udp    192.168.6.175:4984   8.8.8.8:53        --

Vì vậy, khi HĐH nhận được gói TCP từ yahoo.server:80cổng cục bộ 52909, nó có thể ánh xạ nó tới kết nối cụ thể được tạo bởi Firefox.

Điều quan trọng cần lưu ý rằng đây không có gì để làm với NAT chưa , và xảy ra theo cùng một cách ngay cả khi bạn đang trực tiếp kết nối. (NAT sẽ sử dụng nó, mặc dù.)

(Bạn có thể xem bảng này bằng cách sử dụng netstat -nhoặc các công cụ đồ họa khác nhau trên Windows. Thường thì "cục bộ / từ xa" được gắn nhãn "nguồn / đích", mặc dù điều đó không hoàn toàn chính xác.)


Trong một mạng NATed, giữa các máy tính

Câu trả lời cho câu hỏi của bạn về NAT rất giống nhau, chỉ có mọi thứ được thực hiện ở quy mô lớn hơn.

Bộ định tuyến thực hiện NAT giữ một bảng "trạng thái" chứa cả cổng và địa chỉ bên trong và bên ngoài. Ví dụ: nếu hai yêu cầu HTTP của bạn sử dụng các kết nối TCP riêng biệt, chúng có thể được theo dõi là:

PROTO   ORIG-SRC             ORIG-DST         REPLY-SRC        REPLY-DST
6/tcp   192.168.6.42:52909   yahoo.server:80  yahoo.server:80  your.public.ip.addr:52909
6/tcp   192.168.6.175:39163  yahoo.server:80  yahoo.server:80  your.public.ip.addr:39163
6/tcp   192.168.6.175:52909  yahoo.server:80  yahoo.server:80  your.public.ip.addr:28330
17/udp  192.168.6.175:4984   8.8.8.8:53       8.8.8.8:53       your.public.ip.addr:4984

Khi bộ định tuyến nhận được gói từ REPLY-SRC (Yahoo) được gửi đến REPLY-DST (địa chỉ IP công cộng của bạn), nó biết rằng đích thực phải được lấy từ cột ORIG-SRC để hoàn tác NAT.

(Nếu không có trạng thái khớp, thì các quy tắc chuyển tiếp cổng được định cấu hình thủ công sẽ được xử lý. Nếu vẫn không khớp, thì gói thực sự có ý nghĩa đối với chính bộ định tuyến.)

Lưu ý cách bảng trạng thái chứa địa chỉ cổng , cho phép phân biệt nhiều kết nối đến cùng một máy chủ bằng tổ hợp cổng. Trong ví dụ của tôi, hai máy tính vô tình sử dụng cùng một kết hợp cổng, vì vậy kết nối thứ 2 cũng có các cổng được dịch.

(Trên thực tế, một số NAT chỉ nhìn vào cổng và hoàn toàn bỏ qua địa chỉ nguồn; điều này làm giảm số lượng kết nối có thể, nhưng giúp các chương trình ngang hàng thực hiện "cú đấm NAT" dễ dàng hơn rất nhiều.)

Trạng thái như vậy được giữ ngay cả đối với các giao thức không kết nối như UDP hoặc ICMP, vì vậy các mục hết hạn sau một khoảng thời gian không hoạt động mặc dù không có gói "kết nối gần" rõ ràng. (Bảng trạng thái thực sự là một phần của tường lửa, vì vậy ngay cả khi NAT không được thực hiện, bộ định tuyến vẫn có thể sử dụng nó để phân biệt giữa các kết nối "hoạt động" và các gói đi lạc.)

(Nếu bộ định tuyến của bạn dựa trên Linux conntrack -Lhoặc cat /proc/net/nf_conntracksẽ hiển thị bảng này. Đối với OpenBSD hoặc pfSense, hãy thử pfctl -s state.)


Cảm ơn bạn. Là 52909 và 39163 trong các cổng ví dụ của bạn hay cái gì khác? Nếu đây là các cổng được sử dụng cho http, thì tại sao chúng không phải là 80? Làm thế nào để tránh đụng độ? (Hoặc: điều gì xảy ra khi cả hai cổng là 40000?)
Ofek Shilon

1
@OfekShilon: Chúng là các cổng ví dụ. Lưu ý rằng TCP và UDP sử dụng hai cổng - nguồn và đích. Đó là cách một máy tính phân biệt giữa nhiều kết nối với cùng một máy chủ Yahoo. Cổng đích là "nổi tiếng" (80 cho HTTP), nhưng cổng nguồn thường được HĐH chọn ngẫu nhiên, điều này đảm bảo rằng sự kết hợp src + Dest là duy nhất. Cuối cùng, nếu hai máy tính cố gắng sử dụng cùng một kết hợp cổng, bộ định tuyến NAT của bạn cũng sẽ viết lại các cổng xung đột. (Nó thường được gọi chính xác hơn là NAPT.)
grawity
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.