詳解:NAT原理及在VxWorks上的實現
Internet的最初設計,并沒有考慮到需要支持目前這樣龐大的互聯網,因此在IPv4的設計當中,IP地址僅使用了32bit來標識網絡中的一個節點設備,雖然這很好地解決了IP數據報的對齊問題,但隨著Internet的迅猛發展,加上一些不合理的地址分配方式,目前IP地址已嚴重缺乏,IP地址短缺已成為目前Internet所面臨的最大問題之一。
本文引用地址:http://www.j9360.com/article/201609/304538.htm為了節約IP地址資源,IETF拋棄了傳統的地址分類方式(把IP地址空間人為地劃分為A、B、C、D類地址的方式)。開始使用在RFC 1918中指定的CIDR(Classless Inter-Domain Routing)。同時為了解決IP地址耗損的問題,在RFC 1631中提出了使用NAT來解決共用IP地址訪問Internet的問題。
1 NAT 概況
NAT是把一個網絡中使用的IP地址翻譯成能被另一個網絡識別的IP地址。一個網絡被指定為內部網絡,另一個為外部網絡。通常,一個公司把自己的本地內部網絡地址映射到一個或多個全局外部IP地址,并把收到的包中的全局IP地址解釋成本地IP地址。這也有助于安全,因為每個出去和進來的請求都必須經過一個翻譯過程,這是一個認證請求或把它與以前請求匹配的過程。
NAT包含在路由器中,通常也是防火墻的一部分。網絡管理員創建一個NAT表,用它來實現全局到本地和本地到全局地址的映射。NAT也可以和策略利用路由一起使用。NAT可以靜態定義,也可以根據IP地址池動態進行。
NAT的描述詳見RFC 1631。它討論了NAT與CIDR的關系,這是一個解決IP地址耗盡的方法。NAT通過區別公共IP地址和私有IP地址而減少了對公共IP地址的需求。CIDR把公共IP地址聚集在一起,減少了IP地址的浪費。
2 NAT 原理
在傳統的標準的TCP/IP通信過程中,所有的路由器僅僅是充當一個中間人的角色,也就是通常所說的存儲轉發,路由器并不會對轉發的數據包進行修改,比如對于以太網接口,路由器除了將源MAC 地址換成自己的MAC 地址以外,路由器不會對轉發的數據包做任何修改。NAT(Network Address Translate,網絡地址翻譯)恰恰是出于某種特殊需要而對數據包的源IP地址、目的IP地址、源端口、目的端口進行改寫的操作。
從原理的角度可以將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是改變轉發數據包的源地址,所謂DNAT就是改變轉發數據包的目的地址。
3 NAT 的VxWorks 實現
3.1 VxWorks的底層接口概況
3.1.1 VxWorks MUX 接口層
在VxWorks中,TCP/IP協議棧使用MUX接口去和數據鏈路層通信,MUX接口的目的是隔離數據鏈路層和網絡層。MUX接口之上是網絡協議層,比如TCP/IP、 MUX_PROTO_OUTPUT、 MUX_PROTO_SNARF等協議,在MUX之下為網絡硬件的驅動程序。MUX接口層提供一套接口去完成協議和驅動注冊,協議和驅動之間數據接收、發送,Multicast地址訪問,MUX ioctl等工作。整個層次結構如圖1所示。
3.1.2 VxWorks 中對IP數據包的截獲
要在VxWorks中實現NAT,必須實現兩個基本操作:IP數據包的截獲與IP數據包的偽裝處理。
對于VxWorks協議棧來講,NAT的存在是透明的。所以,要實現NAT的功能,必須在VxWorks網絡協議棧處理數據包之前截獲數據。要實現這一點,VxWorks為我們提供了兩類鉤子函數,截獲以太幀的EtherHook和截獲IP數據包的IpFilterHook。
其中EtherHook又包括EtherInputHook和EtherOutputHook,分別用來截獲接收和發送的以太幀。用戶可以通過EtherInputHookAdd和EtherOutputHookAdd來分別進行安裝。
而IpFilterHook提供對IP數據包的截獲,它只對應一個鉤子函數,用IpFilterHookAdd來進行安裝。當收到一個IP數據包的時候,IpFilterHook會被自動調用,從而達到對IP數據包截獲的目的。
對比兩種接口,EtherInputHookAdd將調用MuxBind去添加一個MUX_PROTO_SNARF協議,這樣可以得到進入MUX接口層的所有數據包。而由IpFilterHookAdd安裝的IpFilterHook,不屬于MUX接口層,僅僅用來截獲IP數據包,而不會接收到非IP數據包。
鑒于以上的區別,我們使用IpFilterHookAdd函數安裝的IpFilterHook來截獲IP數據包比較合適,參見圖2。
3.2 NAT偽裝策略
3.2.1 網絡接口
網絡接口是VxWorks的一個內核對象,它是由網絡驅動程序注冊的。它在內核中用于標識網絡設備的驅動程序,包含著該網絡設備特有的屬性、配置及操作接口等。而這個驅動程序可以驅動一個特定型號的網絡芯片,比如I82557,RTL 8139等,也可以驅動一些其他類型的設備,比如通過Serial Port、CompactPCI Bus、Loopback等。在VxWorks中,接收到的IP數據被保存在一個mBlk的結構當中。該結構除保存數據內容外,還保存了管理數據內容的信息結構以及接口信息。
3.2.2 哪些IP數據包需要偽裝
在做NAT地址映射時,我們需要判斷對哪些IP包進行偽裝(NAT變換)。我們通過下面這個實例來進行講解(見圖3)。
在這個實例中,網關通過網絡接口If0連接到局域網中,并通過If1連接到Internet上,同時,網關啟用NAT功能。此時,位于局域網中的主機A如果想訪問Internet上10.2.4.0/24網段的主機B,最好的方法是通過網關上的NAT。
那么,具體哪些包需要進行NAT變換呢?我們先根據源地址和目的地址來劃分網關可能收到的包的類型。
(1)接口If0收到的IP數據包,目的地址為網關If0接口的IP地址。
(2)接口If0收到的IP數據包,目的地址為網關If1接口的IP地址。
(3)接口If0收到的IP數據包,目的地址非網關任一接口的地址的私網IP地址。
(4)接口If0收到的IP數據包,目的地址非網關任一接口的地址的公網IP地址。
(5)接口If1收到的IP數據包,目的地址為If1接口的IP地址。
(6)接口If1收到的IP數據包,目的地址非If1接口的IP地址。
對于前面3種情況,NAT不進行任何處理,直接交給VxWorks網絡協議棧,由協議棧來做進一步的處理。
對于第4種情況,符合NAT變換的需求,NAT將改變原IP包的源地址為網關的外出口地址,同時選擇網關該接口未分配的端口來修改原IP包中的源端口,并添加該記錄到NAT映射表內。最后把IP包送到If1接口,然后發送到目的主機。
對于第5種情況,我們將收到的IP數據包送到NAT處理。通過查找NAT映射表,決定是否將其目標地址轉換為LAN中的某一個地址,還是不做任何處理,直接歸還給協議棧。對于第6種情況,我們這里也簡單地直接歸還給協議棧進行處理。
評論