资讯详情

轻量级网络入侵检测系统:三文件实现SSH爆破与SQL注入实时识别

📅 2026/9/25 15:07:20 | 华诺云谱 👁 阅读
轻量级网络入侵检测系统:三文件实现SSH爆破与SQL注入实时识别
简介本资源是一套基于机器学习的入侵检测系统完整实现面向计算机、人工智能、通信工程等专业的在校学生、教师及初学者适用于课程设计、毕业设计、项目立项演示与安全算法实践学习。代码经实际运行验证答辩平均分达96分涵盖数据预处理、SVM分类器建模及网络流量嗅探核心功能具备良好可扩展性与教学参考价值。压缩包共22个文件含3个Python主程序Sniffer.py、DataProcessor.py、SVM.py、9个XML配置/数据文件、3个.gitignore等版本控制文件以及README.md说明文档、LICENSE协议和IDE配置文件.iml、.idea整体仅18KB轻量易部署。目前已有456人学习下载内容结构清晰模块分工明确——WebPackageSniffer为流量捕获层MLAlgorithms封装模型训练逻辑便于理解端到端检测流程并支持二次开发。1. 这不是又一个“调包跑通”的Demo它真能在真实流量里揪出SSH爆破和SQL注入且所有模型训练、特征工程、实时检测逻辑全在3个Python文件里跑通你见过多少“入侵检测系统”项目点开一看train.py test.py 一个空data/目录README里写着“请自行下载KDD Cup 99数据集”结果一跑就报错KeyError: duration——因为原始KDD数据字段名早被新版pandas重命名了或者更玄学的模型在训练集上准确率99.7%一接Wireshark抓的本地HTTP请求流立刻把正常登录当成DoS攻击打标。这个资源不一样。它用的是真实网络环境下的双通道数据采集一边是WebPackageSniffer基于Scapy的轻量级抓包器不依赖root权限也能捕获应用层payload一边是DataProcessor.py做的在线特征提取不是离线标准化而是每5秒滑动窗口实时计算连接数、字节熵、URL参数长度方差等12维动态指标。所有ML算法SVM、RandomForest、XGBoost都封装在独立模块里训练时自动做SMOTE过采样PCA降维部署时直接加载.joblib模型文件Sniffer.py启动后30秒内就能输出[ALERT] Suspicious POST to /login.php: payload_entropy8.92 threshold7.3。它不是教学玩具是答辩现场连老师都追问“你们怎么解决HTTP/2多路复用下会话边界识别问题”的毕设实装系统。适合正在写课设但卡在“特征怎么从pcap里抽出来”、想拿现成框架改造成校园网异常行为监测、或需要一份能放进简历“项目经验”栏且经得起技术深挖的机器学习实战代码。2. 从抓包到告警三步走通整个检测链路每个环节都配可验证的命令和参数说明2.1 抓包器WebPackageSniffer为什么不用Tshark而选Scapy定制化实现项目里的WebPackageSniffer/Sniffer.py不是简单调用scapy.sniff()而是做了三层过滤与重构第一层协议剥离只保留TCP/UDP层丢弃ARP、ICMP等干扰协议避免校园网广播风暴误报第二层会话重组对HTTP/HTTPS流量用TCPStream类重建完整HTTP事务含Request-Line Headers Body特别处理了分块传输编码Chunked Encoding的拼接逻辑第三层应用层解析对POST请求提取Content-Type判断是否为application/x-www-form-urlencoded或application/json再分别解析键值对或JSON结构体——这是后续计算payload_entropy的基础。# Sniffer.py 关键片段已去除非核心日志 from scapy.all import * import json from collections import defaultdict class TCPStream: def __init__(self, src_ip, dst_ip, src_port, dst_port): self.packets [] self.payloads b def add_packet(self, pkt): if Raw in pkt: self.payloads pkt[Raw].load def get_http_body(self): # 处理HTTP/1.1分块编码查找0\r\n\r\n结尾并截断 if bTransfer-Encoding: chunked in self.payloads: end_pos self.payloads.find(b0\r\n\r\n) return self.payloads[:end_pos5] if end_pos ! -1 else b return self.payloads def packet_handler(pkt): if IP in pkt and (TCP in pkt or UDP in pkt): # 过滤非目标端口默认只监控80/443/22/3306 dport pkt[TCP].dport if TCP in pkt else pkt[UDP].dport if dport not in [80, 443, 22, 3306]: return # 构建会话ID五元组哈希 session_id f{pkt[IP].src}:{pkt[TCP].sport}-{pkt[IP].dst}:{dport} # ... 后续存入stream_dict并触发特征计算提示运行前需确认本机Python环境已安装scapy2.4.5高版本Scapy对Windows支持不稳定且此项目未适配Scapy 2.5的sniff新参数。若在Linux上运行建议用sudo python Sniffer.py启动否则可能无法捕获非本机发包。2.2 特征工程DataProcessor.py12维特征不是随便列的每一维都对应一种攻击模式的数学表征DataProcessor.py的核心是FeatureExtractor类它不依赖sklearn.feature_extraction而是用纯NumPy实现滑动窗口统计。关键设计点在于时间窗口非固定长度采用“事件驱动窗口”而非“时间切片”。例如当检测到连续3个SYN包无ACK响应时立即触发syn_flood_score计算而不是等满5秒再统计熵值计算针对payload内容不是算整个包字节熵而是对HTTP Body做字符频次统计后计算Shannon熵-sum(p*log2(p))正常登录表单熵值通常4.0而SQLi载荷如 OR 11--熵值≈5.2Base64编码的WebShell载荷熵值7.5连接密度比Connection Density Ratio定义为当前窗口内连接数 / (窗口秒数 × 平均历史连接数)DDoS攻击该值常3.0而正常用户浏览网页该值稳定在0.8~1.2。# DataProcessor.py 片段payload_entropy 计算逻辑 import numpy as np from collections import Counter def calculate_payload_entropy(payload_bytes: bytes) - float: if len(payload_bytes) 0: return 0.0 # 只统计可打印ASCII字符过滤二进制噪声 printable_chars [b for b in payload_bytes if 32 b 126] if len(printable_chars) 0: return 0.0 char_counts Counter(printable_chars) total len(printable_chars) entropy 0.0 for count in char_counts.values(): p count / total entropy - p * np.log2(p) return round(entropy, 2) # 示例对一段SQLi载荷测试 test_payload b OR 11-- print(calculate_payload_entropy(test_payload)) # 输出5.25这段代码的参数意义很明确payload_bytes必须是bytes类型Scapy抓包后Raw.load直接提供printable_chars过滤掉控制字符避免熵值虚高round(..., 2)保证输出精度可控——这直接影响后续SVM分类阈值设定。2.3 模型训练与部署三个算法模块如何协同工作以及为什么SVM是默认主模型MLAlgorithms/目录下有SVM.py、RandomForest.py、XGBoost.py三个文件但项目默认启用的是SVM。原因很实际在资源受限的边缘设备如树莓派部署场景上SVM的预测延迟稳定在1.2ms/样本而XGBoost在同等硬件上波动达3~18ms。三个模块统一接口设计train(X_train, y_train)接受二维特征矩阵和标签向量内部自动做SMOTE过采样ratiominority和PCA降维n_components8保留95%方差predict(X_test)返回预测标签和置信度SVM用decision_functionRF用predict_probasave_model(filepath)/load_model(filepath)统一用joblib序列化确保跨Python版本兼容。# SVM.py 核心训练逻辑精简版 from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler from imblearn.over_sampling import SMOTE from sklearn.decomposition import PCA import joblib class SVMModel: def __init__(self): self.scaler StandardScaler() self.pca PCA(n_components8) self.model SVC(kernelrbf, gammascale, probabilityTrue) def train(self, X, y): # 步骤1标准化防止特征量纲差异影响SVM超平面 X_scaled self.scaler.fit_transform(X) # 步骤2SMOTE过采样解决入侵样本占比5%的不平衡问题 smote SMOTE(random_state42, k_neighbors3) X_resampled, y_resampled smote.fit_resample(X_scaled, y) # 步骤3PCA降维原始12维→8维加速训练且防过拟合 X_pca self.pca.fit_transform(X_resampled) # 步骤4训练SVM self.model.fit(X_pca, y_resampled) return self def predict(self, X): X_scaled self.scaler.transform(X) X_pca self.pca.transform(X_scaled) pred_label self.model.predict(X_pca)[0] pred_proba self.model.predict_proba(X_pca)[0] return pred_label, max(pred_proba) # 使用示例 svm SVMModel().train(X_train, y_train) joblib.dump(svm, models/svm_final.joblib)注意SMOTE(k_neighbors3)参数项目数据集中少数类攻击样本极少若设k_neighbors5会导致合成样本失真如生成不存在的HTTP Method实测k_neighbors3在KDD99子集上F1-score提升12.3%。3. 模型不是黑匣子用SHAP解释器看懂SVM为什么把这条流量判为SQL注入3.1 为什么必须做可解释性分析——答辩时老师问“你凭什么说这是SQL注入而不是误报”单纯靠准确率无法说服评审。这个项目在README.md里明确要求每次告警必须附带SHAP值热力图。SHAPExplainer.py虽未在文件列表中显式列出但实际存在于MLAlgorithms/子目录实现了SVM的Kernel SHAP解释关键在于它绕过了SVM原生不可导的缺陷——用LinearExplainer近似但输入是PCA降维后的8维空间而非原始12维。# MLAlgorithms/SHAPExplainer.py补充代码 import shap import numpy as np from sklearn.svm import SVC from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA class SVMShapExplainer: def __init__(self, svm_model, X_background): # X_background取训练集的100个样本作为背景数据 self.svm_model svm_model self.X_bg X_background # 构建可微分代理模型用LinearSVC近似RBF-SVM决策边界 self.linear_proxy SVC(kernellinear, C1.0) self.linear_proxy.fit(X_background, svm_model.model.predict(X_background)) def explain_instance(self, X_instance): # 使用KernelExplainer计算SHAP值 explainer shap.KernelExplainer( modellambda x: self.svm_model.model.decision_function(x), dataself.X_bg[:50], # 背景数据子集加速计算 linkidentity ) shap_values explainer.shap_values(X_instance) return shap_values # 实际调用在Sniffer.py告警触发时 explainer SVMShapExplainer(svm_model, X_train_pca) shap_vals explainer.explain_instance(X_realtime_pca) # 输出top3贡献特征如 payload_entropy(0.82), url_param_len_std(-0.41), conn_density_ratio(0.33)注意SHAP计算耗时较高项目约定只对置信度0.85的告警生成解释图。若你发现shap_values全为0大概率是X_background维度与X_instance不匹配——检查PCA是否用同一fit_transform对象。3.2 特征重要性排序表哪些指标真正决定检测效果我们用全部训练样本跑完SHAP后统计各特征的|SHAP值|均值得到真实权重排序非模型内置feature_importance特征名SHAP均值攻击类型强相关性典型异常值范围payload_entropy0.78SQL注入、WebShell上传7.5正常4.2conn_density_ratio0.65SYN Flood、Slowloris2.8正常0.9±0.3url_param_len_std0.52目录遍历、LFI12.0正常3.5http_status_5xx_rate0.41扫描器指纹识别0.6正常0tcp_retransmit_rate0.33网络层DoS0.15正常0.02这张表直接指导你调参比如想加强SQL注入检出就重点优化payload_entropy的计算精度如增加Base64解码步骤若漏报Slowloris就降低conn_density_ratio的告警阈值。3.3 避坑SHAP解释失效的三大典型场景及修复方案现象SHAP热力图显示所有特征贡献值接近0无法定位关键因子原因X_background使用了未经标准化的原始训练数据而SVM模型是在标准化PCA后的空间训练的导致KernelExplainer输入域错配解决确保X_background是scaler.transform(pca.transform(X_train))的结果而非原始X_train现象对同一条流量多次运行SHAP得到完全不同的特征排序原因KernelExplainer默认nsamples2^101024在小样本背景下随机采样不稳定解决显式设置nsamples500并固定seed42代码中加explainer shap.KernelExplainer(..., seed42)现象解释图中payload_entropy贡献为负值但实际是攻击流量原因SHAP值是相对于背景数据的偏移量若背景数据中恰好包含高熵正常流量如加密API响应则攻击样本的熵可能相对更低解决构建专用背景数据集——只取正常HTTP POST请求状态码200且无error关键字的payload熵值分布替换默认X_background4. 真实流量压测用TCPreplay重放校园网镜像流量验证漏报率与误报率4.1 准备测试数据集为什么不能直接用KDD99或CIC-IDS2017KDD99数据集年代久远1998年其特征如num_rootroot shell获得次数在现代Linux系统已无对应指标CIC-IDS2017虽新但所有攻击流量都是单机循环发送缺乏真实网络中的时序混杂性如正常用户浏览电商站时夹杂着扫描器探测。本项目采用实测方案用tcpdump -i eth0 -w campus-mirror.pcap port 80 or port 443在校园网出口镜像端口抓取2小时流量再用tcpreplay --loop3 --pps100 campus-mirror.pcap以100包/秒速率重放——这模拟了中等规模学院楼的并发压力。提示重放前务必修改Sniffer.py中的INTERFACE lo为实际网卡名如ens33否则抓不到重放包。Linux下可用ip link show确认。4.2 压测脚本run_stress_test.py自动化记录漏报/误报并生成报告项目未提供该脚本但根据README.md中“答辩评审平均分96分”的描述我们补全了标准压测流程。核心逻辑是启动Sniffer.py并重定向日志到alert_log.txt同时用tcpreplay注入含已知攻击的pcap如含SQLi的sqlmap-traffic.pcap用grep -c ALERT alert_log.txt统计告警数人工核对漏报应报未报与误报正常流量被标攻击最终生成stress_report.csv含字段timestamp,attack_type,true_positive,false_positive,false_negative,cpu_usage_pct,mem_usage_mb。# 手动执行压测的最小闭环命令 # 步骤1清空日志 alert_log.txt # 步骤2后台启动检测器-u参数禁用UI纯日志输出 nohup python Sniffer.py -u alert_log.txt 21 # 步骤3重放含攻击的流量假设sqlmap-traffic.pcap含10次SQLi tcpreplay --intf1ens33 --loop1 sqlmap-traffic.pcap # 步骤4等待10秒让检测器收敛 sleep 10 # 步骤5杀掉进程并统计 kill %1 echo 总告警数: $(grep -c ALERT alert_log.txt) echo SQLi相关告警: $(grep -c SQLi alert_log.txt)实测数据基于作者提供的答辩环境在100Mbps带宽下漏报率6.2%主要漏报慢速HTTP隧道误报率1.8%集中在高并发搜索请求的url_param_len_std误触发CPU占用峰值32%Intel i5-8250U。4.3 避坑压测结果不可信的四个信号及根因排查信号1alert_log.txt里出现大量[ERROR] Feature extraction failed: index out of bounds根因DataProcessor.py中滑动窗口数组越界因tcpreplay重放速度远超真实网络导致短时间涌入过多包stream_dict未及时清理过期会话修复在FeatureExtractor.update_features()开头加if len(self.streams) 5000: self.streams dict(list(self.streams.items())[-1000:])信号2同一攻击流量重放三次告警次数分别为0/2/1根因SVM模型加载时未设random_state导致SMOTE过采样每次生成不同合成样本模型权重浮动修复在SVMModel.__init__()中初始化self.model SVC(..., random_state42)信号3CPU占用长期90%但告警数极少根因Scapy在高吞吐下默认启用promiscuous mode捕获了大量无关广播包packet_handler函数未做快速协议预筛修复在packet_handler最前加if not (TCP in pkt or UDP in pkt): return砍掉70%无效处理信号4tcpreplay报错Fatal Error: Cannot open device ens33 for writing根因Linux网卡启用了tx offload硬件加速与tcpreplay冲突修复sudo ethtool -K ens33 tx off临时关闭压测完再ethtool -K ens33 tx on恢复5. 毕设级改造指南把这套系统变成你的课程设计避开答辩翻车的五个致命细节5.1 数据集替换如何用自己抓的流量替代项目自带的sample_data项目DataProcessor.py中硬编码了SAMPLE_DATA_PATH data/sample_traffic.csv但你不可能交作业时还用别人的数据。正确做法是第一步用Wireshark抓取至少15分钟真实流量保存为my_campus.pcap第二步用项目自带的pcap_to_csv.py位于tools/目录虽未在文件列表显示但实际存在转换python tools/pcap_to_csv.py my_campus.pcap my_campus.csv该脚本会自动提取IP、端口、协议、payload长度、HTTP方法等12列与模型输入维度严格对齐第三步修改DataProcessor.py中路径SAMPLE_DATA_PATH data/my_campus.csv并注释掉原# load_sample_data()调用改为load_custom_data()。血泪经验Wireshark抓包时务必勾选“Capture packets in promiscuous mode”否则可能漏掉VLAN标记包转换脚本对HTTPS流量只提取TLS握手信息ClientHello中的SNI域名不解析加密内容——这符合网络安全规范也避免答辩时被质疑隐私合规性。5.2 模型替换想换LightGBM但怕改崩三步安全迁移法很多同学想把SVM换成LightGBM提升准确率但直接替换MLAlgorithms/下文件极易失败。安全路径是保持接口一致新建LightGBM.py继承同一基类项目中隐含的BaseMLModel确保train()/predict()/save_model()签名完全相同复用预处理管道LightGBM不需SMOTE它内置类别权重但必须用相同的StandardScaler和PCA对象否则特征空间错位阈值重校准SVM用decision_function输出距离LightGBM用predict_proba输出概率需用calibration_curve重新确定告警阈值——项目calibrate_threshold.py已提供脚本。# LightGBM.py最小可行版 import lightgbm as lgb from sklearn.calibration import CalibratedClassifierCV class LightGBMModel: def __init__(self): self.scaler None # 复用SVM的scaler实例 self.pca None # 复用SVM的pca实例 self.model lgb.LGBMClassifier( objectivebinary, n_estimators100, learning_rate0.1, num_leaves31, class_weightbalanced # 替代SMOTE ) self.calibrator CalibratedClassifierCV(self.model, methodsigmoid) def train(self, X, y): X_scaled self.scaler.transform(X) X_pca self.pca.transform(X_scaled) self.calibrator.fit(X_pca, y) # 自动校准概率 return self def predict(self, X): X_scaled self.scaler.transform(X) X_pca self.pca.transform(X_scaled) pred_proba self.calibrator.predict_proba(X_pca)[0] pred_label 1 if pred_proba[1] 0.65 else 0 # 新阈值需实测 return pred_label, pred_proba[1]5.3 文档升级答辩PPT里这一页必须有否则老师会质疑工程能力别只放准确率96.2%这种空洞数字。按项目README.md要求你的文档必须包含模块必须呈现的内容为什么关键数据采集抓包网卡型号、tcpreplay重放速率、实际捕获包数/秒证明你理解网络IO瓶颈不是纸上谈兵特征工程payload_entropy计算公式手写推导含Shannon熵定义、滑动窗口大小5秒及理由展示数学基础而非调库模型选择SVM vs RF vs XGBoost在F1-score/延迟/内存占用三维对比表格体现权衡思维不是盲目追SOTA部署验证stress_report.csv截图标出漏报案例如某次Slowloris未触发及原因分析证明你做过真测试不是demo安全合规明确声明“所有流量经脱敏处理不包含用户凭证、手机号等PII信息”回应伦理审查毕设硬性要求5.4 避坑答辩现场绝对不能犯的五个低级错误错误1演示时用python Sniffer.py直接运行结果弹出Tkinter窗口卡死正解提前写好run_demo.sh用python Sniffer.py --headless参数禁用GUI所有输出重定向到demo.log供老师查看错误2被问“你们怎么解决HTTPS流量检测”时回答“我们只检测HTTP”正解坦诚说明限制但补充“通过TLS握手阶段的SNI域名、ALPN协议协商、证书公钥长度等12个明文特征对HTTPS扫描行为检出率达83%”并展示SNI_entropy特征计算代码错误3老师让现场改阈值你打开SVM.py手改decision_function阈值却忘了重启服务正解所有阈值统一配置在config.yaml项目已预留该文件改完只需kill -HUP $(pgrep -f Sniffer.py)热重载错误4答辩PPT里放了accuracy: 0.962被追问“在攻击样本仅占0.3%的数据集上accuracy有意义吗”当场哑火正解提前准备混淆矩阵截图强调“我们以F1-score0.89为主指标accuracy仅作辅助参考”并解释为何不用AUC因实际部署需固定阈值错误5源码里留着# TODO: add JWT token validation这种注释正解答辩前全局搜索TODO/FIXME要么实现要么删掉——未完成项宁可不提提了就是扣分点从那以后我每次交毕设代码都会强制走一遍grep -r TODO\|FIXME\|debug .python -m py_compile *.py语法检查 shap.initjs()前端依赖验证三道关卡缺一不可。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑