原文地址:http://www.excelib.com/article/293/show
提到ICMP大家應該都很熟悉,可能有人會說:不就是ping嗎?但是說到ICMP攻擊以及相關防御措施可能就有的人不是非常清楚了。
ICMP的概念
要 想理解ICMP攻擊以及防范我們還得從ICMP的概念說起,ICMP是“Internet Control Message Protocol”的縮寫,意思是“Internet控制消息協議”,他主要用於在不同主機、路由器等設備之間傳遞控制消息,比如網絡是否可以聯通、路由 設備地址的發現、路由路徑是否合理等內容。
ICMP攻擊
ICMP協議被攻擊的方法有很多種,比如的“Ping of Death”、使用ICMP數據包發起DDOS攻擊、redirect攻擊等等,下面學生簡單給大家介紹一下。
“Ping of Death”的原理是當發送的數據包大小超過64KB(規定最大64KB)后接收信息的主機就會出現內存分配錯誤,進一步會導致TCP/IP堆棧崩潰,甚至主機死機!不過這一漏洞在新版的操作系統中已經解決了。
ICMP 的DDOS簡單來說就是一直不停地發送ICMP數據包從而占滿被攻擊主機的帶寬,當然,更進一步還可以使用一些手段將流量進行放大,比如將源地址設置為被 攻擊主機的“echo-request”類型報文廣播給很多第三方主機,這時這些接收到報文的主機就會給被攻擊目標主機返回“echo-replay”報 文,這樣流量就被放大了。
要理解redirect攻擊,首先要明白redirect的作用,學生給大家舉個例子大家就明白了,比如有個快遞 需要從北京發往廣州,結果北京發到沈陽的中轉站了,這時候沈陽就覺得不對呀,要往廣州發應該往南邊發才對怎么能往北邊發呢?所以沈陽站就會跟北京站聯系, 告訴他:你發的不對,你應該往南邊的XXX站發送才對。ICMP中的redirect就是起這個作用的,當路由設備發現某個數據包經過自己不是最優路徑時 就會給源地址發一個redirect數據包,告訴對方發的路徑不合適,並且指出應該發往的地址。這個功能是很有用的,不過如果被攻擊者使用情況就完全不一 樣了,他們可以使用這一功能將正常(合理)的路由地址給修改為一個不合理的甚至不存在的地址,這樣就會給通訊造成問題,另外,有一些還會將目標地址設置為 他們自己可以控制的主機的地址,這樣就可以截獲數據了!跟redirect相關的還有router-advertisement、router- solicitation等類型的ICMP數據包。
當然,除了這三種還有很多攻擊的類型,比如我們下面會說到的destination-unreachable、source-quench、time-exceeded等類型的攻擊。
可能看到這里有的讀者就覺得不容易理解了:echo-request、redirect、destination-unreachable等等到底是什么東西呢?其實這都是ICMP的類型,下面學生就來給大家介紹ICMP的類型。
ICMP的類型
ICMP 數據包主要包含三部分內容:類型、代碼和附加數據,其中的類型和代碼屬於包頭,代碼(code)相當於類型(type)下的細分子類型,我們也可以理解為 他們共同來決定一個ICMP包的類型,比如學生上面給大家講的redirect的type為5,不過5這個type下面還有4個code——0,、1、 2、3,他們所表示的含義如下表所示
表1:ICMP包Redirect類型表
type
code
描述
5 0 Redirect for network——對網絡重定向
5 1 Redirect for host——對主機重定向
5 2 Redirect for TOS and network——對服務類型和網絡重定向
5 3 Redirect for TOS and host——對服務類型和主機重定向
具體更多的代碼學生就不在這里羅列了,大家很容易就可以找到。在ICMP數據包中type和code就像excel中的兩個單元格,只要將相應的數據填入,主機就可以知道這個ICMP包的類型了。
這里的type和code我們當然是不需要記的,在使用的時候只需要用名字就可以了,比如type為8的數據包我們直接寫Echo request、type為0的數據包我們直接寫Echo Reply就行了,下面學生簡單地給大家介紹幾個常見的類型
-
Echo request:需要回應的請求,也就是我們常說的ping請求
-
Echo Reply:對ping的回應報文(pong)
-
Destination Unreachable:目標不可達
-
Source Quench:源地址資源緊張,正常情況下當我們要發送數據的路由設備請求過多時就會發出這種ICMP包
-
Time Exceeded:超時,比如TTL用完后就會產生這種類型的數據包
Firewalld針對ICMP攻擊的防御方法
firewalld中有專門針對icmp報文的配置方法,而且使用起來也非常簡單,我們只需要將firewalld所支持的icmp類型配置到所使用的zone中就可以了,要查看firewalld所支持的icmp類型可以使用下面的命令
1 firewall-cmd [--permanent] --get-icmptypes
默認的返回結果如下
1 destination-unreachable echo-reply echo-request parameter-problem redirect 2 router-advertisement router-solicitation source-quench time-exceeded
這里的類型前面學生基本都給大家介紹過了,下面來學生來給大家講怎么使用。跟icmptype相關的命令主要有四個
1 firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks 2 firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=<icmptype> 3 firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=<icmptype> 4 firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=<icmptype>
他們分別用於列出zone中所阻止的所有icmp類型、添加、刪除和查詢某個具體的icmp類型,如果指定zone則對具體zone進行操作,否則對當前活動的zone進行操作。
icmp配置文件的結構也非常簡單,除了short和description外只有一個destination節點,可以設置對ipv4和ipv6的支持與否。
補充與建議
對於firewalld中的icmp設置大家要特別注意下面三點
1、firewalld只可以阻止指定類型的icmp包,沒有其他更多的配置選項
2、如果使用drop、reject這些zone的話,默認所有icmp類型都會阻塞
3、默認情況下firewalld中所配置的icmp類型主要是針對入包的,而對於主機發出的包是不會攔截的。另外,在前面學生跟大家說過firewalld是一款有狀態的防火牆,也就是說不同連接之間的關系firewalld在內部是有記錄的,所以即使我們將echo-reply設置到zone中之后再去使用本機ping其他主機也是可以收到回復的,這是因為firewalld底層可以識別出那個echo-reply是我們發生去請求的回應。
對於具體哪個類型應該阻止,哪個應該放行大家需要根據自己的實際情況來設定,學生下面給大家提供一些思考的方向和建議。
-
destination-unreachable:當收到這種類型數據包之后相應地址的連接將會被斷開,如果是攻擊者偽造的數據包,那么會將我們的很多正常連接斷開。當將其設置到zone中后我們本機發送的請求還是可以收到destination-unreachable類型回復的,只是直接發給我們的destination-unreachable數據包進不來了,所以建議大家可以阻止。
-
echo-request:主要用於接收ping請求,阻塞之后我們的主機將不可被ping,不過打開后又有可能被攻擊,有種慣用的做法是設置開通的頻率,比如1秒鍾只可以被ping一次,不過這種功能直接使用學生上面給大家介紹的方法是無法設置的,不過沒關系,當學習了學生下一節將要給大家介紹的firewalld中的direct之后就可以設置了。
-
echo-reply:這是回應ping信息的包,一般來說我們應該將其阻止,因為他跟destination-unreachable一樣,如果是我們本機發出的即使設置了阻止也還是可以接收到的。
-
parameter-problem:當接收到的報文參數錯誤,無法解析時會返回這種類型的報文。
-
redirect:這種報文學生在前面已經給大家詳細介紹過,這里就不再重述了。
-
router-advertisement和router-solicitation:這是一對報文,他們的作用是用來發現路由設備的地址,主機發出router-solicitation類型數據包來查找路由設備,路由設備可以發出router-advertisement類型ICMP數據包來告訴主機自己是路由設備
-
source-quench:這個學生也給大家介紹過了,當源地址設備(比如路由設備)資源緊張時就會發出這種數據包
-
time-exceeded:數據包超時。
最后還是那句話,沒有最優配置方法(否則就不需要配置了),大家需要根據自己的實際情況進行配置。