校园网的运维群里每天都有学生喊“网卡了”“又断连了”,但真正的问题是:校园网用户行为分析一直停留在“能通就行”的阶段。出口带宽被占满,你不知道是谁在跑P2P;深夜断网,你不知道是该限流还是该扩容;领导要一份上网行为报告,你只能翻三天日志手工统计。这套基于大数据的校园网用户行为分析系统,就是把“黑盒”变成“透明驾驶舱”的完整落地实践——从交换机镜像口抓包开始,到Kafka接入、Flink实时计算、ClickHouse离线分析,最后形成用户画像和可视化大屏,每一步都踩过坑,每一步都有可复现的配置和代码。
这篇文章适合三类人:一是正在做大数据毕业设计的学生,这套系统的架构和代码可以直接作为论文的工程支撑;二是高校网络中心的运维人员,文中所有方案均来自真实校园网环境,你可以按章节直接抄作业;三是想入门用户行为分析这一方向的开发者,从数据采集到特征工程再到可视化,是一条完整且不走弯路的链路。
1. 为什么校园网必须做行为分析:三个真实痛点
1.1 出口带宽白白浪费,运维却拿不出证据
高校校园网的出口带宽通常以Gbps为单位,但每到晚上7点到11点,延迟和丢包率就会明显上升。学生都在刷视频、打游戏,这谁都知道,但领导问“具体是什么应用占了带宽”时,传统网络设备只能给出IP和端口,翻译不成“某视频App占比38%”这种业务语言。
我接过一个真实的工单:某高校出口带宽从2G扩容到4G,半年后又满了。采购前没有流量构成数据支撑,扩容后无法评估效果——这就是典型的行为分析缺失。如果有一套系统能在扩容前给出“视频类流量占比61%,其中某短视频平台占视频流量的47%”这样的报告,采购决策会理性得多,扩容后的效果评估也有了依据。
1.2 安全事件追溯靠翻日志,效率低到崩溃
校园网里最头疼的不是外部攻击,而是内部失陷主机的横向扩散。某台学生笔记本中了挖矿木马,会持续向外发起连接;某台实验室服务器被爆破,会在内网扫描端口。传统做法是出了问题再翻AAA认证日志、DHCP日志、防火墙日志,几份日志的时间戳格式还不一样,对起来想死。
行为分析系统把流量元数据和认证信息做了关联,同一用户在同一时间窗内的行为全部串起来。某IP在凌晨两点持续向境外IP发起连接、同时DNS请求异常频繁——这类行为特征在系统里是自动告警的,不需要人工去翻日志。
1.3 网络规划没有任何数据支撑
校园网的AP布点、楼宇带宽分配、IPv6改造,这些规划基本靠经验和感觉。宿舍区晚上拥塞,是真的容量不够还是某个宿舍的NAT设备劣化?教学楼白天流量低,是正常还是要做无线优化?行为分析系统沉淀下来的时段流量模型、区域流量密度、用户活跃周期,是网络规划最客观的依据。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统整体架构与数据链路设计
2.1 五层架构:从物理网络到业务可视
这套系统的架构不复杂,但每一层都有明确的职责边界。我用了五层设计,从下往上分别是:
- 数据采集层:对接校园网核心交换机镜像口、AAA认证服务器、DHCP服务器,采集流量元数据、认证日志、IP分配记录。
- 消息缓冲层:Kafka集群承接所有采集数据,削峰填谷,解耦生产者和消费者。高峰期每秒几万条日志,数据库直接写会崩,先进Kafka是标准做法。
- 实时计算层:Flink消费Kafka数据,做实时指标计算和异常检测。用户当前在线数、实时带宽、每秒新建连接数,这些必须秒级刷新。
- 离线存储与分析层:ClickHouse存储明细数据和汇总数据,跑小时级和天级任务。用户画像、时段趋势、应用构成这类复杂查询,ClickHouse百亿级数据秒级响应。
- 应用展示层:可视化大屏、报表系统、告警平台,面向运维人员和网络中心领导。
2.2 数据链路:一条日志的完整旅程
拿一条最典型的DNS日志举例,这条日志从产生到变成大屏上的一个指标,会经过这样一条链路:
- 用户在浏览器输入某视频网站域名,校园网DNS服务器收到解析请求,产生一条DNS日志。
- DNS服务器通过syslog将日志实时推送到采集服务器,采集服务器做简单的格式校验后,打包发送到Kafka。
- Flink消费到这条DNS日志后,解析出源IP、目标域名、时间戳,通过内存态的用户IP-MAC-学号映射表,把源IP关联成具体的用户身份。
- 关联完成后,Flink对域名做应用识别(比如判断为视频类),把结果写入ClickHouse的明细表,同时更新实时带宽指标。
- 大屏每5秒从ClickHouse拉取一次最新指标,页面上的“视频流量占比”数字随之跳动。
这条链路从端到端延迟控制在10秒以内,完全满足运维场景的实时性要求。
2.3 为什么核心存储选ClickHouse而非Elasticsearch
在做技术选型时,我仔细对比了ClickHouse和Elasticsearch。如果你的需求是“搜日志”,比如查某个IP在过去一周的所有访问记录,Elasticsearch很好用;但行为分析系统更多是“算指标”——按小时分组求平均带宽、按应用类型统计流量占比、按用户维度聚合会话数。这类聚合查询在ClickHouse里是强项,一个SQL就能搞定,在Elasticsearch里却要写很复杂的聚合管道,性能也不在一个量级。
ClickHouse的列式存储对这类分析负载是天然友好的。导入性能也非常夸张,我们单机写入稳定在每秒20万行以上,对校园网的日志量级来说绰绰有余。这套架构跑下来,核心存储就是ClickHouse单集群搞定,不需要引入ES来增加运维复杂度。
3. 数据采集层的落地细节与实战配置
3.1 流量元数据采集:用好交换机镜像口
流量采集是整个系统的基础,数据不完整,后面一切分析都是空中楼阁。我做的是流量元数据采集,不是全量报文存储——全量抓包存储的成本太高,校园网这种规模每天几个TB的PCAP文件,存储和检索都是灾难。
在核心交换机的上联口做端口镜像,把所有进出校园网的流量复制一份到采集服务器。采集服务器上跑着一种流采集工具,读取镜像流量,按五元组聚合出流的元数据——源IP、目的IP、源端口、目的端口、协议、起始时间、结束时间、上行字节数、下行字节数、TCP标志位等。这种流数据每天的体量在50GB到200GB之间,压缩后存储在ClickHouse里可以保留90天以上。
注意:镜像口配置时一定要确认方向。校园网核心交换机上联口要同时镜像入方向和出方向,只镜像一个方向会导致流量只有一半,所有分析结果都会偏。
3.2 认证日志采集:用户身份关联的钥匙
单纯有IP和流量数据,不知道这个人是谁,分析价值会大打折扣。校园网普遍使用AAA认证,每次用户上线、下线、IP地址分配、MAC地址绑定,认证服务器都会产生日志。通过syslog把认证日志也送到Kafka。
认证日志的格式因设备厂商而异,有些是Key=Value格式,有些是JSON格式,还有些是纯文本。这里的关键点是做字段标准化:在采集阶段统一转成JSON,至少包含username、user_ip、user_mac、login_time、logout_time这几个核心字段。后面做用户维度的分析,全靠这张认证记录表把IP翻译成人。
3.3 DHCP日志与目录服务:补齐身份映射的最后一块拼图
很多校园网环境里,非认证场景的设备(比如实验室的服务器、物联网设备)不会产生认证日志,但它们在网络上确实在跑流量。这时候需要DHCP日志来补充IP-MAC的对应关系。
我们还会对接学校的统一身份认证平台,用学号/工号作为用户唯一标识,把姓名、院系、年级这些属性拉取到本地库。注意隐私合规,只需要拉取基本属性和组织架构信息,用于后续的分群分析。
3.4 数据采集端的实战注意事项
采集端最容易翻车的点是时间同步。所有采集服务器必须配置NTP,并且要校验和核心交换机、认证服务器的时间一致。我踩过一次坑:认证日志和流量日志的时间差了2分钟,关联分析时同一个用户的会话对不上,排查了很久才发现是采集服务器的时钟漂了。
另一个坑是Kafka Topic的分区数设置。分区数决定了消费并行度,建议Topic设置8到16个分区,消费者实例和数据量匹配,避免分区过多导致频繁重平衡。
4. 核心技术实现:Flink实时计算与用户画像建模
4.1 Flink消费Kafka的完整过程
实时计算层我选了Flink,因为它的事件时间处理和精确一次语义在流计算框架里最成熟。校园网场景里,日志到达的顺序是乱的——认证日志可能比流量日志晚到几秒钟,如果用处理时间窗口,关联会错位。Flink的事件时间机制配合Watermark,可以很好地对齐乱序数据。
核心代码如下,消费Kafka里的认证日志并做IP到用户的映射:
java复制DataStream<String> authStream = env.addSource(
new FlinkKafkaConsumer<>("auth_logs",
new SimpleStringSchema(),
kafkaProps));
DataStream<UserMapping> userMappings = authStream
.map(new AuthLogParser())
.assignTimestampsAndWatermarks(
WatermarkStrategy.<UserMapping>forBoundedOutOfOrderness(Duration.ofSeconds(10))
.withTimestampAssigner((event, timestamp) -> event.getLoginTime()));
这段代码的关键点是设置了10秒的乱序容忍度,让晚到的认证日志不会丢掉。Watermark机制会在数据流中周期性地插入水位线,Flink就知道“这个时间点之前的数据到齐了”,可以触发窗口计算。
4.2 实时指标计算与异常检测
实时计算层主要跑三类任务:
- 实时在线用户数与带宽:每5秒更新一次,统计当前在线用户数、总上行/下行带宽、各应用分类的实时带宽。
- 新建连接数监控:每秒新建连接数是一个重要的异常信号。某台主机突然每秒发起上千个新连接,八成是中招了,要么在扫描内网,要么在被暴力破解。
- DNS隧道检测:DNS请求的域名长度异常、请求频率异常,可能是数据外传。Flink窗口聚合DNS请求次数,超过阈值就触发告警。
异常检测的核心代码如下,统计每个源IP每分钟的DNS请求次数,超过阈值输出告警:
java复制DataStream<Alert> alertStream = dnsLogs
.keyBy(log -> log.getSourceIp())
.window(TumblingEventTimeWindows.of(Time.minutes(1)))
.aggregate(new CountAggregate())
.filter(count -> count > 100)
.map(count -> new Alert("DNS_ANOMALY", count.getKey(),
"DNS query count " + count.getValue() + " in 1 minute"));
4.3 用户画像建模:从基础标签到深度特征
用户画像是行为分析最出彩的部分,也是毕业设计里最能体现“分析深度”的模块。画像分三个层级:
第一层是基础属性标签:学部、院系、年级、身份类型(本科生/研究生/教师),来自学校统一身份平台的同步数据。
第二层是行为偏好标签:活跃时段偏好(夜猫子型/早起型/全天均衡型)、应用偏好(视频为主/学习为主/游戏为主)、流量特征(重度使用者/轻度使用者)、地理位置偏好(主要在图书馆区域/宿舍区域/教学楼区域)。
第三层是风险特征标签:异常连接频次、恶意域名访问记录、扫描行为标记、弱密码风险等。
行为偏好标签的计算,我用了两个维度:时间维度分布和应用类别占比。用户在哪个时段活跃、哪类应用消耗了他80%的流量,这些用ClickHouse的GROUP BY就能算出来,不需要复杂的机器学习算法。但为了让画像更“智能”,我加了一个基于K-Means的用户聚类模块,把用户分为“宿舍视频党”“图书馆学习组”“实验室下载狂”“轻量移动族”几类,每类用户呈现完全不同的网络需求,这是精细化运营的基础。
4.4 冷热数据分离与存储优化
行为数据快速增长,ClickHouse里建议做冷热分层。热数据(最近7天)存放在SSD盘,冷数据(7天以上)转移到HDD或者对象存储。ClickHouse支持TTL自动转移,一条SQL就能搞定:
sql复制ALTER TABLE user_behavior_daily
MODIFY TTL login_time
TO DISK 'cold_disk';
另一个重要优化是数据分区。按天分区,查询时带上时间条件,ClickHouse自动裁剪分区,速度能快几十倍。如果按小时分区,查询更快,但分区数量会很多,官方建议分区数量不要超过数千个,所以按天是平衡点。
5. 行为分析的四个核心维度:不只是“谁用了多少流量”
5.1 时段分析:从曲线图看校园的生活节奏
时段分析是所有分析的基础。以小时为粒度统计全网的活跃用户数、总流量、应用分布,你能非常直观地看到校园的作息规律:早上8点流量爬升,中午12点出现小高峰,晚上9点到11点是绝对高峰,凌晨2点到6点跌到谷底。
深挖一层,不同身份用户的时段特征更值得看。研究生的活跃时段明显比本科生晚,凌晨还在下载论文跑实验的很常见;教师的流量高峰在白天工作时间,且应用类型以Web和邮件为主。这些差异是分群画像的天然维度。
某周流量曲线在凌晨出现异常突起,排查后发现是某个实验室在跑数据备份任务,虽然没造成故障,但通过时段分析发现了这个规律后,主动把备份任务改到了出口空闲的凌晨3点,错峰效果显著。
5.2 应用识别与分类:从端口识别上升到DPI
端口识别是最基础的方式,比如80端口就是HTTP,443就是HTTPS。但现在应用早就学会了“隐藏自己”——视频App使用443端口走TLS加密,游戏客户端使用随机高位端口。纯端口识别在校园网环境里准确率不到50%,必须上DPI。
DPI的核心原理是特征匹配,每个应用都有独特的特征码。比如某视频App的TLS证书中的服务器名称特征、某些P2P协议的握手特征、某些游戏的UDP负载特征。我用的策略是“多层匹配”:先看IP(CDN IP库匹配大厂应用,准确率高),再看域名(SNI字段),最后做负载特征匹配。三层叠加,识别率能到85%以上。
应用分类后的结果,对带宽管理非常有价值。我们展示的“应用流量构成”按大类分为:视频类、社交类、下载类、游戏类、Web浏览、邮件、其他。每个大类下再细分具体应用名,比如视频大类里有某短视频、某长视频、某直播平台等。
5.3 用户群体分析:同一张网,不同的人完全不同的活法
用户群体分析是把用户按属性分组,比较组间差异。重点做了三个分组维度:院系维度(看哪些院系是流量大户)、身份维度(本科生、研究生、教师)、宿舍楼维度(看哪栋楼的带宽最紧张,为无线AP扩容提供依据)。
宿舍楼维度的分析效果立竿见影。某栋老宿舍楼晚上带宽跑满,AP延迟飙到200ms,学生投诉不断。行为分析系统给出这栋楼的流量构成:视频类流量占71%,在线游戏占12%,Web浏览只有8%。再叠加用户数,算出人均带宽消耗——结论是这栋楼的用户密度已经超过了AP的承载能力,必须做扩容。扩容后投诉率骤降,这就是行为分析驱动网络投资的价值。
5.4 异常行为识别:规则引擎加统计基线的双保险
异常识别的核心是为了在不增加人力投入的情况下,快速发现安全问题。我用的是规则引擎叠加统计基线的方案。
规则引擎最简单直接:单人单日流量超过阈值(比如50GB)、单IP连接数超过阈值、访问恶意IP库中的地址等。命中规则直接告警,误报率相对较高,但不会漏报。
统计基线是更“智能”的方案:系统自动学习每个IP的历史流量模型,计算均值和标准差。某天某IP的流量突然超过均值加三倍标准差,即使绝对数值不高,也会触发告警。这能发现“这个用户平时从来不看视频,突然开始大量看视频”这类用固定规则发现不了的异常。
告警一定要做降噪,不然运维同事会被告警淹没。把告警分级:高危(疑似失陷主机横向扫描、挖矿连接)直接打电话;中危(单用户流量超阈值)发邮件;低危(新设备首次入网)只在控制台展示。
6. 可视化大屏与运维联动:让数据真正用起来
6.1 大屏布局与核心指标
可视化是系统的“脸面”,也是让领导直观理解系统价值的窗口。大屏设计分了五个区域:
- 顶部总览区:实时在线用户数、今日总流量、实时带宽、告警总数。
- 左侧用户分析区:院系流量排行、用户类型构成、终端类型分布。
- 中间实时动态区:全网流量实时曲线、应用流量排行、当前TOP10用户。
- 右侧安全态势区:告警滚动列表、异常IP地理位置分布、攻击类型统计。
- 底部时段趋势区:过去24小时活跃用户数曲线、过去24小时流量曲线。
大屏用了ECharts绘制图表,WebSocket从后端拉取实时数据,5秒一个刷新周期。技术上不复杂,但数据指标的准确性和实时性是最关键的——如果大屏上的在线人数和实际对不上,领导问起来会很尴尬。
6.2 大屏数据接口:一条SQL背后的实时逻辑
大屏上每个数字背后都是一条或多条SQL。比如“实时带宽”的查询逻辑:
sql复制SELECT
sum(uplink_bytes) / 5 AS uplink_bps,
sum(downlink_bytes) / 5 AS downlink_bps
FROM traffic_5s_realtime
WHERE ts >= now() - INTERVAL 5 SECOND;
这个查询每5秒执行一次,数据由Flink实时聚合后写入ClickHouse的对应表。ClickHouse对这类带时间条件的聚合查询响应时间在毫秒级,完全可以支撑大屏高频刷新。
6.3 从“看数据”到“能处置”:告警联动闭环
大屏不仅是展示,更重要的是能触发处置动作。我把告警配置了三种联动方式:
第一种是接入网络管理系统自动处置。比如某IP被判定为挖矿连接特征,系统通过API调用交换机接口,将这个端口做隔离处理。这一步在实施时要非常谨慎,必须有确认机制,避免误伤正常业务。
第二种是工单系统自动创建工单。高危告警自动生成工单,指派给对应区域的网络管理员,处理过程和结果都记录在案。
第三种是向用户发送告知消息。对于一些中危行为(比如单日流量超限),通过校园网认证页面推送一条消息,提示用户“您今日流量已超过50GB,请注意合理使用”。
这套联动机制让系统从“监控工具”变成了“运维助手”。有一次学生宿舍某IP在凌晨4点触发了异常外连告警,系统自动做了端口隔离,第二天早上运维同事看到告警记录后复核,确认是该学生电脑中了木马。如果不隔离,这个木马可能会在内网传播一整天。
7. 系统部署与性能调优的关键经验
服务器规划建议:测试环境最低3台机器(16核CPU、64GB内存、1TB SSD),分别部署采集、Kafka+Flink、ClickHouse。生产环境建议5台起步,ClickHouse集群至少3节点。
Kafka的性能调优重点在三个参数:
num.partitions=16:分区数满足并行消费需求。log.retention.hours=24:原始日志保留24小时即可,长期存储交给ClickHouse。compression.type=lz4:LZ4压缩在压缩比和性能之间最平衡。
Flink的参数调优,重点关注Checkpoint间隔和状态后端。我设置了60秒Checkpoint间隔,状态后端用RocksDB,是为了在状态量大的时候保证稳定。任务失败恢复的时间目标控制在2分钟以内。
ClickHouse调优的几条实用经验:
max_threads要根据CPU核数设置,缺省值在某些版本偏保守。- 写入批量要够大,建议每次插入至少10万行,小批量插入严重影响性能。
- MergeTree引擎的
index_granularity保持默认值8192就好,不需要动。 - 常用查询字段建索引,但别建太多索引,ClickHouse索引带来的写放大比读优化更明显。
我实测过一套性能数据:100GB流量元数据,在16核64GB的机器上,简单聚合查询响应时间在200ms以内,复杂查询(比如按用户+应用+小时三维聚合)响应时间在2秒左右。这个性能对校园网场景完全够用。
8. 实施过程中踩过的坑与解决办法
8.1 时间戳时区混乱:半夜数据少一小时的教训
第一次上线时,发现凌晨2点到3点的数据总是偏少。排查很久,最后定位到原因:核心交换机的日志时间用了UTC,认证服务器的时间用了东八区,两边的日志在Kafka里混着,关联计算时部分数据被错误地归到了前一天。
解决办法是在采集入口统一做时区转换:
python复制from datetime import datetime, timedelta, timezone
def normalize_ts(raw_ts, source_tz_offset_hours=8):
if source_tz_offset_hours != 8:
dt = datetime.fromtimestamp(raw_ts, tz=timezone.utc)
dt = dt.astimezone(timezone(timedelta(hours=8)))
return int(dt.timestamp())
return raw_ts
所有日志在进入Kafka之前,把时间戳统一成东八区。这个问题不解决,后续一切按时间窗口的计算都会出错。
8.2 Kafka消费者频繁重平衡导致延迟飙升
上线初期,Flink消费Kafka一直不稳定,消费延迟从几秒飙到几分钟。查看日志发现消费者组在频繁触发重平衡,原因是单个消费者实例处理不过来,心跳超时后被判定为宕机,触发Rebalance。Rebalance期间,整个消费组停止消费,延迟越积越高,形成恶性循环。
解决办法分两步:第一步增加消费者并行度,让每个分区对应一个消费线程;第二步调大心跳超时参数:
yaml复制heartbeat.interval.ms: 6000
session.timeout.ms: 30000
max.poll.interval.ms: 600000
调完参数后,消费延迟稳定在5秒以内。
8.3 ClickHouse副本数据不一致
生产环境的ClickHouse集群用三节点,但某天查询不同节点返回的信息不一致,部分节点的数据明显滞后。
原因有两个:第一,写入时部分请求走了非副本表,导致数据没有同步;第二,某个节点的磁盘空间满了,后台Merge任务一直无法执行。解决办法是清理了磁盘空间,并统一改成Distributed表写入,保证数据按规则分发到所有分片。这里提醒一下,ClickHouse的副本机制依赖于ZooKeeper或ClickHouse Keeper,一定要监控Keeper集群的健康状态,它挂了,副本同步也就停了。
8.4 用户身份关联的盲区
流量日志里的源IP,不一定能在认证日志里找到对应记录。比如用户静态配置了IP绕过认证,或者交换机上挂了打印机、IP电话这些不需要认证的设备。这类盲区会导致用户维度分析有缺失。
解决方案是维护一个“非认证设备白名单”,把打印机的IP/MAC录入系统,流量分析时单独归为“办公设备”类,不参与用户画像计算。同时定期扫描端口,发现疑似私设静态IP的行为,推送提醒给网络管理员。
9. 隐私保护与数据合规
做校园网用户行为分析,最大的红线是隐私合规。学生的上网行为属于敏感数据,必须在系统设计的第一天就考虑合规问题,而不是上线后补做。
我在这个系统里落实了三条原则:
第一,最小化采集。只采集网络层元数据(IP、端口、流量字节数、域名),不采集应用层内容——不抓取HTTP请求体、不解析HTTPS内容、不保存聊天记录和搜索关键词。这一点必须写死,任何功能迭代都不能越界。
第二,数据脱敏。在展示层,用户标识用学号后四位加掩码展示,比如“2023****018”。运维人员查问题时,需要单独申请权限才能看到完整学号和姓名,并且所有查询操作留痕,定期审计。
第三,分级授权。系统用户分三个角色:普通运维(只能看汇总数据和告警)、高级管理员(可以看个人行为画像和明细数据)、审计员(可以看所有操作日志)。权限控制的粒度要细化到“能否查看某用户明细”“能否导出数据”这个级别。
合规这块没有捷径,越早规划越主动。等系统跑起来数据攒了一批,再补合规措施,阻力会大得多。
10. 从项目到方法论:这套系统还能拓展到哪里
这套校园网行为分析系统做完之后,我最大的体会是:技术架构本身并不新鲜,难的是把“用户行为”这个抽象概念,拆成一个个可计算、可落地的特征工程。从数据采集到画像建模,每一步都需要对网络协议和业务场景有足够深入的理解,这种“翻译”能力是系统价值的关键。
数据分群算法、异常检测基线、时段趋势分析这些模块的思路,完全可以迁移到其他场景——企业办公网的终端合规分析、图书馆的电子资源访问统计、智慧校园的物联网设备监测,都是同一套方法论换了一层外衣。如果你在规划类似的系统,不要一上来就追新架构,先把“你要回答什么问题”列清楚,再决定“你需要采集什么数据”,数据结构的设计永远先于技术选型。
这套系统的完整代码和部署文档已经在内部仓库整理好,核心模块包括采集适配器、Flink实时计算任务、ClickHouse建表与ETL脚本、可视化大屏前端,有需要的同行可以私信交流。最后再提醒一句:大屏做得再漂亮,如果数据准确度撑不住,一切都是零。先保证数据质量,再追求展示效果——这是我做完这个项目后,最想对后来者说的一句话。
