基于 Python 的高效 IP 开放端口扫描工具
以下是一个基于 Python 的高效 IP 开放端口扫描工具,结合 socket 库和多线程技术实现快速扫描,并支持自定义端口范围和并发线程数。代码包含详细注释和异常处理,适用于网络安全评估和渗透测试(需合法授权使用)。
1. 基础版:单线程端口扫描
使用 socket 库实现简单的 TCP 连接扫描:
import socket
def port_scan(target_ip, port):
"""扫描单个端口是否开放"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1) # 设置超时时间
result = sock.connect_ex((target_ip, port))
sock.close()
return result == 0 # 返回端口是否开放
except socket.error:
return False
if __name__ == "__main__":
target_ip = "127.0.0.1" # 替换为目标IP
for port in range(1, 1025): # 扫描1-1024端口
if port_scan(target_ip, port):
print(f"端口 {port} 开放")缺点:单线程速度慢,适合小范围端口扫描。
2. 高效版:多线程端口扫描
通过 threading 和 Queue 实现并发扫描,大幅提升速度:
import socket
import threading
from queue import Queue
def port_scan(target_ip, port):
"""扫描单个端口"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(1)
result = sock.connect_ex((target_ip, port))
sock.close()
return result == 0
except socket.error:
return False
def worker(target_ip, queue, open_ports):
"""工作线程函数"""
while True:
port = queue.get()
if port is None: # 结束信号
break
if port_scan(target_ip, port):
open_ports.append(port)
print(f"端口 {port} 开放")
queue.task_done()
def scan_ports(target_ip, start_port=1, end_port=1024, threads=50):
"""多线程扫描主函数"""
queue = Queue()
open_ports = []
# 创建工作线程
for _ in range(threads):
thread = threading.Thread(target=worker, args=(target_ip, queue, open_ports))
thread.daemon = True
thread.start()
# 将端口加入队列
for port in range(start_port, end_port + 1):
queue.put(port)
queue.join() # 等待所有任务完成
# 停止线程
for _ in range(threads):
queue.put(None)
print(f"扫描完成,开放端口:{sorted(open_ports)}")
if __name__ == "__main__":
scan_ports("127.0.0.1", 1, 1024, 100) # 目标IP, 起始端口, 结束端口, 线程数优化点:
线程池管理,避免资源耗尽。
队列任务分配,均衡负载。
3. 高级版:使用Scapy实现SYN半开放扫描
通过 scapy 发送 SYN 包,更隐蔽且高效(需 root 权限):
from scapy.all import *
import ipaddress
def syn_scan(target_ip, ports):
"""SYN半开放扫描"""
open_ports = []
for port in ports:
packet = IP(dst=target_ip)/TCP(dport=port, flags="S")
response = sr1(packet, timeout=1, verbose=0)
if response and TCP in response:
if response[TCP].flags == 0x12: # SYN-ACK响应
send(IP(dst=target_ip)/TCP(dport=port, flags="R"), verbose=0) # 发送RST复位连接
open_ports.append(port)
return open_ports
if __name__ == "__main__":
target_ip = "192.168.1.1"
ports = [22, 80, 443, 8080] # 指定端口列表
open_ports = syn_scan(target_ip, ports)
print(f"开放端口:{open_ports}")优势:
不建立完整连接,降低日志记录风险。
支持自定义扫描策略(如 Xmas 扫描)。
4. 终极版:集成Nmap库(功能最全)
利用 python-nmap 调用 Nmap 的完整功能:
import nmap
def nmap_scan(target_ip, ports="1-1024"):
"""调用Nmap扫描"""
scanner = nmap.PortScanner()
scanner.scan(target_ip, ports)
for host in scanner.all_hosts():
print(f"主机: {host} 状态: {scanner[host].state()}")
for proto in scanner[host].all_protocols():
print(f"协议: {proto}")
ports = scanner[host][proto].keys()
for port in ports:
print(f"端口: {port} 状态: {scanner[host][proto][port]['state']}")
if __name__ == "__main__":
nmap_scan("127.0.0.1", "22,80,443") # 支持端口范围或列表功能扩展:
服务版本探测(
-sV)。操作系统识别(
-O)。
5. 注意事项
合法性:仅扫描授权目标,避免法律风险。
性能调优:
调整超时时间(如
socket.settimeout(0.5))。限制线程数(避免被防火墙拦截)。
结果保存:可将结果写入文件(参考)。
总结
根据需求选择方案,如需进一步扩展可参考:
异步扫描(
asyncio)。分布式扫描(结合消息队列)。
基于 Python 的高效 IP 开放端口扫描工具
https://uniomo.com/archives/ji-yu-python-de-gao-xiao-ip-kai-fang-duan-kou-sao-miao-gong-ju