Session Traversal Utilities for NAT Traversal Using Relay NAT 資料傳輸協定 Cisco STUN TURN TCP UDP 網路 IP 路由

明辨STUN/TURN協定 輕鬆跨越NAT建立連線

2017-05-12
先了解何謂靜態NAT轉換及動態NAT轉換,然後明瞭STUN協定與NAT的關聯,STUN協定如何運作,以及NAT資料傳輸有那些限制,並認識TURN協定,應該就可以懂得STUN協定與TURN協定的來龍去脈以及使用時機。

顯示NAT位址轉換對應表

至於如何顯示NAT位址轉換對應表的資料呢?與一般的Cisco設備指令類似,這裡也是使用show指令,指令格式如下所示:


透過上面這個指令就可以顯示出NAT的位址轉換對應表,下面是執行這個指令之後的範例:


另外,還有一個指令是可以顯示NAT位址轉換的統計資料,其指令如下所示:


執行該指令後,範例內容如下所示:


STUN簡介

了解了NAT後,回頭來看看STUN。稍早提到,STUN協定可以讓處於NAT環境內的各個用戶端了解自己通往外部網路之後在外部網路的位址(也就是Inside Global位址),甚至還能夠得知目前的NAT是使用怎樣的NAT種類。當應用程式知道這樣的資訊後,就可以直接用這個外部公開的IP位址與其他外部的各種用戶端(用它們的Outside Global位址)聯繫,而不是使用私有IP位址(也就是Inside Local位址和Outside Local位址)。

但是,如果對方也是在NAT環境內,則本身這個用戶端與對方用戶端必須溝通需要用什麼方式來傳輸,必須注意的是,有些NAT環境可能會限制這種兩個不同NAT內的用戶端使用外部公開的IP位址來溝通。

不過,STUN協定需要遠端在外部網路架設一個STUN伺服器。詳細地說,STUN協定是運作在伺服器與用戶端之間。STUN協定最初的設計初衷是讓上層的應用程式得知目前的機器是否運作在NAT環境內,其大致上運作的步驟如下:


用戶端先發送一個Binding Request封包給STUN伺服器。


STUN伺服器把從伺服器端看到的用戶端IP位址與埠(Port)的號碼傳回給用戶端,當作是一個Success的封包。


最後結果以XOR運算方式來取得。

這些資料一般都是用UDP的方式來傳送,不過UDP的傳送方式是沒有保障的,因為它並不保證一定可以傳得到,在這種情況下,一樣可以透過TCP來實作這個傳輸過程。如果想要增加安全性的話,還可以使用TLS(Transport Layer Security)的方式。如果是使用TCP或TLS,則一般會稱為STUNS。

上面的步驟都是假設用戶端已經知道STUN伺服器的位置,但是用戶端又是如何得知STUN伺服器在哪裡呢?通常應用程式可以詢問DNS(Domain Name Server)以便於得知STUN伺服器的位置。在STUN伺服器端,通常會使用3478埠來收TCP或UDP類型的STUN封包,而採用5349埠來接收TLS類型的STUN封包。

認識NAT的限制分類

在說明TURN協定之前,還必須再了解NAT的另一種分類。這個分類是根據NAT對於傳輸目的地以及進出封包的限制所做的分類,共分成以下四種:

Full cone NAT

這種NAT環境單純只是做網址的轉換,並沒有對進出的封包做任何的限制。

Address-Restricted cone NAT

在這種NAT環境底下,從內部設備送出封包的目的地位址都會被記錄,而只有這些曾經收到這樣封包的外部設備能夠傳送封包回來給NAT環境中的內部設備,所以其他外部設備傳送進來的封包都會被擋住。

Port-Restricted cone NAT

這種NAT與Address-Restricted cone NAT類似,但是限制條件多增加了埠,也就是說,從內部設備送出去的封包目的地位址和埠都會被紀錄,只有這些曾經收過內部傳輸出來的目的地和埠的組合可以接收封包,其他外部位址與埠的組合所送進來的網路封包都會被擋住。

Symmetric NAT

上面三種NAT種類,無論內部設備把網路封包傳送到何處,都只有對應到外部單一外部公有位址。但是Symmetric NAT對於不同的目的地都會使用不同的外部公有位址。而對於回傳的封包限制,與Address-restricted cone NAT相同。

TURN協定簡介

從上面的NAT分類,加上剛才對STUN協定的解釋,大家都可以看出一個問題:STUN難以在Symmetric NAT網路環境之下運作,因為使用到不同的外部公有位址。這樣的情況之下,TURN網路協定可以發揮它的作用。

TURN與STUN協定類似,是一套Client-Server架構的網路協定,其功能目的也相同,都是允許NAT網路內部的設備獲知它們在外部所使用的公有IP位址,進而與其他設備做資料傳輸。

所以,TURN協定也是需要一台TURN伺服器,而在開始通訊之前,用戶端必須先行發送封包給伺服器端,要求TURN伺服器產生Relay Port,也就是Relay-transport-address,然後TURN伺服器會建立Peer(Remote Endpoint),接著開始進行Relay的動作。之後,用戶端都會透過TURN伺服器這個Relay Port傳送資料給TURN伺服器,TURN伺服器再轉送到目的地端的TURN用戶端。

必須注意的是,TURN伺服器與STUN伺服器一樣,都必須放在全球都能存取的公用位置上,STUN的原因是必須從Public的觀點取得公用IP位址,而TURN則是必須進一步轉發封包到目的地端。

TURN協定的內容記載在RFC 5766文件內,IPv6的版本則是放在RFC 6156文件。至於TURN URI Schema,可以參考RFC 7065文件。

結語

本文介紹了NAT技術,包括靜態NAT的轉換以及動態NAT的轉換。並且也說明STUN協定與NAT的關聯、STUN協定的運作方式、NAT資料傳輸的限制,進而談論到更進階的TURN協定。看完之後,想必就能夠輕鬆地設定NAT位址轉換,並了解STUN協定與TURN協定的用途與原理。

<本文作者:胡凱智,目前在Solera Holdings Inc.擔任亞太區首席技術長,曾於美商Mozilla擔任全球技術專案總監,並在趨勢科技任職七年多,有兩年美國矽谷工作經驗,在美國專利局擁有軟體專利。讀者交流建議:https://www.facebook.com/khu.page>


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!