用 Python 构建高性能网络端口扫描程序
端口扫描使我们能够识别网络上可能被应用程序使用或在某些情况下被攻击者利用的开放门(端口)。使用Python,我们可以构建一个简单而强大的端口扫描器,能够检测一系列IP地址中的服务,使其成为系统管理员和安全专业人员的必备工具。
什么是端口扫描?端口扫描是指探测服务器或主机以打开端口的过程。每个端口对应于特定的服务或应用程序,识别开放端口对于安全审计和网络管理至关重要。
端口范围从0到65535,分为:
已知端口(0–1023):保留用于HTTP(端口80)和HTTPS(端口443)等常用协议。
已注册的端口(1024–49151):分配给特定应用程序。
动态/专用端口(49152–65535):由应用程序动态使用,通常用于临时通信。
设置Python环境在编写代码之前,需要安装一些基本的依赖库。Python的套接字库为联网任务提供了基础。要安装它,请使用以下命令:
pipinstallsocket
确保的环境使用或更高版本进行更新,因为此版本提供更好的性能和稳定性。
构建核心扫描程序逻辑portscanner的核心logic涉及使用Python的socket模块连接到ports并确定它们的状态。以下是我们的扫描仪的基本代码结构:
importsocketdefport_scan(target,port):try:s=(_INET,_STREAM)(1)result=_ex((target,port))ifresult==0:print(f"Port{port}isopen")()exceptExceptionase:print(f"Errorscanningport{port}:{str(e)}")Exampleusagetarget='192.168.1.1'run_scanner(target)此版本利用Python的threading模块,为每个端口扫描创建一个新线程。扫描程序现在运行得更快,更适合在大型网络中实时使用。
针对大型网络优化扫描程序在扫描具有多个IP地址的大型网络时,确保扫描程序不会压垮系统资源至关重要。我们可以使用线程池来优化性能,限制在任何给定时间活动的线程数。
_ports_in_network(target):withThreadPoolExecutor(max_workers=100)asexecutor:forportinrange(1,65536):(scan_port,target,port)#Exampleusagetarget='192.168.1.1'scan_ports_in_network(target)
在这里,使用ThreadPoolExecutor来管理固定的工作线程池,确保我们的扫描程序不会因过多的线程而使系统过载,同时保持高性能。
测试和调试端口扫描程序针对已知目标(例如本地计算机或开发服务器)测试端口扫描程序至关重要。建议使用nmap进行比较,因为它是网络扫描的行业标准。
使用以下工具进行监控和调试:
Wireshark:跟踪网络流量并验证端口连接。
Netcat:用于在本地计算机上设置开放端口以测试扫描仪的准确性。
高级功能:检测服务版本为了将扫描程序提升到一个新的水平,可以添加检测哪些服务正在开放端口上运行的功能。这是通过横幅抓取完成的,这涉及在连接时读取服务的响应。
defgrab_banner(s):(1024).decode('utf-8')defscan_port_with_banner(target,port):s=()try:((target,port))(b'Hello\r\n')banner=grab_banner(s)print(f"Port{port}isopen:{banner}")except:()此代码允许我们从开放端口捕获服务横幅,从而让我们深入了解正在运行的服务类型,无论是HTTP、FTP还是其他协议。