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

