Python基于Socket实现TCP全连接端口扫描器
本文介绍如何使用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网络安全工具开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









