1. 程式人生 > >linux下埠掃描的實現(TCP connect、TCP SYN、TCP FIN、UDP四種方式)

linux下埠掃描的實現(TCP connect、TCP SYN、TCP FIN、UDP四種方式)

一、TCP

常用的埠掃描方式有以下三種:

1.connect掃描

我們知道,常見的TCP的socket實現過程為

更本質的連線和結束的過程是如下這個樣子的:


從上面兩個圖我們可以看出來目標主機的一個埠如果是監聽狀態(LISTENING或者LINSTEN),那麼當我connect目標主機時就能成功,否則說明埠是關閉的。

優點: 程式設計簡單,是需要一個API connect(),比較可靠,因為TCP是可靠協議,當丟包的時候,會重傳SYN幀。

缺點: 正因為TCP的可靠性,所以當埠不存在的時候,源主機會不斷嘗試發SYN幀企圖得到ack的應答,多次嘗試後才會放棄,因此造成了掃描的時間較長。並且,connect的掃描方式可能較容易被目標主機發現。

2.SYN掃描

上面說到出去開放狀態的埠,是在等待其它主機發送SYN幀,所以SYN掃描的原理就是想目標埠傳送SUN資料幀,如果源主機收到SYN+ACK資料包,壽命此埠開放,如果收到RST說明此埠關閉。由於SYN掃描並不會完成TCP三次握手過程,所以又叫半開放掃描。

優點: 速度快;如果不被防火牆過濾的話,基本都能收到應答包。

缺點: 掃描行為容易被發現;因為是自己攢包發,是在ip層的,因此不可靠,可能會丟包;實現起來比connect稍複雜。

3.FIN掃描

根據上述四次揮手過程,主動結束的一方會發送FIN幀。當我們傳送FIN幀給一個非監聽的埠時,會有RST應答,反之,發給一個正在監聽的埠時,不會有任何迴應。

優點: 隱蔽性好;速度快。

缺點: 只能用於Linux系統,windows系統下無效,在windows下,無論埠是否監聽,都將回應RST幀,造成無法判斷;不可靠,當收不到應答包時,不確定是埠在監聽,還是丟包了。

二、UDP

 常見的方式有UDP recvfrom掃描,UDP ICMP埠不可達掃描,我採用的是後者,也就是,給一個埠傳送UDP報文,如果埠是開放的,則沒有響應,如果埠是關閉的,對方會回覆一個ICMP埠不可達報文(對應ICMP首部前兩個欄位:型別3 程式碼3,ICMP詳見ping那篇文章),

優點:linux windows都能用

缺點:也是不可靠的,因為返回的是錯誤資訊,所以速度相對於TCP的FIN,SYN掃描要慢一些,如果傳送的UDP包太快了,迴應的ICMP包會出現大量丟失的現象。

三、隨便玩玩

在開始程式設計前可以對埠的開放與否有個感性的認識。

檢視當前主機的開放埠可以使用netstat命令。

linux下檢視TCP的監聽埠:netstat -na -t TCP | grep LISTEN (測試環境 ubuntu 11.04)

windows下檢視TCP的監聽埠:netstat -na -p TCP | findstr LISTENING (測試環境 winXP)

linux下下掃描埠可以使用埠掃描工具nmap,有多種掃描方式,這裡列舉幾個常用的:

僅進行ping掃描,打印出對掃描做出響應的主機,不做進一步測試(如埠掃描或者作業系統探測):

nmap -sP 192.168.1.0/24

使用頻率最高的掃描選項:SYN掃描,又稱為半開放掃描,它不開啟一個完全的TCP連線,執行得很快:

nmap -sS 192.168.1.0/24

當SYN掃描不能用時,TCP Connect()掃描就是預設的TCP掃描:

nmap -sT 192.168.1.0/24