
通常,NAT 將使本地端點的公共端點對於來自該端點的所有資料包保持相同,從而使 UDP 打洞變得容易。然而,對於封包發送到的每個不同主機,某些 NAT 會將本地端點映射到不同的公共端點,使 UDP 打洞變得不可能。
進行傳統 UDP 打孔的唯一方法是猜測遠端端點。但是,由於連接埠數量超過 65,000 個,因此這種方法不太可靠。因此,我讀到像 Skype 這樣的應用程式(眾所周知,它們能夠透過幾乎任何類型的 NAT 進行通訊)都使用中繼來實現這一點。這是我的問題:
中繼只是一種將傳入資料從一個套接字傳送到另一個套接字的套接字,對吧?是否有其他方法可以透過頑皮的 NAT 進行 UDP 打洞,而無需進行瘋狂猜測或使用中繼(這樣就不再是真正的「打洞」了)?
答案1
術語「非良好行為 NAT」是不正確的 - 任何使用 PAT(連接埠位址轉換)將多個私人位址聚合到單一公共位址的 NAT 裝置都將重新映射來源連接埠。這就是 PAT 中「連接埠位址」的意思。
兩個內部設備不可能使用相同的來源位址到達相同的目的地,並且期望來源連接埠在 NAT 後保持相同,並且在定位時嘗試保持來源連接埠一致並不利於安全態勢多個目的地。所以這通常不是防火牆設計的目的。
當然,這裡沒有幫助,您想知道連接的來源端口,而不實際從該來源接收任何資料包。中繼是端點透過第三方進行通訊的明顯選擇(是的,中繼只是按照您的建議在套接字之間傳輸資料包- 在Skype 伺服器中的實現可能要複雜得多,但原則上是相同的)。
很難看出如何以其他方式做到這一點,因為端點不知道飛行中發生的轉換,因此它們甚至無法通過某種側通道(例如僅向中央伺服器註冊連接埠但直接通訊)。