簡介
本文檔介紹NAT (STUN)伺服器對會話遍歷實用程式的需求、與STUN伺服器相關的網路地址轉換(NAT)設定的型別、NAT如何導致此設定中的問題以及解決方案。
背景資訊
NAT裝置的主要用途是允許區域網(LAN)中具有私有IP地址的裝置與公共地址空間(如Internet)中的裝置通訊。然而,儘管NAT裝置應該允許內部主機與公共空間連線,但是當涉及到點對點(P2P)應用程式(例如VoIP、遊戲、WebRTC和檔案共用,終端使用者需要同時充當客戶端和伺服器來維護雙向端到端通訊時,NAT卻難以建立這些UDP連線。通常需要NAT遍歷技術才能使這些應用程式正常工作。
需要NAT穿越
今天,網際網路上的即時語音和影片通訊是支援VoIP呼叫的幾種流行的即時消息收發器(IM)的主流。最初採用VoIP的一個巨大障礙是,大多數PC或其他裝置都位於防火牆後面並使用私有IP地址。透過帶有NAT的防火牆,可將網路中的多個私有地址(IP地址和埠)對映到單個公有地址。但是,終端裝置不知道其公有地址,因此無法通過其VoIP通訊中通告的私有地址接收來自遠端方的語音流量。
單側自地址固定(UNSAF)過程是指一些始發端點嘗試確定或固定其他端點已知的地址(和埠),例如,能夠在協定交換中使用地址資料或通告其接收連線的公共地址。
因此,正在討論的P2P連線是UNSAF進程。 P2P應用程式建立對等會話並保持對NAT友好的一種常見方法是,它們使用可公開定址的集合伺服器進行註冊和對等體發現。
NAT的會話遍歷實用程式
根據RFC 5389,STUN提供了一個處理NAT的工具。它提供了一種方法,使終端能夠確定NAT裝置為其專用IP地址和埠分配的IP地址和埠。它還為終端提供NAT繫結保持活動狀態的方法。
NAT實施的型別
已經觀察到,UDP的NAT處理方法因實施而異。實施中觀察到的四種處理方法是:
全錐:全錐NAT是指來自同一內部IP地址和埠的所有請求對映到同一外部IP地址和埠的NAT。此外,任何外部主機都可以向內部主機傳送資料包,並將資料包傳送到對映的外部地址。
限制錐:限制錐NAT是指來自同一內部IP地址和埠的所有請求對映到同一外部IP地址和埠的NAT。與全錐形NAT不同,外部主機(IP地址為X)只有在內部主機之前向IP地址X傳送過資料包時才能向內部主機傳送資料包。
埠限制錐:埠限制錐NAT類似於限制錐NAT,但限制包括埠號。具體來說,只有當內部主機之前已將資料包傳送到IP地址X和埠P時,外部主機才能將源IP地址X和源埠P的資料包傳送到內部主機。
對稱:對稱NAT是指從同一內部IP地址和埠到特定目標IP地址和埠的所有請求對映到同一外部IP地址和埠的NAT。 如果同一主機傳送的資料包具有相同的源地址和埠,但目的地不同,則使用不同的對映。 此外,只有接收資料包的外部主機才能將UDP資料包傳送回內部主機。
考慮源(A、Pa)(其中A是IP地址,Pa是源埠)透過NAT裝置與目標(B、Pb)和(C、PC)通訊的拓撲。
NAT實施型別 |
目的地為(B、Pb)的公共源 |
目的地為(C、Pc)的公共源 |
目標(例如: (B, Pb))是否可以將流量傳送到(A, Pa)? |
全圓錐 |
(X1,Px1) |
(X1,Px1) |
是 |
限制圓錐 |
(X1,Px1) |
(X1,Px1) |
僅當(A, Pa)首先將流量傳送到B |
埠限制圓錐 |
(X1,Px1) |
(X1,Px1) |
僅當(A, Pa)首先將流量傳送到(B, Pb)時 |
對稱 |
(X1,Px1) |
(X2,Px2) |
僅當(A, Pa)首先將流量傳送到(B, Pb)時 |
NAT穿越和對稱NAT問題
STUN伺服器響應STUN客戶端傳送的STUN繫結請求,並提供客戶端的公共IP/埠。現在,STUN客戶端在其對等通訊信令中使用此地址/埠組合。但是,現在的endhost使用相同的私有地址/埠(讓我們假設已繫結到STUN響應中提供的公共IP/埠),如果使用對稱的NAT實施,NAT裝置會將其轉換為同一IP但使用不同的埠。這會中斷UDP通訊,因為信令已基於上一個埠建立連線。
預設情況下,Cisco IOS® 路由器執行PAT時的NAT 實現是對稱的。因此,您可能會看到執行NAT的這些路由器出現UDP連線問題。
但是,Cisco IOS-XE路由器執行PAT時的NAT實施不對稱。當您傳送具有相同源IP和埠但目的地不同的兩個不同流時,源會被NATE到相同的內部全局IP和埠。
問題的解決方案
根據此描述,顯然如果執行終端獨立對映,即可解決此問題。
根據RCFC 4787:使用終端獨立對映(EIM),NAT會針對從同一內部IP地址和埠(X:x)傳送到任何外部IP地址和埠的後續資料包重新使用埠對映。
從客戶端上,當終端主機在兩個不同的終端窗口中運行nc -p 23456 10.0.0.4 40000和nc -p 23456 10.0.0.5 50000命令時,如果您使用EIM,以下是NAT轉換的結果:
Pro Inside global Inside local Outside local Outside global
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.4:40000 10.0.0.4:40000
tcp 10.0.0.1:23456 192.168.0.2:23456 10.0.0.5:50000 10.0.0.5:50000
您可以看到,無論目標埠/地址如何,具有相同源地址和埠的不同流量都會轉換為同一地址/埠。
在Cisco IOS路由器上,您可以使用命令ip nat service enable-sym-port啟用與終端無關的埠分配。
https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/ipaddr_nat/configuration/15-mt/nat-15-mt-book/iadnat-fpg-port-alloc.html
摘要
當您使用埠地址轉換(PAT)時,預設情況下Cisco IOS NAT實施是對稱的,當它傳遞需要伺服器(如STUN)進行NAT遍歷的P2P UDP流量時,可能會引起問題。您需要在NAT裝置上明確配置EIM才能使之正常工作。