尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python 实现简易端口扫描器,手把手代码讲解

Python 实现简易端口扫描器,手把手代码讲解 Python 实现简易端口扫描器手把手代码讲解前言在网络安全、渗透测试、内网资产梳理、安全运维工作中端口扫描是最基础、最核心的前置操作。无论是红蓝对抗内网打点、企业资产巡检、漏洞前期信息收集还是个人学习网络编程端口扫描都是必须掌握的核心技能。日常工作中绝大多数安全从业者都会使用 Nmap、Masscan、Zmap 等成熟开源扫描工具这些工具性能极强、功能全面、支持多种扫描模式、服务版本探测、操作系统识别、漏洞探测。但只会使用工具、不懂底层原理是很多安全初学者的通病遇到扫描误报、防火墙拦截、环境适配问题、自定义扫描需求时完全无从下手。Python 作为网络安全领域的首选编程语言依托内置的socket网络套接字库、threading多线程库可以从零手写一款属于自己的 TCP 端口扫描器。手写扫描器的核心价值不在于替代 Nmap而是彻底搞懂端口扫描底层逻辑、TCP 连接原理、并发扫描机制、网络超时适配。本文将从网络基础原理、端口扫描分类、单线程零基础实现、多线程高性能优化、命令行参数封装、服务识别、性能调优、报错修复、实战避坑、源码拓展、面试考点全方位讲解手把手带你从零编写、逐行解析、落地实战适合零基础入门、安全面试复习、Python 网络编程学习。⚠️法律免责声明本文所有代码、技术原理、扫描方法仅可用于个人靶场学习、授权企业资产巡检、合规安全测试。严禁未经授权扫描公网服务器、内网业务资产、第三方设备。未经授权的网络扫描、探测行为违反《中华人民共和国网络安全法》一切违规操作的法律责任由使用者自行承担。一、前置基础彻底搞懂端口与端口扫描原理1.1 什么是端口计算机主机依靠IP 地址定位网络中的唯一设备依靠端口Port定位设备内的具体服务进程。一台主机拥有 65535 个可用 TCP 端口1~65535不同端口对应不同服务21 端口FTP 文件传输服务22 端口SSH 远程连接服务Linux 服务器核心端口80 端口HTTP 明文 Web 服务443 端口HTTPS 加密 Web 服务3389 端口Windows RDP 远程桌面3306 端口MySQL 数据库服务6379 端口Redis 缓存服务8080 端口代理 / 后端 Web 服务端口状态分为三种开放Open端口监听正常可建立 TCP 连接对外提供服务关闭Closed无进程监听该端口无法建立连接过滤Filtered被防火墙、安全组拦截无法判断端口真实状态常见于公网服务器。1.2 常见端口扫描方式对比主流端口扫描分为三类本文实现最通用、最适合新手的TCP 全连接扫描1TCP 全连接扫描本文实现原理完整完成TCP 三次握手成功握手则判定端口开放。优点代码简单、无需管理员权限、兼容性极强、无系统限制缺点会产生完整访问日志极易被防火墙、EDR、WAF 检测拦截隐蔽性差适用场景内网靶场学习、授权资产巡检、原理学习。2SYN 半连接扫描Nmap 默认扫描原理只发送 SYN 握手包不完成三次握手不建立完整连接。优点隐蔽性高、无日志残留、扫描速度快缺点需要系统管理员权限、依赖底层网卡驱动普通 Python 脚本无法实现。3UDP 扫描针对 UDP 无连接协议扫描多用于探测 DNS、SNMP 服务日常渗透使用较少。1.3 Python 核心依赖库讲解本文所有代码无需第三方安装全部使用 Python 内置标准库兼容性拉满socket核心网络库实现 TCP/UDP 套接字创建、连接请求、网络通信threading多线程库解决单线程扫描速度慢的问题time计时、延时控制统计扫描耗时、控制线程并发argparse命令行参数解析实现工具化调用无需修改源码。二、入门版单线程端口扫描器零基础必学2.1 完整源码这是最基础的版本无复杂逻辑、无并发、纯原生 TCP 连接探测适合新手理解核心原理。# 单线程简易端口扫描器入门版 import socket # 定义单端口扫描函数 def scan_single_port(target_ip, port): # 创建IPv4、TCP流式套接字 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置连接超时时间避免程序卡死 sock.settimeout(0.5) try: # 尝试建立TCP连接返回状态码 connect_status sock.connect_ex((target_ip, port)) # connect_status 0 代表连接成功端口开放 if connect_status 0: print(f[✅ 开放] 目标IP:{target_ip} 端口:{port}) except Exception as e: # 捕获异常静默处理超时、拒绝连接等错误 pass finally: # 强制关闭套接字释放系统资源 sock.close() # 主程序入口 if __name__ __main__: # 自定义扫描目标与端口范围 target 192.168.1.100 start_port 1 end_port 100 print( 单线程端口扫描开始 ) # 遍历端口逐个扫描 for port in range(start_port, end_port 1): scan_single_port(target, port) print( 端口扫描完成 )2.2 逐行超详细代码解析socket.AF_INET指定使用 IPv4 网络协议是目前主流网络协议socket.SOCK_STREAM指定使用 TCP 流式传输协议稳定可靠、面向连接sock.settimeout(0.5)核心配置设置 0.5 秒超时。网络扫描存在延迟若不设置超时程序会无限卡死等待connect_ex()核心函数区别于connect()函数不会抛出异常仅返回数字状态码返回 0TCP 连接成功端口开放返回非 0端口关闭 / 防火墙拦截 / 连接超时finally 关闭套接字网络套接字属于系统资源不主动关闭会造成资源泄露大量扫描后程序卡顿崩溃。2.3 单线程版本优缺点✅ 优点代码极简、逻辑清晰、零报错、新手友好、极易理解 TCP 扫描原理❌ 缺点串行扫描、速度极慢1-1000 端口需要数分钟无法用于实际批量扫描。三、进阶版多线程高性能端口扫描器实用主力版为了解决单线程扫描速度慢的问题我们引入多线程并发扫描同时新增服务识别、线程限流、扫描计时、结果汇总、线程锁等核心功能也是日常学习、靶场实战的主力版本。3.1 完整优化源码# 多线程高性能端口扫描器进阶完整版 import socket import threading import time # 全局存储开放端口与对应服务 open_port_list [] # 线程锁解决多线程数据竞争问题 thread_lock threading.Lock() # 常用端口-服务映射库可自行无限拓展 PORT_SERVICE_MAP { 21: FTP文件传输服务, 22: SSH远程连接服务, 23: Telnet远程登录服务, 25: SMTP邮件发送服务, 53: DNS域名解析服务, 80: HTTP网页服务, 110: POP3邮件接收服务, 135: RPC远程过程调用服务, 139: NetBIOS局域网共享服务, 443: HTTPS加密网页服务, 445: SMB文件共享服务(高危), 3306: MySQL数据库服务, 3389: RDP远程桌面服务(高危), 6379: Redis缓存数据库服务, 8080: HTTP代理/后端服务, 8090: 后台管理服务, 9000: 端口转发/应用服务 } def port_scan_func(target_ip, port): 单端口扫描核心函数 sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.4) try: # 尝试TCP连接 res sock.connect_ex((target_ip, port)) if res 0: # 匹配端口对应的服务未知服务显示Unknown service_name PORT_SERVICE_MAP.get(port, 未知自定义服务) # 加锁保证多线程写入数据不混乱 with thread_lock: open_port_list.append({port: port, service: service_name}) print(f[] 端口开放 | {port} | 服务{service_name}) except: pass finally: sock.close() def multi_thread_scan(target_ip, start, end, max_thread60): 多线程扫描主函数 print( * 60) print(f【扫描配置信息】) print(f扫描目标IP{target_ip}) print(f扫描端口范围{start} ~ {end}) print(f最大并发线程{max_thread}) print( * 60) # 记录扫描开始时间 start_time time.time() thread_pool [] # 遍历所有端口创建扫描线程 for port in range(start, end 1): thread threading.Thread(targetport_scan_func, args(target_ip, port)) thread_pool.append(thread) thread.start() # 线程限流防止并发过高导致本机网络卡死、丢包误报 while len(threading.enumerate()) max_thread: time.sleep(0.01) # 阻塞主线程等待所有子线程执行完毕 for t in thread_pool: t.join() # 计算扫描总耗时 end_time time.time() total_time round(end_time - start_time, 2) # 扫描结果汇总输出 print(\n * 60) print(f扫描完成总耗时{total_time} 秒) if open_port_list: print(f共探测到 {len(open_port_list)} 个开放端口) for info in open_port_list: print(f✅ {info[port]} 端口 - {info[service]}) else: print(❌ 未探测到任何开放端口) print( * 60) if __name__ __main__: # 自定义扫描参数 scan_ip 192.168.1.100 multi_thread_scan(target_ipscan_ip, start1, end1000, max_thread60)3.2 核心新增功能深度解析1线程锁thread_lock多线程同时操作全局列表时会出现数据竞争、数据丢失、列表错乱的问题。threading.Lock()可以保证同一时间只有一个线程写入数据完美解决并发数据错乱问题是多线程开发的核心知识点。2线程限流机制如果无限制创建线程一次性生成 1000 线程会耗尽本机网络资源、CPU 资源导致端口误判、程序崩溃、网络卡顿。通过len(threading.enumerate())实时监控运行线程数严格限制最大并发兼顾扫描速度与稳定性。3服务自动识别内置常用端口服务映射表扫描到开放端口自动匹配服务名称不用手动查表实现可视化资产识别。4精准计时 结果汇总自动统计扫描总耗时扫描结束后统一汇总所有开放端口避免日志杂乱结果清晰直观。四、终极工具版命令行参数端口扫描器可直接当工具用前面的版本需要修改源码更换 IP、端口、线程数不够便捷。我们基于argparse实现命令行参数调用无需改代码终端直接传参完全对标商业化扫描工具。4.1 最终完整源码# Python 命令行端口扫描器终极工具版 import socket import threading import time import argparse # 全局变量与线程锁 open_port_list [] thread_lock threading.Lock() # 端口服务映射字典 PORT_SERVICE_MAP { 21: FTP文件传输服务, 22: SSH远程连接服务, 23: Telnet远程登录服务, 25: SMTP邮件发送服务, 53: DNS域名解析服务, 80: HTTP网页服务, 110: POP3邮件接收服务, 135: RPC远程过程调用服务, 139: NetBIOS局域网共享服务, 443: HTTPS加密网页服务, 445: SMB文件共享服务(高危), 3306: MySQL数据库服务, 3389: RDP远程桌面服务(高危), 6379: Redis缓存数据库服务, 8080: HTTP代理/后端服务, 8090: 后台管理服务, 9000: 端口转发/应用服务 } def port_scan_func(target_ip, port): sock socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(0.4) try: res sock.connect_ex((target_ip, port)) if res 0: service_name PORT_SERVICE_MAP.get(port, 未知自定义服务) with thread_lock: open_port_list.append({port: port, service: service_name}) print(f[] 端口开放 | {port:5d} | 服务{service_name}) except: pass finally: sock.close() def multi_thread_scan(target_ip, start_port, end_port, max_thread): print( * 60) print(f【Python高性能端口扫描器】) print(f扫描目标IP{target_ip}) print(f扫描端口范围{start_port} ~ {end_port}) print(f最大并发线程{max_thread}) print( * 60) start_time time.time() thread_pool [] for port in range(start_port, end_port 1): t threading.Thread(targetport_scan_func, args(target_ip, port)) thread_pool.append(t) t.start() while len(threading.enumerate()) max_thread: time.sleep(0.01) for t in thread_pool: t.join() end_time time.time() total_time round(end_time - start_time, 2) print(\n * 60) print(f扫描完成总耗时{total_time} 秒) if open_port_list: print(f共探测到 {len(open_port_list)} 个开放端口) for info in open_port_list: print(f✅ {info[port]} 端口 - {info[service]}) else: print(❌ 未探测到任何开放端口) print( * 60) if __name__ __main__: # 初始化命令行参数解析器 parser argparse.ArgumentParser(descriptionPython 多线程TCP端口扫描工具 | 内网资产探测专用) parser.add_argument(-i, --ip, requiredTrue, help必填目标IP地址例192.168.1.100) parser.add_argument(-s, --start, typeint, default1, help可选起始端口默认1) parser.add_argument(-e, --end, typeint, default1000, help可选结束端口默认1000) parser.add_argument(-t, --thread, typeint, default60, help可选最大并发线程默认60) # 解析参数 args parser.parse_args() # 执行扫描 multi_thread_scan(args.ip, args.start, args.end, args.thread)4.2 工具使用教程将代码保存为port_scan.py打开终端 / CMD即可灵活调用# 基础用法扫描1-1000端口默认60线程 python port_scan.py -i 192.168.1.100 # 自定义端口范围扫描1-500端口 python port_scan.py -i 192.168.1.100 -s 1 -e 500 # 自定义线程数100线程高速扫描 python port_scan.py -i 192.168.1.100 -t 100 # 全端口扫描1-65535 python port_scan.py -i 192.168.1.100 -s 1 -e 65535五、关键参数调优与实战避坑指南5.1 超时时间调优核心避坑内网扫描延迟低设置0.3~0.4s速度最快、准确率最高跨网段 / 公网扫描延迟高设置0.8~1s避免误判关闭超时过小漏报开放端口判定为关闭超时过大扫描速度变慢。5.2 线程数调优家用电脑 / 虚拟机50-80 线程最佳不卡顿、无丢包高配服务器可设置 100-150 线程禁止 200 线程以上极易触发系统网络限制、防火墙拦截导致扫描失效。5.3 常见报错与解决方案端口扫描全部无结果排查目标主机防火墙开启、IP 不通、网络不通先 ping 测试连通性程序运行卡顿卡死排查无线程限流、线程数过高降低并发、增加延时部分开放端口扫不出来排查超时时间太短适当延长超时时间。六、本扫描器优缺点 面试高频考点6.1 优点纯原生库、零依赖、跨平台Windows/Linux/Mac 通用多线程并发扫描速度远超单线程脚本带服务识别、结果汇总、命令行调用实用性极强代码简洁、无加密、易二次开发、适合学习。6.2 局限性面试必答TCP 全连接扫描隐蔽性差会留下完整日志易被安全设备拦截仅支持 TCP 扫描不支持 UDP、SYN 扫描无服务版本探测、无操作系统识别、无漏洞检测公网扫描误报率高易被防火墙拦截。6.3 面试高频问题单线程和多线程端口扫描的区别TCP 全连接扫描和 SYN 半连接扫描的差异多线程扫描为什么需要加线程锁端口扫描超时时间设置的意义七、二次开发拓展功能进阶学习方向学完基础版本后可自行拓展以下实战功能打造专属扫描工具域名解析扫描支持输入域名自动解析 IP 扫描C 段网段扫描批量扫描 192.168.1.1-192.168.1.254 整段主机Banner 版本抓取获取服务版本Nginx、Apache、SSH 版本结果导出自动将扫描结果保存为 TXT/CSV 报告存活主机探测先 ping 探测主机是否存活再扫描端口提升效率进度条显示实时展示扫描进度。八、学习总结本文从零讲解了端口扫描的网络原理、TCP 连接机制、单线程基础实现、多线程高性能优化、工具化封装、参数调优、实战避坑、面试考点。手写端口扫描器的核心目的不是替代 Nmap而是吃透网络编程底层、理解端口探测逻辑、掌握多线程并发开发能力。在安全面试、内网实战、Python 安全开发中这套原理都是核心加分项。日常合规实战中推荐手写脚本用于原理学习、内网巡检正式渗透测试、资产探测优先使用 Nmap、Masscan 等专业工具。最后关于网络安全技术储备学好网络安全不论是就业还是做副业赚钱都不错但要学会网络安全还是要有一个学习规划。最后大家分享一份全套的网络安全学习资料给那些想学习网络安全的小伙伴们一点帮助对于0基础小白入门如果你是零基础小白想快速入门网络安全是可以考虑的。一方面是学习时间相对较短学习内容更全面更集中。二方面是可以找到适合自己的学习方案包括网安成长学习路线图、SRC黑客文档、护网行动、黑客必读书单、面试题、学习视频等教程。带你从零基础系统性的学好网络安全需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】1.成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图学习规划。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。2.网安入门到进阶视频教程很多朋友都不喜欢晦涩的文字我也为大家准备了视频教程其中一共有21个章节每个章节都是当前板块的精华浓缩。全套教程文末领取哈3.SRC黑客文档大家最喜欢也是最关心的SRC技术文籍黑客技术也有收录SRC技术文籍黑客资料由于是敏感资源这里不能直接展示哦全套教程文末领取哈4.护网行动资料其中关于HW护网行动也准备了对应的资料这些内容可相当于比赛的金手指5.黑客必读书单随着互联网技术的飞速发展网络安全已经成为了当今科技领域的一大热点。这些SQL注入、CCNA、Web渗透、Linux服务器等以其强大的语言理解和防御能力正在守护着我们网络世界。 那以下这些PDF籍就是非常不错的学习资源。6.网络安全岗面试题合集当你自学到这里你就要开始思考找工作的事情了而工作绕不开的就是真题和面试题。这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表