我正在使用數據機路由器,並且在某些情況下也位於 ISP NAT 之後。 NAT(ISP 的 NAT)後面的 NAT(路由器的 NAT)如何運作?
據我所知,NAT 的工作原理是這樣的:計算機 A 和 B 獲取內部 IPinternal1
和internal2
.然後 NAT 為它們提供同一 IP 上的端口,以便麵向公眾,它們位於後面someIP:1
和someIP:2
。
但是,如果路由器執行此操作,然後 ISP 再次執行此操作,則 IP 的形式將是someIP:1:100
,someIP:2:101
這是不可能的,因為連接埠沒有二級連接埠。
那麼這是如何運作的呢?
答案1
讓我們試試一個簡單的例子。
在「正常」NAT 家庭網路中,192.168.1.2:11223
對應到「公共」位址:連接埠對203.0.113.5:22334
。因此,最終的目標主機認為它收到了來自背後的「專用」網路的資料包203.0.113.5:22334
,並且不知道背後的「專用」網路。
現在,讓我們將其擴展到具有兩級 NAT 的雙 NAT 網路。
在距離主機最近的路由器上,192.168.1.2:11223
對應到「公共」位址:連接埠對10.0.0.8:22334
。現在,10.0.0.8
仍然是私有位址,只是在不同的網路中。就這個路由器而言,它的工作已經完成。
在充當第一個路由器所在 LAN 的網關的下一個路由器上,10.0.0.8:22334
對應到其自己的公共介面 上的另一個位址:連接埠對203.0.113.5:12345
。
最終目標主機認為它收到了來自 的資料包203.0.113.5:12345
。它以及整個公共互聯網不知道這裡涉及的任何子網10.0.0.0/8
。192.168.0.0/16
它將向該位址發送迴響應,該響應必須由每個路由器依次轉換回來。
Different address:port pairs for
thesame endpoint in one connection!
+------------------------+ -----------------------------------
|Host |
|192.168.1.2 |
+------------------------+ 192.168.1.2:11223 <--- Host sees
this pair
+------------------------+ 192.168.1.2:11223 <--- Router 1 sees
|Router 1 | req from this
|internal 192.168.1.1/24 |
|external 10.0.0.8 |
+------------------------+ 10.0.0.8:22334 <------ Router 1 sends
req from this
+------------------------+ 10.0.0.8:22334 <------ Router 2 sees
|Router 2 | req from this
|internal 10.0.0.1/24 |
|external 203.0.113.5 |
+------------------------+ 203.0.113.5:12345 <--- Router 2 sends
req from this
+------------------------+ 203.0.113.5:12345 <--- Public internet
|Public internet | sees this pair
+------------------------+
CGN(“ISP NAT”)的工作方式大致相同。唯一的區別是,它不會為其內部主機提供 RFC1918 私人位址,因為這可能會與業務網路發生衝突。相反,範圍 (RFC6598) 中的位址100.64.0.0/10
由上圖中的「路由器 2」分配。就客戶自己的路由器而言,其“公共”位址來自該範圍 - 但實際上無法在公共互聯網上訪問!
答案2
據我所知,NAT 的工作原理是這樣的:計算機 A 和 B 獲取內部 IP 內部 1 和 內部 2。然後 NAT 為它們提供同一 IP 上的端口,以便麵向公眾,它們位於 someIP:1 和 someIP:2 後面。
連接埠數量不是主機位址的一部分 – 無論是否使用 NAT,IP 層都不存在連接埠之類的東西。主機的 IP 位址始終是只是地址;它沒有“第二級”端口,也沒有“第一級”端口。[1]
相反,連接埠屬於每個單獨的 TCP/UDP聯繫主機在 IP 之上建立的。 (嚴格來說,它們是每個資料包的一部分,並且同一連接中的所有資料包都使用相同的連接埠。)
所以當你看到一個地址寫成 時12.34.56.78:123
,整個事情就是不是主機的 IP 位址 – 這是連接埠 123 的 TCP 連線端點在IP 位址仍然簡單的主機12.34.56.78
。
這些連接埠沒有添加通過 NAT – 他們一直都在那裡;每個 TCP 或 UDP 封包都有兩個連接埠(一個「來源」連接埠和一個「目標」連接埠)。執行 NAT 的路由器只是將它們轉換為不同的值。無論您有多少層 NAT,該封包仍然會有兩個連接埠。
[1]這意味著當您有兩台主機在同一個公共位址後面進行 NAT 時,它們實際上對於 IP 層來說是無法區分的——當來自外部的 IP 封包發送到someIP
它時,它無法指定它想要哪一台主機; NAT 路由器必須從 TCP 層推斷出這一點。這就是為什麼您必須配置「連接埠轉送」規則才能接收入站連線。