FPM可以無狀態化的來控制數據包的頭部或負載,這可能存在一些問題。例如,當兩個網絡設備之間傳輸數據包時,FPM會對所有的數據包檢查,當發現其中包含特定內容時就將其清除。而如果在這些設備之間使用了某種網絡協議,并且該協議采取了某種協商機制(例如協商出一個新的端口號等),對于這種有狀態化的內容,FPM是無法控制的,即FPM只能控制無狀態化的對象。FPM可以用來分析協議并簡化規則的創建,這是FPM的優點之一。
例如FPM可以對IP包頭部的20個字節進行分析,并從中提取合適的特征數據將其添加到規則中即可。FPM可以替換ACL,抵御和過濾惡意的攻擊流量。例如,為防止針對Web服務器的攻擊,可以利用FPM創建一條規則,對所有的TCP數據包進行過濾,如果在其中尋找到80端口,就會以該端口為起點對之后的特定偏移量的內容進行過濾,如果發現諸如“cmd.exe”之類的內容,就將該包丟棄,這樣就可以有效攔截針對Web服務器的攻擊。
在FPM中包含名為“PHDFs”(即協議頭部描述文件)的組件,其存在于思科的ISO中。其主要作用是對數據的頭部進行描述,在應用層、網絡層、傳輸層和接入層等,數據的表達方式都包含頭部數據,PHDFs就是用來概括頭部的一些內容的,針對特定的網絡協議定義了協議頭中每一個字段的內容。FPM可以針對網絡協議中的任何字段進行深度檢測,即讓其檢測協議頭部中的某些字段,并在PHDFs中預先制定好所需字段,這樣便于FPM使用和調用這些字段。
針對不同的網絡協議,可以分別制定對應的PHDFs文件,例如“ICMP.PHDF”等。思科已經在ISO中已經集成了一些PHDF文件。當然,用戶可以使用XML格式自定義所需的PHDFs文件。FPM可以針對數據包進行深度檢測,對于ACL技術無法控制的字段,FPM可以很輕松進行過濾、分析和捕獲其中的特征數據,對于包含非法內容的數據包來說,很容易在FPM技術面前暴露,進而被FPM丟棄。但是,FPM每次只能處理一個數據包。例如對網絡蠕蟲來說,其攻擊威力不可小覷。蠕蟲攻擊會調用HTTP協議,來GET方法來獲取服務器中的“cmd.exe”的訪問權限。
這樣,黑客就可在遠程操作服務器的CMDshell接口非法執行各種危險的指令,如創建黑客賬戶、開啟后門等。在黑客和服務器交互過程中,必然會相關傳遞很多數據包,在其中必然包含“cmd.exe”的特征字符串。使用FPM技術,可對其進行深度分析,如果發現其中包含上述字符串則丟棄。將該策略制定完成后應用到合適的網絡接口上,即可抗擊蠕蟲攻擊。
具體方法是先將包含TCP 80端口信息的TCP數據包單獨提取出來,并在其中的每一個TCP數據包中定位包含80端口信息位置,并開始往后分析256個字節的內容,如果發現存在“cmd.exe”字符串,就將該數據包丟棄。由此看出,使用FPM過濾數據包的方法是先將流量中需要檢測的數據包提取出來,之后在特定區域尋找合乎要求的惡意特征數據,并根據需要丟棄即可。
使用FPM技術雖然可以保護網絡安全,但并非完美無缺。例如在設備性能不夠強悍情況下不宜使用FPM,因為其只能對數據包逐個處理,如需并行處理大量數據包,網絡設備開銷將非常大,如果存在IPS設備的話,就可以取代FPM防護技術。如果某些數據包比較特殊,FPM無法對其識別,自然無法使用其對該類數據包進行過濾檢測。因為FPM技術是基于負載的,利用指定的規則在負載中匹配特征字段,如果攻擊者采用數據包分片的方法,就可以避開FPM的管控。
下面舉例說明FPM的使用方法,例如存在R1、R2和 R3三 臺 路 由 器, R1通過F0/0接口和R2的F0/0接口連接,IP分別為192.168.1.11/24和192.168.1.12/24。R2通 過 F0/1接口和R3的F0/0接口連接,IP分別為172.16.1.12和172.16.1.13/24。在R1上存在IP為1.1.1.1/24的環回口,在R2上存在IP為2.2.2.2/24的環回口,R3上存在IP為3.3.3.3的環回口。通過合理配置路由信息,讓三臺路由器可以正常通訊。在R1上可以通過Telnet對R3進行訪問,但是當R3返回給R1時,必然要經過R2,通過使用FPM技術,在R2上捕獲并丟棄這些返回的數據包。
這樣,當R1訪問R3的Telnet時,按照正常情況,R3會返回相應數據包后,在R1上才會顯示輸入賬戶名和密碼的提示信息,因為在R2上已捕獲并丟棄了這些數據包,在R1上自然無法顯示。這樣就可防止其他用戶通過R1對R3進行Telnet訪問,從而保護了R3安全。在具體實現時,三臺路由器需連接在某臺交換機上,R1連接到交換機Fas 0/3接口,R2分別連接到交換機的Fas 0/21和Fas 0/20接口,R3連接到交換機的Fas 0/4接口。在該交換機管理界面執行“conf t”命令進入全局配置模式,執行“vlan 10”、“name xn1”命令創建名為“xn1”的VLAN。執 行“vlan 20”、“name xn2”命令創建名為“xn2”的VLAN。
執 行“i n t r a n g f0/3,f0/20”、“switchport mode access vlan 10”、“spanningtree portfast”命令,將f0/3和f0/20加入VLAN10,并打開生成樹的Fastport接口。執行“int rang f0/4,f0/21”、“switchport mode access vlan 20”、“spanning-tree portfast”命令,將f0/4和f0/21加入到VLAN20 中。在R1上執行“conf t”命令,在全局配置模式中執行“in l0”、“ip add 1.1.1.1 255.255.255.0”、“inter f0/0”、“ip add 192.168.1.11 255.255.255.0”、“no shut”、“ip route 0.0.0.0 0.0.0.0 192.168.1.12”命令,設置R1的環回口以及F0/0接口的IP,閉關設置默認路由,下一條指向R2的F0/0接口。
在R2上執行“int l0”、“ip add 2.2.2.2 255.255.255.0”、“int f0/0”、“ip add 192.168.1.12 255.255.255.0”、“no shut” 命 令, 設置環回口IP和f0/0接口 IP。 執 行“int f0/1”、“ip add 192.168.1.12 255.255.255.0”、“no shut”、“ip route 1.1.1.1 2 5 5.2 5 5.2 5 5.0 192.168.1.11”、“ip route 3.3.3.3 255.255.255.0 172.16.1.13” 命 令, 設置f0/1接 口IP,并 設 置兩條靜態路由分別指向R1和R3。在R3上執行“in l0”、“ip add 3.3.3.3 255.255.255.0”、“int f0/0”、“ip add 23.1.1.1.3 255.255.255.0”、“no shut”、“ip route 0.0.0.0 0.0.0.0 172.16.1.12”命令,設置其環回口和f0/0接口的IP,并設置一條默認路由,將下一跳指向R2的f0/1接口。這樣,R1、R2和R3之間就可以正常通訊了。在R3上進入全局配置模式,執行“username user1 password 123456”命令,創 建 名 為“user1”,密碼為“123456”的賬戶。執行“line vty 0 4”、“login local”、“end”命 令,開 啟Telnet訪問功能。
在R2上 執 行“more system:fpm/?”命令可查看FPM目錄信息。執行“more system:fpm/phdf/?”命令顯示已集成的所有PHDF文件,如“ip.phdf”、“tcp.phdf”、“udp.phdf”等。執行“more system:fpm/phdf/ip.phdf”命令可查看“ip.phdf”內容,執行“conf t”命令,在全局配置模式下執行“load fpm”命令可加載所有PHDF文件。當然,可以根據需要加載所需的PHDF文件。可以執行“load protocol system:fpm/phdf/ip.phdf”命令,僅僅加載“ip.phdf”文件。
同理,可以加載所需的其他PHDF文件(例如“tcp.phdf”)。 當 R1 對 R3 進 行Telnet訪問時,在返回信息中會顯示“User Access Verification”字符串。如果在R2上過濾并丟棄包含該內容的數據包,那么R1就無法得到R3的響應,就會造成R1無法進行之后的認證操作,自然無法對R3進行Telnet訪問了。通過對Telnet連接的數據包進行分析,發現該字符串位于“Transmission Contro Protocol”字段后的4個字節的偏移量處。在R2上執行“class-map type stack match-all class1”命令創建名為“class1”的針對協議頭部的堆棧Class-Map,用來指定捕獲數據包的協議類型。
執 行“match field ip protocol eq 0x6 next tcp”命令,進一步匹配了IP協議下面的協議號6的TCP類型。 執 行“exit”、“classmap access-control matchall class”命令,創建名為“class2”的Access Control的Class-Map。執行“match start tcp payloadstart offset 4 size 100 string”、“User Access Verification”命令,從數據 包 中 的“transmission Control Protocol”字段的4個字節的偏移量處開始匹配,并且檢測其中的100個字節,如果其中包含“User Access Verification”字符串則匹配成功。執行“conf t”、“policy-map type access-control policy1”命令創建名為“policy1”的Policy-Map。 執 行“class class2”、“drop” 命 令,對Class2進行調用,并丟棄合乎上述條件的數據包。
執 行“exit”、“policymap type access-control policy2”、“class class1”、“service-policy policy1”、“end”命令創建名為“policy2”的Policy-Map, 并 調 用Class1將其和Policy1進行關聯。這樣對于Class1來說,匹配了一些協議,對于Class2來說則匹配了數據包中的一些字段。通過Policy1調用Class2中匹配的字段并將對應的數據包丟棄,通過Policy2調用Class1值,只要是匹配這些協議中的內容,全部都執行Policy1策略,實現層次化的關聯體系。因為對于R2來說,其接收R3返回給R1的數據包的接口是F0/1,所以需要將上述策略綁定到該接口。
執 行“conf t”、“int f0/1”、“service-policy type access-control input policy2”、“end” 命 令,將Policy2策略綁定到該接口上,對進入的指定流量進行控制。
這樣,當在R1上對R3進行Telnet訪問時,因為返回的數據包被R2丟棄,所以R1是無法對R3進行Telnet連接的。
從以上簡單的測試可以看出,FPM技術對于保護網絡連接的安全是很重要的,其可以針對數據流中的某些數據包進行深度檢測,將數據包中的某些字段匹配出來,并對其進行Drop之類的操作,將惡意數據包丟棄。
當然,使用FPM技術可以針對所有的來往程序產生的數據流進行控制。例如對于常用的聊天工具QQ來說,也可以使用FPM進行控制。
對于一般的內網來說,當客戶端運行QQ后,會先連接到路由器,之后連接到ISP服務器,然后連接到QQ服務器。當用戶進行登錄和聊天時,會通過這條鏈路和QQ服務器進行交互。
使用專用的抓包分析工具對其進行嗅探后,可以了解QQ數據包的內容。因為QQ是基于UDP協議運作的,所以在這些數據包中會顯示UDP信息。緊隨其后的信息輸入QQ獨有的內容,例如數據包頭、版本標識、命令、順序號、加密數據、數據包尾等內容。
例如在其中的“Command”字段中如果顯示186字樣,說明該數據包和登錄行為有關,例如請求登錄令牌等。在實際的網絡管理中,有時并不希望內網用戶隨意使用QQ進行聊天,那么只需要在路由器上使用FPM技術對包含該特征信息的數據包進行攔截。
這里就簡單介紹實現原理,仍然在上述R2路由器上進行操作,因為涉及到UDP協議,所以需要執行“conf t”、“load protocol system:fpm/phdf/udp.phdf” 命 令 加 載UDP的PHDF文 件。 執 行“classmap type stack matchall qqclass1”命令創建名為“class1”的針對協議頭部的堆棧Class-Map,用來指定捕獲的數據包的協議類型。
執 行“match field ip protocol eq 0x11 next udp”命令進一步匹配了udp協議下面的協議號11的數據 包 類 型。 執 行“exit”、“class-map access-control match-all qqclass2” 命令 創 建 名 為“class2”的Access Control的Class-Map。執行“match start udp payload-start offset 3 size 2 eq 0xBA命令在QQ數據包中的UDP協議字段之后偏移3個字節。
因為QQ數據包中的命令字段占用了2個字節,內容是十六進制的186(即0x00ba),所以尺寸需要精確設定,這就需要根據捕獲的QQ數據包的實際情況來決定。
執行“conf t”、“policymap type access-control qqpolicy1”命令,創建名為“qqpolicy1”的 Policy-Map。執 行“class qqclass2”、“drop”命令,對qqClass2進行調用,并丟棄合乎上述條件的數據包。執行“exit”、“policy-map type accesscontrol qqpolicy2”、“class qqclass1”、“servicepolicy qqpolicy1”、“end”命令,創建名為“qqpolicy2”的Policy-Map, 并 調 用qqclass1將其和qqpolicy1進行關聯。
之后,按照上述方法,將該策略綁定了特定的網絡接口上,讓其針對進入或者發出的數據包進行控制。
當然,這里僅僅列舉了簡單的例子來說明FPM控制方法,而對其他類登錄方式采用的方法是類似的,這里就不再贅述。