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

參考:http://blog.163.com/lixiangdong2510@126/blog/static/3499482120106128430429/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章