a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > 詳解:NAT原理及在VxWorks上的實現

詳解:NAT原理及在VxWorks上的實現

作者: 時間:2016-09-12 來源:網絡 收藏

3.3 NAT 映射表及timer管理

3.3.1 NAT 映射表

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

3.3.2 為什么NAT 映射表項需要設置timer

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

3.4 NAT 映射表管理

3.4.1 NAT 映射表的創建、查找及刪除

在NAT的實現過程當中,如何快速地尋找一個IP包在NAT中是否有對應的映射選項,需要一個高效的數據結構和快速的查找算法。

在實現當中,我們選用采用索引查詢的散列表來作為存儲NAT映射表項的數據結構。使用協議類型值、內部網絡地址和端口來計算散列值,并結合映射表項的標志來確定需要做地址翻譯的IP數據包。

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

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

為了避免已經出現異常的連接繼續占用系統資源,在每個映射表項的定時器超時后,其回掉函數將刪除存儲在散列表中的對應的NAT映射表項。

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

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

3.5 TCP session state和TCP sequence number管理

3.5.1 TCP SYN/FIN/RST 狀態

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

3.5.2 TCP sequence number 調整

NAT的原理就是通過修改過往IP數據包的內容,來達到偽裝IP數據包的目的。

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

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

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

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

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

3.6 端口轉發功能

3.6.1 為什么需要端口轉發功能

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

為了使NAT能夠處理這種由外部網絡首先發起的網絡連接,NAT允許手工配置一些NAT的映射表項。這項功能就叫端口轉發。

3.6.2 端口轉發實現過程

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

3.7 NAT配置接口

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

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

端口轉發映射表配置:配置NAT可以對那些由外部網絡發起的網絡連接進行地址轉換,以及如何進行地址轉換。

3.8 NAT如何處理IP分片

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

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

3.9 NAT的測試

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

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



關鍵詞:

評論


相關推薦

技術專區

關閉