本期智匯華云,華云數據特別邀請到華云數據網絡組開發工程師許猛為大家帶來“VPP全錐型NAT實現”。
內容介紹
在現實Internet網絡環境中,大多數計算機主機都位于防火墻或NAT之后,只有少部分主機能夠直接接入Internet。很多時候,我們希望網絡中的兩臺主機能夠直接進行通信,即所謂的P2P通信,而不需要其他公共服務器的中轉。由于主機可能位于防火墻或NAT之后,在進行P2P通信之前,我們需要進行檢測以確認它們之間能否進行P2P通信以及如何通信。這種技術通常稱為NAT穿透(NAT Traversal)。最常見的NAT穿透是基于UDP的技術,如RFC3489中定義的STUN協議。
RFC5780為了檢測NAT類型,對NAT定義了三種映射規則Mapping跟Filtering,組合形成9種類型,包含RFC3489種定義的4種類型:Full Cone NAT、Restricted Cone NAT、Port Restricted Cone NAT、Symmetric NAT。
根據NAT實現原理,對稱NAT安全性最高,全錐形NAT安全性最低,這也意味著對稱NAT實現P2P條件最苛刻。VPP作為網絡轉發平面,VPP默認支持對稱型NAT,要實現P2P必須要求對方為全錐形NAT,在現實網絡環境中,網絡路徑中幾乎不存在,為了最大程度支持P2P,VPP實現全錐形NAT,這種模式下,很適合類似視頻推流里P2P。
NAT類型分類
RFC3489NAT的UDP的實現方式有4種類型:
Full Cone NAT:
完全錐形NAT,所有從同一個內網IP和端口號發送過來的請求都會被映射成同一個外網IP和端口號,并且任何一個外網主機都可以通過這個映射的外網IP和端口號向這臺內網主機發送包。
Restricted Cone NAT:
限制錐形NAT,它也是所有從同一個內網IP和端口號發送過來的請求都會被映射成同一個外網IP和端口號。與完全錐形不同的是,外網主機只能夠向先前已經向它發送過數據包的內網主機發送包。
Port Restricted Cone NAT:
端口限制錐形NAT,與限制錐形NAT很相似,只不過它包括端口號。也就是說,一臺IP地址X和端口P的外網主機想給內網主機發送包,必須是這臺內網主機先前已經給這個IP地址X和端口P發送過數據包。
Symmetric NAT:
對稱NAT,所有從同一個內網IP和端口號發送到一個特定的目的IP和端口號的請求,都會被映射到同一個IP和端口號。如果同一臺主機使用相同的源地址和端口號發送包,但是發往不同的目的地,NAT將會使用不同的映射。此外,只有收到數據的外網主機才可以反過來向內網主機發送包。
RFC5780中9種NAT類型:
下面介紹一種Mapping Behavior(映射規則)和 Fieltering Behavior(過濾規則):
Mapping Behavior:
Endpoint-Independent Mapping:
對于一個內網的EedpointP,其對應的外網EndpointG是基本固定的,不會隨著通訊外部主機的不同而變化。
Filtering Behavior:
Endpoint-Independent Filtering:
對于這種過濾型,NAT在主機的一個外網EndpointG1收到包,只要找到與之對應的內網EndpointP1,NAT就會轉發這個資料包給相應的內網EndpointP1,不管這個資料包的來源是哪里。(安全性最低,穿透性最高)
VPP Full Cone NAT
VPP通過三元組(其實是四元組,fib用來做)記錄內網IP跟出口網關的對應關系以及協議,而不記錄對端IP以及PORT,所以回程不會檢查過濾源IP及PORT。
簡化版NAT報文處理流程如下,文件in2out.c out2in.c:
1、 內網發起的對外請求
2、 查找user的in2out表,如果不存在則根據映射算法計算出 NAT轉換后的IP、PORT,建立轉換關系in2out以及out2in表
3、 根據映射關系替換原始包頭的IP、PORT重新計算校驗和
4、 發送報文
5、 外網回復報文,進入到out2in流程,查找out2in表,找到對應映射關系
6、 根據映射關系替換原始包頭的IP、PORT重新計算校驗和
7、 接受報文
8、 發送給內網地址
In2out處理簡化流程:
Out2in處理流程: