新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應用 > 詳解:NAT原理及在VxWorks上的實現(xiàn)

詳解:NAT原理及在VxWorks上的實現(xiàn)

作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

3.3 NAT 映射表及timer管理

3.3.1 NAT 映射表

對于每一個需要進行地址翻譯的IP數(shù)據(jù)包,內(nèi)核必須知道如何翻譯它。NAT 映射表就是用來解決這個問題的。NAT 映射表中記錄有足夠標識一個連接的所有信息:協(xié)議類型、源地址、源端口、目的地址、目的端口、NAT地址、NAT端口等。通過IP數(shù)據(jù)包中攜帶的信息可以在NAT表中找到最匹配的一項。在實現(xiàn)當中,我們采用表1的結(jié)構(gòu)來表示一個映射表項。

3.3.2 為什么NAT 映射表項需要設(shè)置timer

為了避免通過NAT進行通信的主機突然崩潰后,出現(xiàn)殘留的映射表項占據(jù)系統(tǒng)資源的情況。在每個NAT映射表項中,我們使用了一個軟件定時器來指示這個映射表項是否超時。如果在一段時間內(nèi)這個表項沒有被訪問過,從而導致定時器超時,NAT將清除這個表項,以減少系統(tǒng)資源消耗。在這個NAT的實現(xiàn)過程中,為了使TCP/IP協(xié)議棧能夠正常工作,針對不同的協(xié)議以及協(xié)議的不同階段,我們使用了不同的默認超時值。如表2所示。

3.4 NAT 映射表管理

3.4.1 NAT 映射表的創(chuàng)建、查找及刪除

在NAT的實現(xiàn)過程當中,如何快速地尋找一個IP包在NAT中是否有對應的映射選項,需要一個高效的數(shù)據(jù)結(jié)構(gòu)和快速的查找算法。

在實現(xiàn)當中,我們選用采用索引查詢的散列表來作為存儲NAT映射表項的數(shù)據(jù)結(jié)構(gòu)。使用協(xié)議類型值、內(nèi)部網(wǎng)絡(luò)地址和端口來計算散列值,并結(jié)合映射表項的標志來確定需要做地址翻譯的IP數(shù)據(jù)包。

如果當前的IP數(shù)據(jù)包是外出的IP數(shù)據(jù)包,但是沒有匹配到一個合適的映射表項,那么NAT將建立一個新的映射表項,添加到散列表中。

如果當前的IP數(shù)據(jù)包是來自于外部網(wǎng)絡(luò)的,要么能夠匹配到一項合適的映射表項,要么目的端口已經(jīng)被配置為端口轉(zhuǎn)發(fā)(在這種情況下,NAT將依據(jù)端口轉(zhuǎn)發(fā)配置,在NAT映射表中靜態(tài)添加一個入口),否則,將不會改變這個IP數(shù)據(jù)包。

為了避免已經(jīng)出現(xiàn)異常的連接繼續(xù)占用系統(tǒng)資源,在每個映射表項的定時器超時后,其回掉函數(shù)將刪除存儲在散列表中的對應的NAT映射表項。

3.4.2 如何互斥地訪問NAT映射表

在NAT映射表的處理和映射表項超時處理中,都需要對映射表進行查找、添加和刪除操作。為了安全地訪問映射表,我們必須同步對NAT映射表的訪問。在實現(xiàn)當中,我們使用了VxWorks提供的二進制信號量來保護對NAT映射表的操作。

3.5 TCP session state和TCP sequence number管理

3.5.1 TCP SYN/FIN/RST 狀態(tài)

對于一個TCP連接,如果NAT收到一個帶有RST標志的TCP數(shù)據(jù)包,我們將NAT映射表中對應表項的定時器超時值置1,那么這個映射表很快將被刪除。如果收到一個FIN數(shù)據(jù)包,那么就重新設(shè)置對應表項的定時器超時值為120s。否則,我們設(shè)置對應映射表項的定時器超時值為5min。

3.5.2 TCP sequence number 調(diào)整

NAT的原理就是通過修改過往IP數(shù)據(jù)包的內(nèi)容,來達到偽裝IP數(shù)據(jù)包的目的。

在對部分基于TCP的應用協(xié)議(如FTP)的數(shù)據(jù)包進行NAT變換時,如果由于應用程序支持模塊改變了TCP數(shù)據(jù)包的內(nèi)容,導致數(shù)據(jù)包的長度發(fā)生變化,那么,為了使當前的TCP連接能夠繼續(xù)正常連接,就必須重新調(diào)整TCP的序列號(見圖4)。

TCP連接的序列號是在兩個方向上進行調(diào)整的。調(diào)整的原則如下:

如果外出的數(shù)據(jù)包長度減小,那么當前外出的TCP數(shù)據(jù)包的序列號將減小,反之則增加。

對于收到的來自于外部網(wǎng)絡(luò)的ACK 序列號,就要相應地增加和減小了。

這里我們需要注意,由于VxWorks沒有使用Real Time來初始化TCP連接的初始序列號,而是使用一個固定的值來初始化它,導致每次重啟之后VxWorks的第一次TCP連接都會以相同的序列號開始遞增。由于VxWorks的TCP/IP協(xié)議棧的這種特征,我們在接收到TCP連接的第一個TCP數(shù)據(jù)包(帶有SYN標志,沒有ACK標志)時,要重新初始化已經(jīng)匹配的NAT映射表項,避免因為TCP連接序列號調(diào)整出錯。

3.6 端口轉(zhuǎn)發(fā)功能

3.6.1 為什么需要端口轉(zhuǎn)發(fā)功能

如果有某個處在Internet上的主機想訪問NAT服務器后的某個主機,這個連接必須已經(jīng)被記錄在NAT映射表中,但由于某些安全原因,NAT僅僅對由內(nèi)部網(wǎng)絡(luò)發(fā)起的網(wǎng)絡(luò)連接有效。當外部IP數(shù)據(jù)包進入允許NAT功能的接口時,如果NAT找不到合適的映射表項,IP數(shù)據(jù)包將交給VxWorks協(xié)議棧來處理。

為了使NAT能夠處理這種由外部網(wǎng)絡(luò)首先發(fā)起的網(wǎng)絡(luò)連接,NAT允許手工配置一些NAT的映射表項。這項功能就叫端口轉(zhuǎn)發(fā)。

3.6.2 端口轉(zhuǎn)發(fā)實現(xiàn)過程

由外到內(nèi)的IP包指的是從公網(wǎng)通過NAT發(fā)送到私有網(wǎng)絡(luò)的IP包。它的源IP是公共IP,目的IP是NAT的公共IP。當截獲到一個由外到內(nèi)的IP包時,NAT就以IP包的目的IP和目的Port加上包的協(xié)議類型作為NAT映射表項的匹配查詢條件進行搜索。如果找到一個對應的表項,就用表項的Real Src IP和Real Src Port來替換IP包的目的IP和目的Port,而保持IP包的源IP和源Port不變。然后,重新計算TCP或UDP的校驗和,再計算IP頭的校驗和,最后把IP包重新歸還給VxWorks的網(wǎng)絡(luò)協(xié)議棧。如果在映射表中沒有搜索到對應的表項,則對IP包不作任何處理,直接歸還給VxWorks網(wǎng)絡(luò)協(xié)議棧。

3.7 NAT配置接口

為了使NAT能夠適應某些變化,我們在實現(xiàn)過程當中加入了對NAT的配置接口,主要對以下兩方面需要進行配置。

NAT接口配置:配置在那個允許NAT功能的網(wǎng)絡(luò)接口上。這個接口是和外部網(wǎng)絡(luò)相連的,有唯一的全局IP地址。

端口轉(zhuǎn)發(fā)映射表配置:配置NAT可以對那些由外部網(wǎng)絡(luò)發(fā)起的網(wǎng)絡(luò)連接進行地址轉(zhuǎn)換,以及如何進行地址轉(zhuǎn)換。

3.8 NAT如何處理IP分片

NAT本身還應該考慮IP數(shù)據(jù)包的分片。但是在分片的IP數(shù)據(jù)包中,除了第一個IP數(shù)據(jù)包帶有源、目的端口信息以外,后續(xù)的IP分片都沒有端口信息。

這樣,IP數(shù)據(jù)包分片的這個特征給我們的NAT處理帶來了很多不便。因此,在這次的實現(xiàn)過程中,我們的NAT實現(xiàn)暫時不支持分片的IP數(shù)據(jù)包。

3.9 NAT的測試

如圖3所示,主機A通過NAT訪問主機B上的HTTP服務器,主機B通過手工配置在NAT上的映射表項訪問主機A上的TFTP服務器。

整個過程非常良好,TCP包和UDP包以及Port-Forward功能也成功得到了驗證。



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉