■ 湖北 楊華
編者按:在使用防火墻設(shè)備時難免會存在一些誤區(qū),就比如本文所討論的ICMP協(xié)議數(shù)據(jù)包的“穿越”問題。本文對一些相關(guān)概念問題進(jìn)行簡要的解析。
防火墻技術(shù)在網(wǎng)絡(luò)運維中占有重要的份量,也是一個專業(yè)網(wǎng)絡(luò)工程師必備的技能。但有些人由于對一些基本概念掌握不夠細(xì)致,在應(yīng)用環(huán)境中,會產(chǎn)生一些誤區(qū),多走不少彎路。本文針對初學(xué)者中比較常見的基于狀態(tài)檢測的流量穿越誤區(qū)進(jìn)行剖析探討。
實驗環(huán)境包括EVE網(wǎng)絡(luò)模擬器,一臺防火墻ASA,兩臺三層交換機(jī)SW3-1與SW3-2,通過SW3-1模擬內(nèi)網(wǎng),SW3-2模擬外網(wǎng),ASA上進(jìn)行基本配置,內(nèi)網(wǎng)訪問外網(wǎng)進(jìn)行NAPT翻譯。如圖1所示。
通過本次實驗來驗證狀態(tài)防火墻,數(shù)據(jù)流量主動從高安全級別(inside或turst)到低安全級別(outside or untrust)是可以正常連接的(基于連接狀態(tài)檢測)。反之則會禁止,除非通過訪問策略放行。
在SW3-1通過Telnet遠(yuǎn)程登錄到SW3-2上,可以正常訪問。
SW3-1#TELNET 200.0.0.1 //連接成功
圖1 實驗環(huán)境模擬圖
Trying 200.0.0.1 ...Open
User Access Verifi cation
Password:
ASA-5520# sh xlate//NAPT翻譯成功
1 in use,1 most used
TCP PAT from inside:192.168.1.1/18148 to out side:200.0.0.10/52167
根據(jù)防火墻的訪問規(guī)則,從SW3-1出去到SW3-2的數(shù)據(jù)包是可以正常通行的,但回來的數(shù)據(jù)包是從低級別到高級別,不是應(yīng)該被防火墻阻止的嗎?
這在之前的包過濾防火墻是這樣的,若要放行,需要配置大量的訪問控制策略,但在狀態(tài)檢測防火墻中它會檢測出去的數(shù)據(jù)流量連接狀態(tài),發(fā)現(xiàn)它是一個從高級別發(fā)起到低級別的數(shù)據(jù)包,而且監(jiān)控到連接信息,就會認(rèn)定它是安全,回來時就默認(rèn)放行了。
對于初學(xué)者來講,能完成以上實驗配置,并分析其原理,應(yīng)該非常成功了。但對于一個網(wǎng)絡(luò)工程師,怎么會放通過Ping去測試一下連通性這個下意識的動作呢?
通過發(fā)送SW3-1#ping 200.0.0.1之后發(fā)現(xiàn),結(jié)果大失所望了,竟然不通。
通過抓包分析,在防火墻上ICMP數(shù)據(jù)已成功進(jìn)行NAPT翻譯:
ASA-5520# sh xlate
2 in use,2 most used
ICMP PAT from inside:192.168.1.1/1 to outside:200.0.0.10/8154
但是回來的數(shù)據(jù)包被阻止了,通過輸入“debug icmp”,看不到回來的數(shù)據(jù)包了,這與上面的實驗結(jié)論是相背的。筆者開始分析是否防火墻上進(jìn)行ICMP的過濾,但通過檢測并沒有。
原來,狀態(tài)檢測是基于TCP/UDP的連接來進(jìn)行識別的,TCP默認(rèn)是監(jiān)控的,有狀態(tài)化信息,記錄源IP及目的IP、源端口及目的端口等信息,形成映射。所以回包的時候會對比這些映射信息,符合條件就放行了。而ICMP數(shù)據(jù)包并沒有通過TCP/UDP去承載,出去的時候ASA沒有記錄狀態(tài)化信息,沒有形成映射,所以回包的時候沒法對比,默認(rèn)就丟掉了。
對于一個優(yōu)秀的網(wǎng)絡(luò)工程師來講,沒有什么解決不了的問題,雖然它并不影響實驗結(jié)果。該問題可以通過兩個方法來解決。
定義策略:access-list icmp_out extended permit icmp any any
策略應(yīng)用:access-group icmp_out in int outside
ASA(config)# policymap global_policy //默認(rèn)ASA有的global_policy
ASA(config-pmap)#class inspection_default//默認(rèn)監(jiān)控
ASA(config-pmap-c)#inspect icmp //增加icmp監(jiān)控
ASA-5520# sh run | in inspect //再次顯示默認(rèn)的監(jiān)控列表
class-map inspection_default
class inspection_default
inspect dns preset_dns_map
inspect ftp
inspect h323 h225
inspect h323 ras
……
inspect icmp
從以上監(jiān)控列表不難看出,TCP和UDP是例外的,不在該范圍之內(nèi)。FTP是動態(tài)應(yīng)用,雖然有TCP的22、23端口,但是它的流量都是臨時產(chǎn)生的,F(xiàn)TP必須有用戶名和密碼的登錄。這就是動態(tài)的交互,也就是TCP上有特殊字段會被標(biāo)記的,標(biāo)記部分沒有告知ASA放行的話,ASA是不識別的,所以FTP比較特殊,這里仍讓能看到FTP的檢測。
細(xì)心的朋友會發(fā)現(xiàn)ICMP在做NAPT翻譯時,居然有對應(yīng)的端口,眾所周知ICMP數(shù)據(jù)包本身是沒有端口號的。
經(jīng)過反復(fù)實驗,筆者發(fā)現(xiàn)了其中的玄機(jī)。原來NAPT的端口轉(zhuǎn)換是為了區(qū)分inside local地址。
對于有端口的應(yīng)用來說,一般轉(zhuǎn)換為較大的端口號從而避免和常用端口沖突。而對于一些沒有端口號的應(yīng)用(比如ICMP)來說,所謂端口號僅僅是為了區(qū)分不同ICMP包,可以理解為就是特定的數(shù)字標(biāo)記,不具有任何其他意義。通過不斷的Ping下去,端口號會一直增加,一個echo_request的端口數(shù)字對應(yīng)一個echo_replay端口數(shù)字,和四層包頭的端口號沒有任何關(guān)系。
通過使用“SW3-1#ping 200.0.0.1”命令,筆者試著進(jìn)行了兩次數(shù)據(jù)包的連接測試,結(jié)果如下:
ASA-5520# sh xlate
ICMP PAT from inside:192.168.1.1/3 to outside:200.0.0.10/45184
ICMP PAT from inside:192.168.1.1/2 to outside:200.0.0.10/56735
ASA在進(jìn)行NAPT時,如果發(fā)現(xiàn)IP包頭中協(xié)議號為1,就會知道是ICMP的包,而不用考慮四層端口號,直接用一個端口數(shù)字標(biāo)記轉(zhuǎn)換即可。
當(dāng)然,不同的設(shè)備廠商可能有不同的處理機(jī)制,讓NAT通過一些特殊的字段來識別。
例如,在ICMP中有Iden tifier和Sequence Number,identifier用來辨別不同的Ping流程。比如我們啟動兩個控制臺窗口,分別輸入Ping命令,就會運行兩個不同的Ping進(jìn)程。這兩個Ping進(jìn)程就依靠不同的identifier來區(qū)分。而一次Ping過程不止發(fā)送一個數(shù)據(jù)包,如果一次發(fā)送多個數(shù)據(jù)包,那么同一個Ping流程內(nèi)就用sequence number把不同的數(shù)據(jù)包給區(qū)分開來,這個字段一般都是遞增的。
不同廠商的防火墻設(shè)備可能有不同的處理機(jī)制,為了方便用戶,可能隱藏了一些我們未知的技術(shù)細(xì)節(jié),比如上面的ICMP協(xié)議數(shù)據(jù)包的監(jiān)控。