基于 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. 高效版:多线程端口扫描

通过 threadingQueue 实现并发扫描,大幅提升速度:

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. 注意事项

  1. 合法性:仅扫描授权目标,避免法律风险。

  2. 性能调优

    • 调整超时时间(如 socket.settimeout(0.5))。

    • 限制线程数(避免被防火墙拦截)。

  3. 结果保存:可将结果写入文件(参考)。


总结

方案

适用场景

优点

缺点

单线程扫描

小范围快速测试

代码简单

速度慢

多线程扫描

中大型端口范围

速度快,资源可控

需管理线程池

Scapy SYN 扫描

隐蔽性要求高

不易被日志记录

需 root 权限

Nmap 集成

全功能扫描

支持高级探测(OS、服务版本)

依赖外部工具

根据需求选择方案,如需进一步扩展可参考:

  • 异步扫描(asyncio)。

  • 分布式扫描(结合消息队列)。


基于 Python 的高效 IP 开放端口扫描工具
https://uniomo.com/archives/ji-yu-python-de-gao-xiao-ip-kai-fang-duan-kou-sao-miao-gong-ju
作者
雨落秋垣
发布于
2025年09月07日
许可协议