stun檢查nat類型


nat(Session Traversal Utilities for NAT)會話穿越應用程序,可以讓位於nat后的客戶端找出自己的公網地址以及對應的Internet端口,最重要的是可以判斷自己處於哪種nat類型之后,它是通過udp進行通信的。

下面重點講怎么判斷nat的類型。

一般將nat類型可以分為四種:全錐形,受限錐形,端口受限錐形,對稱形。之所以是叫錐,可以想象一下圓錐,一個圓集中映射到一個點,也就是本地ip端口映射到nat服務器上面的公網ip和端口,其他任何遠端ip和端口的網絡都可以連接進來,這種就是全錐形,如果只有接收過連接的遠端ip才能反向連接到本地ip,那這種就是受限形,其實就是ip受限形,如果再進行限制,只有接受過連接的遠端ip和端口才能反連到本地ip,那這種就叫端口受限形。一般來說,本地服務器發起一個連接到任何遠端ip,它對應的nat的端口都是不變的,如果發到不同的遠端ip,它對應的nat的端口也不一樣(公網ip也就是出口ip肯定是不變的),那這種就是對稱形了,不同的遠端ip對應不同的nat端口,形成一個對應關系,這種nat類型是不太好進行穿透的。

知道了上面的原理,檢測nat的類型也就變得方便了。

首先本地程序發起一個udp連接到stun服務器,這個服務器你自己開發一個就行,stun接受的udp請求后,可以根據from記錄下該請求的ip和端口,這個就是nat服務器是的出口ip了,然后根據這個ip和端口回復一條信息,把獲取到的ip和端口作為信息回復回去,如果本地能接收到,說明網絡是沒有問題的,如果接收不了,說明block了。
這里獲取到了出口ip后,可以和本地ip做對比,如果一樣,那說明壓根就沒有nat了,可以直接bind一下,能綁定成功就說明沒有nat。

本地重新發起一個請求到另外的stun服務器,通過同樣的方法獲取到出口ip和端口,將該端口和第一次的出口端口對比,如果變了,說明是對稱形。

本地程序再發起一個請求給stun, stun服務器接收到該請求后,換一個出口ip給回復回去(重新發起一次請求),如果本地能收到回復,說明是全錐形的,換了一個ip也能接收到請求。如果接收不到請求了,對於非nat模式,那說明本地可能存在防火牆,nat下那還得繼續探測。

本地發起一個請求到stun服務器,讓stun換一個端口進行回復,如果本地能接收到,那說明是ip受限形,否則就是端口受限形。

至此,nat類型檢測完成,這是udp通信下測試的結果,對於全錐形,需要使用tcp進行反連接探測,如果連接不上,可能服務器對tcp做了限制。如果能連接上,說明可以正常穿透使用,可以將nat改為0,注意,本地要有保活的措施,定期對外發起tcp連接,以獲取公網ip和端口,反連就是對公網ip和端口重新發起連接的。

本文作者: nephen
本文鏈接: https://www.nephen.cn/posts/12334267/
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議。轉載請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM