一、引言
在网络安全领域,端口扫描是信息收集阶段的重要手段。通过检测目标主机开放的端口,可以推断其运行的服务类型,为后续安全评估提供依据。本文ZHANID工具网将演示如何使用Python开发一个高效的多线程端口扫描工具,通过代码解析和性能优化,帮助读者理解网络编程与多线程技术的实际应用。
二、工具原理
1. TCP连接扫描原理
端口扫描的核心是尝试与目标主机的指定端口建立TCP连接。根据TCP三次握手原理:
当客户端向目标端口发送
SYN包时:收到
SYN-ACK响应:端口开放收到
RST响应:端口关闭无响应:端口被过滤或主机不在线
2. Python多线程实现
通过threading模块创建多个工作线程,实现并发扫描。每个线程负责检测指定端口,通过线程池控制最大并发数,避免资源耗尽。

三、代码实现
1. 环境准备
pip install python-nmap # 可选:用于服务识别(需安装nmap)
2. 完整代码
import socket
import threading
from queue import Queue
import argparse
from datetime import datetime
class PortScanner:
def __init__(self, target, ports, threads=100, timeout=1):
self.target = target
self.ports = ports
self.threads = threads
self.timeout = timeout
self.open_ports = []
self.lock = threading.Lock()
self.port_queue = Queue()
# 初始化端口队列
for port in ports:
self.port_queue.put(port)
def port_scan(self, port):
"""扫描单个端口"""
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.settimeout(self.timeout)
result = s.connect_ex((self.target, port))
if result == 0:
with self.lock:
self.open_ports.append(port)
print(f"[+] {port}/tcp open")
except Exception as e:
pass
def worker(self):
"""工作线程"""
while not self.port_queue.empty():
port = self.port_queue.get()
self.port_scan(port)
self.port_queue.task_done()
def run(self):
"""启动扫描"""
print(f"[*] Scanning {self.target} (Ports: {self.ports})...")
start_time = datetime.now()
# 创建线程池
threads = []
for _ in range(self.threads):
t = threading.Thread(target=self.worker)
t.start()
threads.append(t)
# 等待所有任务完成
self.port_queue.join()
# 等待线程结束
for t in threads:
t.join()
# 排序输出
self.open_ports.sort()
print(f"\n[*] Scan completed in {datetime.now() - start_time}")
print(f"[*] Open ports: {', '.join(map(str, self.open_ports))}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Multi-threaded Port Scanner")
parser.add_argument("target", help="Target IP or hostname")
parser.add_argument("-p", "--ports", default="1-1024",
help="Port range (e.g. 1-1024,80,443)")
parser.add_argument("-t", "--threads", type=int, default=100,
help="Number of threads (default: 100)")
args = parser.parse_args()
# 解析端口范围
ports = []
for port_range in args.ports.split(','):
if '-' in port_range:
start, end = map(int, port_range.split('-'))
ports.extend(range(start, end+1))
else:
ports.append(int(port_range))
ports = list(set(ports)) # 去重
# 启动扫描
scanner = PortScanner(
target=args.target,
ports=ports,
threads=args.threads
)
scanner.run()四、代码解析
1. 核心组件
端口队列:使用
Queue管理待扫描端口,实现线程安全的任务分发线程锁:通过
threading.Lock保证对开放端口列表的原子操作超时控制:
socket.settimeout()防止因无响应端口导致线程阻塞
2. 性能优化
连接复用:使用
with语句自动管理socket连接批量扫描:将端口范围解析为列表后去重,避免重复扫描
动态线程数:根据网络环境调整
--threads参数(建议50-500之间)
五、使用示例
1. 基础扫描
python scanner.py 192.168.1.1 -p 21-25,80,443
2. 全端口快速扫描
python scanner.py example.com -p 1-65535 -t 500
3. 输出说明
[+] 80/tcp open [+] 443/tcp open [*] Scan completed in 0:00:05.123456 [*] Open ports: 80, 443
六、高级功能扩展
1. 服务识别(需nmap)
import nmap
def service_detection(target, ports):
nm = nmap.PortScanner()
nm.scan(target, arguments=f'-p {",".join(map(str, ports))} -sV')
for port in ports:
if nm[target].has_tcp(port):
proto = nm[target][port]['name']
version = nm[target][port]['version']
print(f"[{port}] {proto} {version}")2. 隐蔽扫描模式
修改socket参数实现:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.connect_ex((target, port)) # 使用半开放扫描(需root权限)
七、法律与道德声明
仅限授权测试,禁止用于非法入侵
扫描前应获得目标系统所有者的书面许可
遵守当地法律法规(《网络安全法》等)
八、性能对比
| 线程数 | 扫描时间(1-1024端口) | CPU占用 |
|---|---|---|
| 50 | 12.4s | 30% |
| 100 | 8.1s | 50% |
| 200 | 5.8s | 75% |
| 500 | 3.2s | 95% |
测试环境:Intel i7-11800H @ 2.3GHz
九、总结
本文通过Python实现了一个高效的多线程端口扫描工具,核心要点包括:
使用TCP连接扫描原理检测开放端口
通过线程池实现并发扫描,提升扫描效率
提供灵活的参数配置和扩展接口
该工具可作为安全测试的基础组件,后续可扩展以下功能:
添加UDP扫描支持
集成漏洞检测模块
生成HTML格式扫描报告
请务必在合法授权的前提下使用本工具,网络安全技术应服务于防御而非攻击。
本文由@战地网 原创发布。
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/4353.html




















