路由器已配置成PAT方式。圖1是一個最簡單的NAT組網(wǎng)圖,內(nèi)網(wǎng)使 用192.168.1.0/24的私網(wǎng)地址,外網(wǎng)是202.101.0.0/24的公網(wǎng)地址,而在設(shè)備連接外網(wǎng)的接口上我們啟用了NAT。
我們從內(nèi)網(wǎng)的PC1去PING外網(wǎng)的SERVER是可以成功的,而我們在設(shè)備AR2上看到了這樣的一個表項,如圖2所示(截取一個數(shù)據(jù)包為例)。
當(dāng)PC1的ICMP數(shù)據(jù)包到達(dá)AR2的出口接口時,源IP被替換成了接口IP,而且它將ICMP數(shù)據(jù)包中的icmpId項的值(14783十進(jìn)制)也換成了新的icmpId值(10270十進(jìn)制),通過會話表它就可以實現(xiàn)ICMP無端口轉(zhuǎn)換了。所以華為的設(shè)備是通過ICMP的ID值來映射內(nèi)網(wǎng)IP到外網(wǎng)IP的關(guān)系。
圖1 NAT組網(wǎng)圖
圖2 設(shè)備AR2表項
圖3 內(nèi)網(wǎng)ICMP報文
圖4 外網(wǎng)ICMP報文
通過抓包軟件分別獲取內(nèi)網(wǎng)與外網(wǎng)的ICMP數(shù)據(jù)包如圖3、圖4所示。
圖3是從PC1發(fā) 出的ICMP數(shù)據(jù)包,id值 為0xbf39(十六進(jìn)制),轉(zhuǎn)換為十進(jìn)制即14783。
圖4是在SERVER上接收到的ICMP數(shù)據(jù)包,id值為0x1e28(十六進(jìn)制),轉(zhuǎn)換為十進(jìn)制即10270。
路由器已配置成PAT方式。圖5是一個最簡單的NAT組網(wǎng)圖,內(nèi)網(wǎng)使用192.168.1.0/24的私網(wǎng)地址,外網(wǎng)是63.19.6.0/24的公網(wǎng)地址,而在設(shè)備連接外網(wǎng)的接口上我們啟用了NAT。
我們從內(nèi)網(wǎng)的PC1去PING外網(wǎng)的SERVER0是可以成功的,而我們在設(shè)備Router0上看到了這樣的一個表項,如圖6所示。
思科的網(wǎng)絡(luò)設(shè)備是隨機(jī)產(chǎn)生端口號來映射內(nèi)網(wǎng)IP與外網(wǎng)IP的關(guān)系,如果有多個IP需要映射,這是先在自己的映射表查找沒有被占用的端口號,而且該映射在會話完成后會自動消除更新,這樣就可以保證有充足的端口資源來映射內(nèi)網(wǎng)IP的需求了。
實驗環(huán)境:Cisco Packet Tracer (思科模擬器)
NAT對ICMP的處理取決于NAT地址轉(zhuǎn)換表和NAT路由器收到ICMP fragment的順序。我們來看一個案例,在該案例中我將發(fā)送1個大小為1473 Byte的ICMP數(shù)據(jù) 包,ping從192.168.1.3到 63.19.6.2,如圖5所示。
數(shù)據(jù)包大小:因為設(shè)備默認(rèn)MTU是1500字節(jié),去掉20字節(jié)的IP頭部和8字節(jié)的ICMP頭部,實質(zhì)上傳送最大數(shù)據(jù)為1472字節(jié),這樣發(fā)送1473字節(jié)的數(shù)據(jù)包剛好超過就會產(chǎn)生分片數(shù)據(jù)包。
圖5 NAT組網(wǎng)圖
圖6 NAT組網(wǎng)圖
注意:在PT模擬器中默認(rèn)PING命令是發(fā)送固定大小的數(shù)據(jù)包,但在交換機(jī)設(shè)備上可配置PING參數(shù)。也可以只輸入PING命令回車,然后在后面的參數(shù)中來進(jìn)行大小等參數(shù)的調(diào)整。
在這個案例中,NAT創(chuàng)建了一個擴(kuò)展的NAT轉(zhuǎn)換條目。這樣在NAT中將沒有任何可用的地址。NAT在收到第一個包的第一個分段(fragment)之前將丟棄所有分段。
開始的時候,我們在地址池中只設(shè)置一個IP地址來運(yùn)行overloading,NAT轉(zhuǎn)換表是空的。NAT的配置如下:
當(dāng)數(shù)據(jù)包到達(dá)NAT路由器的時候會發(fā)生什么?
首先,第一個包的片段0到達(dá)路由器,NAT創(chuàng)建擴(kuò)展的地址轉(zhuǎn)換條目。然后NAT轉(zhuǎn)換并轉(zhuǎn)發(fā)了第一個包的片段0。地址轉(zhuǎn)換表如表1所示。
注意:這個24320這個數(shù)字,這個是包含在ICMP頭部中的ICMP 唯一標(biāo)識值。只有片段0中包含這個ICMP頭部。為了判斷這個片段是許多片段中的一個,NAT需要跟蹤IP ident value。如果好多片段擁有相同的IP ident value,那么交換機(jī)認(rèn)為這屬于同一個IP packet。NAT將使用同一條NAT轉(zhuǎn)換條目來轉(zhuǎn)換這些segment。
其次,第一個packet 的片段1到達(dá)路由器。根據(jù)它的IP ident value可以判斷這個片段來自同一個packet。NAT用上面的那條NAT條目來轉(zhuǎn)換和轉(zhuǎn)發(fā)該片段。目的主機(jī)收到了所有的片段后發(fā)送回包。
表1 地址轉(zhuǎn)換表
分析:如果分片數(shù)據(jù)數(shù)據(jù)不是按照順序到達(dá),比如是片段1先到達(dá)路由設(shè)備,它并沒有包含ICMP信息,NAT是如何建立映射表進(jìn)行轉(zhuǎn)發(fā),因為沒有遇到這種情況,也未抓到相應(yīng)數(shù)據(jù)包,希望以后有機(jī)會如愿再進(jìn)行交流。
雖然NAT可以解決IP地址空間不足,也可以很好地隱藏內(nèi)部網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu),使網(wǎng)絡(luò)更安全。但是它畢竟修改了報文的內(nèi)容,隨著應(yīng)用場景的不斷增多,相信還有很多需要NAT進(jìn)行特殊處理的地方,這些地方有待于我們繼續(xù)挖掘、探討,使得NAT技術(shù)更加完善。