使用netstat檢測及監測網路連線

LinuxSQL發表於2014-09-12
作者: Linux中國 LinuxSQL

| 2014-09-12 14:24   收藏: 8    

大家好,我是邪惡君子!今天,邪惡就給大家分享一下,使用小小的一個netstat命令,就能讓你檢測出系統是否處於安全狀態!!!

這篇文件,複雜°:簡單;難易°:易。堅決讓小白都看得懂,學得會,掌握牢,上手快!好,廢話不多說,看招:

大家都知道,Linux上的web服務每天都要面臨成千上萬的連線,這些連線都是要遵循TCP協議的,這都是眾所周知的(至於TCP協議,這裡就不在過多的介紹,不懂的同學可以自己搜尋,友好多)。既然都是TCP協議連線,那就不得不面臨一個網路最大的安全問題,DOS攻擊及DDOS攻擊,這些攻擊是沒有辦法抹除的,因為這是針對TCP協議本身的一個設計缺陷兒造成的。所以,這就要求運維人員,時刻監測系統安全,是否處於被DOS攻擊狀態。

那麼是怎麼監測及檢測的呢?這就要用到我一開始就要提到的netstat命令。先簡單的介紹一下netstat命令的主要作用:可以檢視系統當前的連線狀態,不管是TCP連線還是udp協議連線,以及每個連線的程式號、是哪個應用程式、連線所用的埠號,這些都可以陳列出來。是不是很強大。

在講監測檢測之前,先給大家在普及一個知識,那就是TCP連線的狀態,TCP進行3次握手,其過程有很多狀態,不同的連線狀態,都有想對應的狀態碼,看下面列表:

  • LISTEN:偵聽來自遠方的TCP埠的連線請求
  • SYN-SENT:再傳送連線請求後等待匹配的連線請求
  • SYN-RECEIVED:再收到和傳送一個連線請求後等待對方對連線請求的確認
  • ESTABLISHED:代表一個開啟的連線
  • FIN-WAIT-1:等待遠端TCP連線中斷請求,或先前的連線中斷請求的確認
  • FIN-WAIT-2:從遠端TCP等待連線中斷請求
  • CLOSE-WAIT:等待從本地使用者發來的連線中斷請求
  • CLOSING:等待遠端TCP對連線中斷的確認
  • LAST-ACK:等待原來的發向遠端TCP的連線中斷請求的確認
  • TIME-WAIT:等待足夠的時間以確保遠端TCP接收到連線中斷請求的確認
  • CLOSED:沒有任何連線狀態

大家最好一定要記住這些狀態,因為運維人員在監控系統併發連線狀態時,監控系統返回的也是這些狀態碼!

瞭解完這些後,還要再瞭解一個Linux系統的指令碼中的一個小知識點,那就是“|”管道符,管道符的作用就不多說了,這裡就簡單提一下,因為下面的例子要用到。

好了,終於可以進入正題了,是不是都有點心急了呢 ?嘿嘿

以下這條命令將會顯示出netstat的幫助資訊,不懂的以及不太瞭解這個命令有哪些引數可用的都可以在這個命令的返回資訊中看到:

#netstat --help

顯示當前所有活動的網路連線:

#netstat -na

顯示出所有處於監聽狀態的應用程式及程式號和埠號:

#netstat -aultnp

如果想對一個單一的進行查詢,只需要在命令後面再加上“| grep $”。這裡就用到了管道符,以及grep篩選命令,$代表引數,也就是你要查詢的那個。

如要顯示所有80埠的網路連線:

#netstat -aultnp | grep 80

如果還想對返回的連線列表進行排序,這就要用到sort命令了,命令如下:

#netstat -aultnp | grep :80 | sort

當然,如果還想進行統計的話,就可以再往後面加wc命令。如:

#netstat -aultnp | grep :80 | wc -l

其實,要想監測出系統連線是否安全,要進行多狀態的查詢,以及要分析,總結,還有就是經驗。總的下來,才可以判斷出連線是否處於安全狀態。

下面就給大家再舉一些例子,讓大家徹底的明白,及徹底的理解這個命令的用處,使其發揮出最大功能。

#netstat -n -p|grep SYN_REC | wc -l

這個命令可以查詢出當前伺服器有多少個活動的 SYNC_REC 連線。正常來說這個值很小,最好小於5。 當有Dos攻擊或者郵件炸彈的時候,這個值相當的高。儘管如此,這個值和系統有很大關係,有的伺服器值就很高,也是正常現象。

#netstat -n -p | grep SYN_REC | sort -u

列出所有連線過的IP地址。

#netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'

列出所有傳送SYN_REC連線節點的IP地址。

#netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

使用netstat命令計算每個主機連線到本機的連線數。

#netstat -anp |grep 'tcp|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

列出所有連線到本機的UDP或者TCP連線的IP數量。

#netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr

檢查 ESTABLISHED 連線並且列出每個IP地址的連線數量。

#netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1

列出所有連線到本機80埠的IP地址和其連線數。80埠一般是用來處理HTTP網頁請求。

怎麼樣,是否能弄懂上面的這些命令及作用?在這兒呢,邪惡負責的說一句話:如果你能把上面的這些都徹底的理解消化了,能舉一反三了,那麼,恭喜您,您在Linux系統網路檢測這一小塊已經是一個高手了,不在是菜鳥或者小白了,為自己鼓鼓掌吧!!!

說明一點:命令及引數是死的,但是人是活的,要想發揮出其最大的功能,還需要自己去摸索,自己去理解及配合其他命令一起使用。同時,netstat -an在Windows上也管用哦!

那麼,如果真的發現有大量的假連線了,那麼也不要慌,要先找出一些“另類的IP地址”,怎麼解釋呢,因為在進行Dos攻擊時,會為造出大量的假IP去連線伺服器,進行3次握手,所以,這就要根據經驗去找出假IP,然後透過防火牆規則,新增一個規則拒接這個假IP的網段連線。

例如:

#iptables -A INPUT 1 -s $IPADRESS -j DROP/REJECT

注意,你需將$IPADRESS 替換成需要拒絕連線的IP地址。執行完iptables 後呢,要重啟一下web服務。

好了,今天的學習呢,到這兒就結束了,至於能掌握多少,這就要因人而異了,但我相信:天道酬勤!!!

最後,如果哪裡有不對的地方,希望大家多多交流!!!

使用netstat檢測及監測網路連線

相關文章