Private IP 網路協定 STUN IPv4 TCP NAT 路由器 交換器 協定

支持NAT環境的無名英雄 STUN協定從私有IP講起

2014-08-28
有些讀者可能知道什麼是NAT,有些讀者可能聽過,卻不知道細節。而知道NAT的讀者,可能只有非常少數了解什麼是STUN。事實上,STUN已被廣泛使用在NAT環境之中,它的全稱是Session Traversal Utilities for NAT,運作於網路七層架構的第四層應用層。
而NAT技術將內部與外部的IP位址對應起來,其相關IP的對應如表3所示。

表3 IP位址對應表

假設現在伺服器(192.168.02)要傳送網路封包給外面那台電腦(140.115.3.1),其步驟如下所示:

一開始,伺服器會傳送封包給Cisco路由器設備,此時網路封包的來源端IP位址是192.168.0.2,到目前為止,還是使用內部的私有IP位址,而目的地IP位址為140.115.3.1。

接著,Cisco路由器設備收到這個網路封包。現在要轉送網路封包前往140.115.3.1這個目的地位址,但由於網路封包內的來源端IP位址依然為私有IP位址,而這樣的IP位址是不允許在網際網路中使用,不然的話,目的端電腦就沒有辦法回應封包給原本的來源端電腦。

因此,Cisco路由器設備必須從對應表中取出192.168.0.2這個Inside Local位址所對應的Inside Global位址(171.69.0.42),來取代網路封包內的來源端IP位址,並且把封包送往目的地,此時網路封包裡面的來源端IP位址是171.69.0.42。

目的端電腦收到這個網路封包之後,假若需要回傳資料給原本的伺服器,則這台目的端電腦會取出網路封包中的來源端IP位址(171.69.0.42),然後把這個公有IP位址當作目的端IP位址來傳送網路封包。此時,網路封包中的來源端IP位址當然就是140.115.3.1自己這台電腦的位址。

接著,這個網路封包會被中間這台Cisco路由器設備收到,並發現封包中的目的端IP位址是171.69.0.42。

為了將封包送到正確的目的地,Cisco路由器設備會到NAT位址對應表中取出171.69.0.42這個Inside Global位址所對應的Inside Local位址(也就是192.168.0.2),並用這個位址當作網路封包中的目的端IP位址,這樣一來,網路封包才能正確無誤地傳送到伺服器手上。

以上就是NAT技術的應用過程,當然NAT技術會更改網路封包中的內容,不過只會更改來源端IP位址和目的端IP位址,但是網路封包內原本就會被修改的東西還是會被更動,例如TTL(Time to live)值。

檢視NAT設定值的方法

了解如何設定NAT技術相關設定之後,接下來最重要的莫過於如何檢視NAT設定。因此,底下開始介紹檢視NAT設定值的方法,將說明如何清除NAT位址 轉換對應表,以及該如何顯示NAT位址轉換對應表的資料。

清除NAT位址轉換對應表

前面提到,NAT技術就是幫忙做公有IP位址和私有IP位址之間的轉換動作,讓使用私有IP位址的電腦也能夠方便地存取外面的網際網路。

而這種位址的轉換對應,會儲存在NAT位址轉換對應表之中,若要清除這樣的位址對應表,可透過下列這個指令完成:


前面提過,常用的NAT運行方式有靜態(Static)NAT、動態(Dynamic)NAT以及Overlapping三種,而上面這個指令可以清除所有動態對應的NAT位址轉換關係。如果只是要移除某一個動態NAT的位址對應關係,則可以執行下面這個指令:


以上的指令可以指定特定一個Inside的轉換對應關係,若想同時指定Inside與Outside的位址轉換對應關係,則執行如下的指令:


假若想移除特定一筆包含Outside的位址轉換對應關係,可以採用下列的指令:


要注意的是,這裡的位址指定順序是Local位址在前面,而Global位址在後面。這裡的順序與上一個指令剛好是相反的。

上面就是要刪除NAT位址轉換表中資料的指令,不過,事實上NAT位址轉換表中的資料預設會自動逾時而被刪除,如果是NAT相關設定的話,則資料存在於NAT位址轉換表中24小時以後就會自動被刪除,除非重新設定這筆資料。而剛剛介紹的所有移除指令是用來當這些資料還沒有逾時的時候,從NAT位址轉換表之中移除的。

顯示NAT位址轉換對應表

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


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


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


執行該指令之後,將出現如下的結果:


STUN簡介

了解了NAT之後,再回頭來看看STUN。稍早提到,STUN是Session Traversal Utilities for NAT的縮寫,而STUN協定被定義於RFC 5389文件之中。這個協定可以讓處於NAT環境之中的各個用戶端了解自己通往外部網路之後,在外部網路的位址(也就是Inside Global位址),甚至還可以知道目前的NAT是使用怎樣的NAT種類。

而應用程式一旦知道這樣的資訊後,就可以直接用這個外部公開的IP位址與其他外部的各種用戶端(用它們的Outside Global位址)聯繫,而不是使用私有IP位址(也就是Inside Local位址和Outside Local位址)。

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

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

1. 用戶端先發送一個Binding Request封包給STUN伺服 器。
2. STUN伺服器把從伺服器端看到的用戶端IP位址與 埠(Port)的號碼傳回給用戶端,當作是一個Success的封包。
3. 最後結果以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封包。

結語

這篇文章介紹了Cisco網路設備的NAT技術,其中也說明靜態NAT的轉換以及動態NAT的轉換。並且,還講解了STUN協定與NAT的關聯,以及STUN協定的運作方式等等。看完這一篇,讀者想必也能輕鬆設定NAT位址轉換,更可以了解STUN協定的用途與原理。

<本文作者:胡凱智,目前在美商Mozilla擔任資深全球專案經理,曾於趨勢科技任職七年多,有兩年美國矽谷工作經驗,在美國專利局擁有軟體專利。讀者可在其粉絲專頁獲取更多網路知識及交流建議:https://www.facebook.com/khu.page>


追蹤我們Featrue us

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

我知道了!