Python基于Socket实现TCP全连接端口扫描器

Dylan
Dylan
发布时间:2026-10-12 | 2人浏览过
原创

本文介绍如何使用Python的Socket模块搭建TCP全连接端口扫描器。从基础单线程连接验证起步,逐步引入多线程与互斥锁机制提升探测效率。详细说明核心参数配置、完整代码实现、运行输出判断及防火墙拦截排查步骤,帮助快速掌握局域网资产探测与安全检测工具的开发方法。

扫描原理与环境准备

端口扫描是识别目标主机开放服务的基础手段。TCP全连接扫描(Connect Scan)通过尝试建立完整的TCP三次握手流程,根据内核返回的连接成功或拒绝信号来判断端口状态。该方式无需特殊权限即可运行,但会留下较为明显的系统日志记录。

使用前请确保运行环境已安装Python 3.x,且具备目标网络的可访问权限。进行自动化扫描前,请务必确认目标主机归属权或已获得授权,避免触发安全设备告警或违反网络管理规定。

第1步:编写基础单线程扫描脚本

首先通过标准库socket构建基础的探测逻辑。代码利用AF_INET指定IPv4协议族,SOCK_STREAM绑定面向连接的TCP传输层协议。通过遍历指定端口区间并调用connect()发起握手,结合setdefaulttimeout(1)将单次握手等待限制为1秒,防止程序因无响应而永久阻塞。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *

def portScanner(host,port):
    try:
        s = socket(AF_INET,SOCK_STREAM)
        s.connect((host,port))
        print('[+] %d open' % port)
        s.close()
    except:
        print('[-] %d close' % port)

def main():
    setdefaulttimeout(1)
    for p in range(1,1024):
        portScanner('192.168.0.100',p)

if __name__ == '__main__':
    main()

第2步:升级多线程高并发版本

单线程逐个轮询在端口数较大时耗时显著。引入threading模块后,可为每个端口分配独立线程并行探测,大幅提升吞吐速度。由于多个线程同时修改全局计数器openNum,必须加入互斥锁threading.Lock()保护临界区,确保统计数据准确无误。

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from socket import *
import threading

lock = threading.Lock()
openNum = 0
threads = []

def portScanner(host,port):
    global openNum
    try:
        s = socket(AF_INET,SOCK_STREAM)
        s.connect((host,port))
        lock.acquire()
        openNum+=1
        print('[+] %d open' % port)
        lock.release()
        s.close()
    except:
        pass

def main():
    setdefaulttimeout(1)
    for p in range(1,1024):
        t = threading.Thread(target=portScanner,args=('192.168.0.100',p))
        threads.append(t)
        t.start()     

    for t in threads:
        t.join()
    print('[*] The scan is complete!')
    print('[*] A total of %d open port ' % (openNum))

if __name__ == '__main__':
    main()

运行验证与完成状态判断

保存脚本并执行后,终端将实时滚动打印探测结果。当所有线程执行完毕并调用t.join()释放阻塞后,控制台会固定输出[*] The scan is complete!以及统计信息[*] A total of %d open port。此时即代表对1至1023号常用端口的全量扫描任务已结束,列表中的[+]标识即为开放端口,[-]标识为关闭或被过滤端口。

常见问题与排错建议

  • 进度极慢或大量卡顿:检查是否误配了过大的端口范围或目标主机不可达。可适当将range()上限调低,或调整setdefaulttimeout()数值以平衡速度与准确性。
  • 结果与实际不符:现代服务器常部署IPS/IDS或iptables策略。若扫描结果显示大量端口处于closed/stale状态,可能是中间防火墙壁进行了静默丢弃(Drop)而非主动拒绝(Reject),此时工具层面难以区分,属于正常网络防护现象。
  • 权限不足报错:部分操作系统禁止普通用户向高位端口发起主动连接。如遇Permission denied异常,请切换至管理员/root账户运行脚本,或使用root权限重新编译底层网络连接。

简要总结

本方案基于Python标准网络库实现了结构清晰的TCP全连接扫描工具。通过叠加多线程调度与线程安全锁,有效解决了传统顺序扫描的性能瓶颈。开发者可根据实际业务场景调整目标地址、端口阈值与并发数量,将其灵活集成至自动化巡检流程中。以上就是Python编写TCP全连接端口扫描器的详细内容,更多关于Python网络安全工具开发的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表