新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > NAT原理以及在VxWorks上的實(shí)現(xiàn)

NAT原理以及在VxWorks上的實(shí)現(xiàn)

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

3.3 NAT 映射表及timer管理

3.3.1 NAT 映射表

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

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

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

3.4 NAT 映射表管理

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

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

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

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

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

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

3.4.2 如何互斥地訪問(wèn)NAT映射表

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

3.5 TCP session state和TCP sequence number管理

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

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

3.5.2 TCP sequence number 調(diào)整

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

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

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

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

對(duì)于收到的來(lái)自于外部網(wǎng)絡(luò)的ACK 序列號(hào),就要相應(yīng)地增加和減小了。

這里我們需要注意,由于VxWorks沒(méi)有使用Real Time來(lái)初始化TCP連接的初始序列號(hào),而是使用一個(gè)固定的值來(lái)初始化它,導(dǎo)致每次重啟之后VxWorks的第一次TCP連接都會(huì)以相同的序列號(hào)開(kāi)始遞增。由于VxWorks的TCP/IP協(xié)議棧的這種特征,我們?cè)诮邮盏絋CP連接的第一個(gè)TCP數(shù)據(jù)包(帶有SYN標(biāo)志,沒(méi)有ACK標(biāo)志)時(shí),要重新初始化已經(jīng)匹配的NAT映射表項(xiàng),避免因?yàn)門(mén)CP連接序列號(hào)調(diào)整出錯(cuò)。

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

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

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

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

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

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

3.7 NAT配置接口

為了使NAT能夠適應(yīng)某些變化,我們?cè)趯?shí)現(xiàn)過(guò)程當(dāng)中加入了對(duì)NAT的配置接口,主要對(duì)以下兩方面需要進(jìn)行配置。

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

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

3.8 NAT如何處理IP分片

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

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

3.9 NAT的測(cè)試

如圖3所示,主機(jī)A通過(guò)NAT訪問(wèn)主機(jī)B上的HTTP服務(wù)器,主機(jī)B通過(guò)手工配置在NAT上的映射表項(xiàng)訪問(wèn)主機(jī)A上的TFTP服務(wù)器。

整個(gè)過(guò)程非常良好,TCP包和UDP包以及Port-Forward功能也成功得到了驗(yàn)證。



關(guān)鍵詞:

評(píng)論


相關(guān)推薦

技術(shù)專(zhuān)區(qū)

關(guān)閉