ICMP的全名是Internet Control and Message Protocal即因特網(wǎng)控制消息/錯誤報文協(xié)議,這個協(xié)議主要是用來進行錯誤信息和控制信息的傳遞,例如著名的Ping和Tracert工具都是利用ICMP協(xié)議中的ECHO request報文進行的(請求報文ICMP ECHO類型8代碼0,應(yīng)答報文ICMP ECHOREPLY類型0代碼0)。
ICMP協(xié)議有一個特點---它是無連結(jié)的,也就是說只要發(fā)送端完成ICMP報文的封裝并傳遞給路由器,這個報文將會象郵包一樣自己去尋找目的地址,這個特點使得ICMP協(xié)議非常靈活快捷,但是同時也帶來一個致命的缺陷---易偽造(郵包上的寄信人地址是可以隨便寫的),任何人都可以偽造一個ICMP報文并發(fā)送出去,偽造者可以利用SOCK_RAW編程直接改寫報文的ICMP首部和IP首部,這樣的報文攜帶的源地址是偽造的,在目的端根本無法追查,(攻擊者不怕被抓那還不有恃無恐?)根據(jù)這個原理,外面出現(xiàn)了不少基于ICMP的攻擊軟件,有通過網(wǎng)絡(luò)架構(gòu)缺陷制造ICMP風(fēng)暴的,有使用非常大的報文堵塞網(wǎng)絡(luò)的,有利用ICMP碎片攻擊消耗服務(wù)器CPU的,甚至如果將ICMP協(xié)議用來進行通訊,可以制作出不需要任何TCP/UDP端口的木馬(參見揭開木馬的神秘面紗三)......既然ICMP協(xié)議這么危險,我們?yōu)槭裁床魂P(guān)掉它呢?
我們都知道,Win2000在網(wǎng)絡(luò)屬性中自帶了一個TCP/IP過濾器,我們來看看能不能通過這里關(guān)掉ICMP協(xié)議,桌面上右擊網(wǎng)上鄰居->屬性->右擊你要配置的網(wǎng)卡->屬性->TCP/IP->高級->選項->TCP/IP過濾,這里有三個過濾器,分別為:TCP端口、UDP端口和IP協(xié)議,我們先允許TCP/IP過濾,然后一個一個來配置,先是TCP端口,點擊"只允許",然后在下面加上你需要開的端口,一般來說WEB服務(wù)器只需要開80(www),F(xiàn)TP服務(wù)器需要開20(FTP Data),21(FTP Control),郵件服務(wù)器可能需要打開25(SMTP),110(POP3),以此類推......接著是UDP,UDP協(xié)議和ICMP協(xié)議一樣是基于無連結(jié)的,一樣容易偽造,所以如果不是必要(例如要從UDP提供DNS服務(wù)之類)應(yīng)該選擇全部不允許,避免受到洪水(Flood)或碎片(Fragment)攻擊。最右邊的一個編輯框是定義IP協(xié)議過濾的,我們選擇只允許TCP協(xié)議通過,添加一個6(6是TCP在IP協(xié)議中的代碼,IPPROTO_TCP=6),從道理上來說,只允許TCP協(xié)議通過時無論UDP還是ICMP都不應(yīng)該能通過,可惜的是這里的IP協(xié)議過濾指的是狹義的IP協(xié)議,從架構(gòu)上來說雖然ICMP協(xié)議和IGMP協(xié)議都是IP協(xié)議的附屬協(xié)議,但是從網(wǎng)絡(luò)7層結(jié)構(gòu)上ICMP/IGMP協(xié)議與IP協(xié)議同屬一層,所以微軟在這里的IP協(xié)議過濾是不包括ICMP協(xié)議的,也就是說即使你設(shè)置了“只允許TCP協(xié)議通過”,ICMP報文仍然可以正常通過,所以如果我們要過濾ICMP協(xié)議還需要另想辦法。
剛剛在我們進行TCP/IP過濾時,還有另外一個選項:IP安全機制(IP Security),我們過濾ICMP的想法就要著落在它身上。
打開本地安全策略,選擇IP安全策略,在這里我們可以定義自己的IP安全策略。
一個IP安全過濾器由兩個部分組成:過濾策略和過濾操作,過濾策略決定哪些報文應(yīng)當(dāng)引起過濾器的關(guān)注,過濾操作決定過濾器是“允許”還是“拒絕”報文的通過。要新建IP安全過濾器,必須新建自己的過濾策略和過濾操作:右擊本機的IP安全策略,選擇管理IP過濾器,在IP過濾器管理列表中建立一個新的過濾規(guī)則:ICMP_ANY_IN,源地址選任意IP,目標(biāo)地址選本機,協(xié)議類型是ICMP,切換到管理過濾器操作,增加一個名為Deny的操作,操作類型為"阻止"(Block)。這樣我們就有了一個關(guān)注所有進入ICMP報文的過濾策略和丟棄所有報文的過濾操作了。需要注意的是,在地址選項中有一個鏡像選擇,如果選中鏡像,那么將會建立一個對稱的過濾策略,也就是說當(dāng)你關(guān)注any IP->my IP的時候,由于鏡像的作用,實際上你也同時關(guān)注了my IP->any IP,你可以根據(jù)自己的需要選擇或者放棄鏡像。
再次右擊本機的IP安全策略,選擇新建IP過濾策略,建立一個名稱為ICMP Filter的過濾器,通過增加過濾規(guī)則向?qū)В覀儼褎倓偠x的ICMP_ANY_IN過濾策略指定給ICMP Filter,然后在操作選框中選擇我們剛剛定義的Deny操作,退出向?qū)Т翱,右擊ICMP Filter并啟用它,現(xiàn)在任何地址進入的ICMP報文都會被丟棄了。
雖然用IP sec能夠?qū)CMP報文進行過濾,不過操作起來太麻煩,而且如果你只需要過濾特定的ICMP報文,還要保留一些常用報文(如主機不可達、網(wǎng)絡(luò)不可達等),IP sec策略就力不從心了,我們可以利用Win2000的另一個強大工具路由與遠程訪問控制(Routing & Remote Access)來完成這些復(fù)雜的過濾操作。
路由與遠程訪問控制是Win2000用來管理路由表、配置VPN、控制遠程訪問、進行IP報文過濾的工具,默認情況下并沒有安裝,所以首先你需要啟用它,打開"管理工具"->"路由與遠程訪問",右擊服務(wù)器(如果沒有則需要添加本機)選擇"配置并啟用路由及遠程訪問",這時配置向?qū)屇氵x擇是什么樣的服務(wù)器,一般來說,如果你不需要配置VPN服務(wù)器,那么選擇"手動配置"就可以了,配置完成后,主機下將出現(xiàn)一個IP路由的選項,在"常規(guī)"中選擇你想配置的網(wǎng)卡(如果你有多塊網(wǎng)卡,你可以選擇關(guān)閉某一塊的ICMP),在網(wǎng)卡屬性中點擊"輸入篩選器",添加一條過濾策略"from:ANY to:ANY 協(xié)議CMP 類型:8 :編碼:0 丟棄"就可以了(類型8編碼0就是Ping使用的ICMP_ECHO報文,如果要過濾所有的ICMP報文只需要將類型和編碼都設(shè)置為255)