之前介紹過的STUN技術,事實上就是一種NAT穿透技術,不過現在有非常多不同的NAT穿透技術,沒有一種技術可以運用於所有的NAT環境,因為NAT並不是一種標準。這篇文章將針對多種常見的NAT穿透技術做一個簡介,讓讀者先瞭解有哪些技術可供選擇。
顧名思義,NAT穿透技術當然與NAT有關。基本上,這種技術是允許用戶端之間可以「穿透」NAT的網路環境,得知對方的所在位置,並與之互相溝通。
NAT穿透技術的產生,是因為在一般NAT環境中,用戶端的IP位址是被隱藏並且轉換的,所以對於某些需要直接與另一端用戶端直接通訊的軟體來說,反而是一種不方便的設計,這種情況在TCP/IP網路中經常會遇到。
NAT背後隱藏的問題
針對NAT技術,與其說是隱藏的問題,可能稱之為不同的需求比較合理。這讓筆者想起將近十?年前,筆者曾經參與一個大型企業的軟體研發,這個軟體是Server-Client的架構,所以伺服器端必須知道有哪些用戶端,收集它們的資訊,與這些用戶端通訊,並且管理這些設備。
首先遇到的問題就是,伺服器端必須要知道所有這些用戶端的IP位址,這是一個非常基本的需求。畢竟,之後還會需要針對這些用戶端進行通訊。但是在真正的大型企業網路環境中,很難假設會是怎樣的環境。
事實上,很多大型企業會使用NAT的網路技術來對IP位址做有效的管理與使用。而大型企業中可能會切割許多不同的子網路,並規劃不同的NAT網路環境。這樣的問題就是,伺服器有極大的可能性會與用戶端處於不同的NAT網路環境之中。
在這樣的情況下,也許NAT穿透就可以解決這樣的問題。另外,就是VoIP的軟體更會需要這樣的穿透技術,以便於讓進行VoIP通訊的兩端正確無誤地溝通。
什麼是NAT
在開始之前,想確保各位對於這個議題的背景知識有一個共同並且基本的瞭解,所以先來介紹一下什麼是NAT。
NAT是Network Address Translation的縮寫。NAT是用來將已經註冊的IP位址轉換到私有的IP位址,簡化IP位址的管理,以便讓企業內部的網路連到外部的網際網路,而且甚至不需要有註冊的子網路。
大致來說,NAT的做法是在IP協定封包的Header中將Network Address的資料做置換的動作。以下就來介紹NAT如何做到這些事情。
私有IP位址
在開始介紹NAT之前,先介紹一下何謂私有IP位址(Private IP Address),以及說明私有IP位址的範圍。
眾所周知,目前IPv4的規格與技術已經被使用很多年,原本所設計的IP位址個數也逐漸不敷使用,當初設計IPv4時,應該很難想像到網路普及如此迅速,而IP位址的使用量會如此廣泛,為了更有效地使用IP位址,於是出現了私有IP位址的設計。
私有IP位址被定義在RFC 1918的規格之中,當電腦並不需要存取網際網路時,可以只用私有IP位址,而私有IP位址並不需要註冊,因為私有IP位址只有內部網路才可以使用。私有IP位址的IP範圍如表1所示。
表1 私有IP位址所涵蓋的IP範圍
一般公司內部的網路都是分配私有IP位址給內部的電腦,不僅如此,若家裡有架設自己的無線網路基地台,這個基地台也是會分配私有IP位址給每一台連上網路的筆記型電腦,而這些私有的IP位址在外面的網際網路中是「不能見人」的,也因為如此,各個內部網路(Intranet)就可以重複使用這些私有IP位址範圍,以增加IP位址的使用性。
Link-local位址
另外還有一段私有IP位址是被定義在RFC 3330和RFC 3927文件中,這段私有IP位址稱為Link-local Addresses。設計這段私有IP位址的目的在於,希望在沒有DHCP伺服器的情況之下還能夠提供IP位址,而Link-local Address的範圍在於:
但是,在這段範圍內並不是所有的位址都可以使用,目前而言,169.254.0.0/24和169.254.255.0/24被保留起來,以便未來可以提供不同的用途。
如果是使用Windows 9x的作業系統平台(不包含Windows NT作業系統),是不能經由DHCP伺服器來取得IP位址,這個時候就會隨意從169.254.1.0?169.254.254.255這個範圍內取一個IP位址來使用。但是,這樣隨意取用的作法很有可能會造成IP衝突,若有IP衝突就只能靠自己去處理。