由於udp協議是非面向連線的,對udp埠的探測也就不可能像tcp埠的探測那樣依賴於連線建立過程(不能使用telnet這種tcp協議型別命令),這也使得udp埠掃瞄的可靠性不高。所以雖然udp協議較之tcp協議顯得簡單,但是對udp埠的掃瞄卻是相當困難的。下面具體介紹一下udp掃瞄方案:
方案1:利用icmp埠不可達報文進行掃瞄
本方案的原理是當乙個udp埠接收到乙個udp資料報時,如果它是關閉的,就會給源端發回乙個icmp埠不可達資料報;如果它是開放的,那麼就會忽略這個資料報,也就是將它丟棄而不返回任何的資訊。
優點:可以完成對udp埠的探測。
缺點:需要系統管理員的許可權。掃瞄結果的可靠性不高。因為當發出乙個udp資料報而沒有收到任何的應答時,有可能因為這個udp埠是開放的,也有可能是因為這個資料報在傳輸過程中丟失了。另外,掃瞄的速度很慢。原因是在rfc1812的中對icmp錯誤報文的生成速度做出了限制。例如linux就將icmp報文的生成速度限制為每4秒鐘80個,當超出這個限制的時候,還要暫停1/4秒。
方案2:udp recvfrom()和write()掃瞄
本方案實際上是對前乙個方案的一些改進,目的在於解決方案1中所需要的系統管理員的許可權問題。由於只有具備系統管理員的許可權才可以檢視icmp錯誤報文,那麼在不具備系統管理員許可權的時候可以通過使用recvfrom()和write()這兩個系統呼叫來間接獲得對方埠的狀態。對乙個關閉的埠第二次呼叫write()的時候通常會得到出錯資訊。而對乙個udp埠使用recvfrom呼叫的時候,如果系統沒有收到icmp的錯誤報文通常會返回乙個eagain錯誤,錯誤型別碼13,含義是「再試一次(try again)」;如果系統收到了icmp的錯誤報文則通常會返回乙個econnrefused錯誤,錯誤型別碼111,含義是「連線被拒絕(connect refused)」。通過這些區別,就可以判斷出對方的埠狀態如何。
優點:不需要系統管理員的許可權。
缺點:除去解決了許可權的問題外,其他問題依然存在。
如何對埠進行操作
首先檢視埠狀態,使用netstat命令 如果你的計算機有時候接收到的資料報導致出錯資料或故障,你不必感到奇怪,tcp ip可以容許這些型別的錯誤,並能夠自動重發資料報。但如果累計的出錯情況數目佔到所接收的ip資料報相當大的百分比,或者它的數目正迅速增加,那麼你就應該使用netstat查一查為什麼會出...
如何掃瞄埠
using system using system.drawing using system.collections using system.componentmodel using system.windows.forms using system.data using system.net.s...
利用Python進行埠掃瞄
在linux中判斷一台主機是否可達,可以使用ping命令,而判斷埠是否開啟,可以使用telnet命令,但是telnet命令沒有超時時間的引數,使用起來不是很方便,那麼可以利用python來完成乙個埠掃瞄的功能 usr bin env python import socket def get ip s...