概念
內部Tuple:(源)內網IP+PORT(例如:192.168.1.5:50007)
外部Tuple:(源)公網IP+PORT
目標Tuple:(目標)公網IP+PORT
NAT類型介紹
Symmetric和Cone兩種,其中Cone又分爲Full Cone、Restricted Cone、Port Restricted Cone三種類型。基本不同是NAT將內部Tuple與外部Tuple的轉換和映射關係的不同。Cone NAT與目標Tuple無關,Symmetric NAT將目標Tuple作爲建立轉換關係之前的重要參考項,與目標Tuple嚴格一一映射。
Full Cone:
內部Tuple X經過NAT轉換至外部Tuple Y,X-Y的建立轉換關係,任意外部節點且無限制Tuple Z都可以將Tuple Y作爲目標Tuple,向我們的內部Tuple X發送UDP報文。
Restricted Cone:
與Full Cone不同的是:多了一個限制,限制是什麼,出於安全考慮,NAT設備只轉發已知的外部Tuple的IP報文,只有當內部Tuple X曾經發送過UDP報文給目標Tuple Z,纔可以與Tuple X發送報文。
Port Restricted Cone NAT:
在Restricted Cone上的基礎上,出於更加安全的考慮,NAT設備只轉發已知的外部Tuple的IP+PORT(過濾條件更爲苛刻)報文。
Symmetric
通過嚴格的NAT方式,與目標Tuple建立嚴格的一一映射關係,確保安全性。
所以,從安全角度考慮:Symmetric > Port Restricted Cone NAT > Restricted Cone > Full Cone。相反,如果我們做P2P,打通點對點的通信方式的簡單程度,與上面排序就相反,最友好的NAT類型就是Full Cone,任意節點且無限制。
測試與驗證方法
方法1:藉助第三方STUN列表
Python:https://github.com/laike9m/PyPunchP2P
需要藉助外部STUN服務器完成,如下可作爲STUN列表,進行嘗試建立連接。
stun.xten.com 3478
stun.voipbuster.com 3478
stun.voxgratia.org 3478
stun.sipgate.net 10000
stun.ekiga.net 3478
stun.ideasip.com 3478
stun.schlund.de 3478
stun.voiparound.com 3478
stun.voipbuster.com 3478
stun.voipstunt.com 3478
numb.viagenie.ca 3478
stun.counterpath.com 3478
stun.1und1.de 3478
stun.gmx.net 3478
stun.callwithus.com 3478
stun.counterpath.net 3478
stun.internetcalls.com 3478
stun.voip.aebc.com 3478
numb.viagenie.ca 3478
方法2:測試工具
NAT類型測試工具:http://www.pc6.com/softview/SoftView_92208.html
方法3:部署stun服務器
Server:https://github.com/gortc/stund
Client:https://github.com/ccding/go-stun
注:Server端有雙地址和公網IP的要求限制。