1. 程式人生 > >關於NAT穿越的那些事兒

關於NAT穿越的那些事兒

1.為啥需要NAT穿越

將一臺閘道器裝置設為內部網路和外部網路的分界線,在這臺網關裝置上一般會設定NAT和防火牆功能。實現內外連線的方式,一般是內部主機發起連線,和外部伺服器或者主機進行連線,如果是部署在公網上的伺服器當然沒有問題,但是如果涉及到同樣部署在NAT裝置內部的主機該如何實現主機互聯?這樣的應用有很多,比如當下流行的P2P對等網路以及Voip語音通訊網路。

2.上述問題涉及到幾個關鍵點:

  • 假設有A和B兩臺主機都部署在NAT裝置之後,簡稱NAT-A和NAT-B,如果此時A打算同B通訊,該如何獲取B的通訊地址?且B如果在內網中只有一個本地私有地址不能在公網路由該如何處置?
  • 即使A獲得了B的公網通訊地址(通過中間伺服器),那麼又如何穿越閘道器中的防火牆裝置?因為防火牆裝置一般只會允許之前已經建立的通訊狀態中外部地址通過。

3. 解決方式:

  • 關於第一個問題,可以使用一個公網中的伺服器來實現A與B的經過轉化的NAT公有IP地址和埠的相互傳遞。這種方法可以實現的是完全錐形(Full cone)NAT的方式,這種方式的成功與否也要取決於防火牆的限制,如果防火牆只允許已經建立過通訊的主機地址才能通訊這種方法就不適用。除了完全錐形NAT方式,對於IP受限制NAT和埠受限制NAT的實現需要通過相關的應用來實現,即通過雙方同時使用對方的公有地址進行打孔,同時在兩邊的NAT-A和NAT-B上建立NAT表項,實現A與B通訊。
    • 實現中間伺服器的方式就是STUN。
  • 除了以上兩種方式,還有一種限制是在NAT進行轉換的時候,會根據與不同的通訊目的地址使用不同的埠且限制必須是之前建立過的外部通訊地址才能建立連線,即對稱型(Symmetric)NAT,此時,A如果向B傳送通訊資訊,經過NAT-A轉換後的地址和埠已經不是B收到的伺服器給的A的通訊地址和埠了,同樣的A->B的包中的B的目的地址也不是B經過NAT-B轉化後的地址了。此時A->B的資料包的目的地址是B與伺服器通訊時的公網地址和埠,而此包會被防火牆攔截,因為不是同一個通訊對端傳送的資訊不被接受。那麼此時該怎麼辦呢?有以下兩種方法:
    • 可以通過預測打孔,即在一定範圍內猜測對方可能的NAT轉換後的地址,不過不能保證成功率。
    • 經過中間伺服器轉發,即TURN方式。

4. 術語解釋:

- 完全錐形方式:即外部的通訊端只要將資訊傳送到內網通訊端儲存在NAT裝置中的外網地址和埠即可。
- 限制錐形方式:要求外部通訊地址的IP地址或者IP和port地址必須與防火牆中建立的通訊表象中外部通訊端地址一致才可以與內部的通訊端通訊。
- 對稱型NAT指NAT轉換的一種方式,根據不同的目的地址和埠分配不同的源NAT地址和埠。