python多線程端口掃描器。
輸出示例:

此端口掃描器的源碼,文檔及詳細調用方法見Github PythonPortScanner by Yaokai。
有時候,在進行網絡相關的研究的時候,我們需要執行一些有目的的參數測量。而端口掃描就是其中比較普遍也比較重要的一項。所謂的端口掃描,就是指通過TCP握手或者別的方式來判別一個給定主機上的某些端口是否處理開放,或者說監聽的狀態。現有的使用比較廣泛的端口掃描工具是nmap。毋庸置疑,nmap是一款非常強大且易于使用的軟件。但nmap是一款運行于terminal中的軟件,有時在別的代碼中調用并不是很方便,甚至沒有相應的庫。另外,nmap依賴的其他庫較多,在較老的系統中可能無法使用較新的nmap,這樣會造成掃描的不便。另外,nmap在掃描時需要root權限。基于這個原因,我用python2.7自帶的庫開發了一款高效的多線程端口掃描器來滿足使用需要。
I. 利用TCP握手連接掃描一個給定的(ip,port)地址對
為了實現端口掃描,我們首先明白如何使用python socket與給定的(ip, port)進行TCP握手。為了完成TCP握手,我們需要先初始化一個TCP socket。在python中新建一個TCP socket的代碼如下:
TCP_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #(1)TCP_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) #(2)TCP_sock.settimeout(delay) #(3)
其中(1)是初始化socket的代碼,socket.AF_INTE參數表示IPv4 socket,socket.SOCK_STREAM參數表示TCP socket。這樣我們就初始化了一個使用IPv4,TCP協議的socket。
(2)使用了socket.setsockopt()來設置socket的另一些參數。socket.SOL_SOCKET指定當前socket將使用setsockopt()中后面的參數。socket.SO_REUSEPORT表明當前socket使用了可復用端口的設置。socket.SO_REUSEPORT具體含義可以參考我的另一篇文章。
(3)將socket的連接超時時間設置為delay變量所對應的時間(以秒為單位)。這么做是為了防止我們在一個連接上等待太久。
了解了如何新建一個socket,我們就可以開始對給定的(ip,port)對進行TCP連接。代碼如下:
try: result = TCP_sock.connect_ex((ip, int(port_number))) # If the TCP handshake is successful, the port is OPEN. Otherwise it is CLOSE if result == 0: output[port_number] = 'OPEN' else: output[port_number] = 'CLOSE' TCP_sock.close()except socket.error as e: output[port_number] = 'CLOSE' pass
新聞熱點
疑難解答