本项目采用Python语言实现一个多线程Socket端口扫描工具,能够高效地检测目标主机开放的服务端口,为网络安全评估提供有力支持。
在Python中结合使用多线程与Socket库可以实现高效的端口扫描功能。这种工具对于网络安全及系统管理员来说非常有用,能够帮助检测远程或本地主机开放的网络端口,并了解服务状态。
首先来看如何利用Python创建简单的Socket连接:
```python
import socket
def check_port(ip, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) # 设置超时时间,避免阻塞
result = sock.connect_ex((ip, port))
sock.close()
return result == 0 # 返回0表示连接成功,即端口开放
# 示例:检查某个IP地址的80端口是否开放
ip = 192.168.1.1
port = 80
if check_port(ip, port):
print(fPort {port} is open on {ip})
else:
print(fPort {port} is closed or unreachable on {ip})
```
接下来,我们将使用多线程来并行扫描多个端口以提高效率。`threading`模块提供了创建和管理线程的功能。
```python
import threading
import queue
class ScannerPort(threading.Thread):
def __init__(self, ip, port_queue, timeout):
threading.Thread.__init__(self)
self.ip = ip
self.port_queue = port_queue
self.timeout = timeout
def run(self):
while True:
if self.port_queue.empty():
break
port = self.port_queue.get()
result = check_port(self.ip, port)
if result:
print(fPort {port} is open on {self.ip})
# 创建线程池以进行端口扫描
def scan_ports(ip, port_list, thread_num):
port_queue = queue.Queue()
for port in port_list:
port_queue.put(port)
threads = [ScannerPort(ip, port_queue, 2) for _ in range(thread_num)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
# 示例:扫描指定IP的常用端口
ip = 192.168.1.1
common_ports = [21, 22, 25, 80, 443]
scan_ports(ip, common_ports, 5)
```
上述代码中,我们使用了`queue.Queue()`来安全地管理和分发待扫描的端口给各个线程。每个`ScannerPort`对象在启动时从队列中获取一个任务并执行。
为了进一步优化效率,可以定义一些常用的网络服务端口号集合进行批量扫描:
```python
def main(ip, port_list, thread_num):
start_time = time.time()
scan_ports(ip, port_list, thread_num)
print(f耗时:{time.time() - start_time} s)
# 示例:使用10个线程来同时测试指定IP的前100个常用端口
ip = 192.168.1.1
top_100_ports = [21, 22, 25, 80, 443] # 只显示部分端口号,实际应用中可以定义更多常用的端口列表。
main(ip, top_100_ports, 10)
```
通过这种方式能够快速有效地扫描大量端口,并且为网络安全分析提供有价值的参考信息。需要注意的是,在进行大规模或频繁的网络服务探测时,请确保遵守相关的法律法规和道德规范,避免被视为恶意行为。