做工控安全的这几年我接到最多的现场问题不是网络被攻破而是设备莫名其妙动作了。明明PLC的程序没变、上位机的操作记录里也没有任何异常可现场阀门就是动了一下电机的启停状态被翻转。刚开始排查的人都会怀疑是硬件干扰可抓包一看报文里清清楚楚躺着一条条写线圈指令时间戳却对不上任何一次人工操作。这个问题的元凶大概率就是我今天要和你聊的主角——Modbus协议重放攻击。Modbus协议在工控网络里的普及率不用多说几乎成了设备互联的事实标准。但正因为太普及、太好用它的安全问题才容易被忽略。协议本身设计于上世纪七十年代末彼时的工业总线环境是封闭的、可信的根本没有考虑认证、加密和防重放这些概念。放到今天的互联化工厂里问题就暴露了攻击者不需要破解任何密码只要在网络里录下一段正常的写操作指令在关键时间点重新发给PLC就能实现设备动作的遥控。而且由于协议不承载任何身份信息和时序信息PLC根本分辨不了这条命令是上位机刚发的还是几分钟前被录制后重发的。这篇文章我会把这套攻击链路的原理讲透用Wireshark还原一遍完整的操作过程然后给出我在项目里实际验证过的5种防御方案最后再分享几个抓包分析中容易踩坑的地方。如果你正在做工控网络的安全整改、搞等保测评或者只是维护着一套带Modbus接口的设备这篇文章应该能给你省不少弯路。1. 一次莫名其妙的误动作背后先认清Modbus协议的先天不足1.1 为什么工控网络里全是Modbus要说清楚重放攻击为什么会这么容易生效得先搞清楚Modbus在工控网络里占据的地位。从最早的RS-485串行总线时代到后来随着TCP/IP普及派生出的Modbus TCP这套协议的基本原则一直没变主站发请求从站回响应一问一答简单粗暴。好处是它的实现成本极低。哪怕是一颗几块钱的单片机也能用纯软件的库把Modbus跑起来。我见过不少仪表、传感器、变频器、智能电表出厂固件本身就默认支持Modbus协议不需要额外授权、不需要专门的硬件芯片配置几个寄存器地址就能接入上位机。这种便利性让它挤进了几乎所有的工业控制场景从水处理、楼宇自控到生产线设备你很难找到一套完全不沾Modbus的系统。坏处也恰恰来自这种简单。Modbus在设计时默认链路是安全的所以在协议栈里看不到任何安全机制的影子报文以明文传输没有认证字段没有加密过程连最基本的防重放校验也没有。换句话说任何一个能访问到该网段的人都能伪造主站、下发从站指令或者干脆录下合法指令换个时间再播一遍。攻击者要做的不是破解密码而是找到网络端口。我在某水务项目里排查过一起液位计数据跳变的故障后台显示的液位值突然变成几天前的一个历史值持续了几秒又恢复正常。如果只看SCADA的曲线会以为是仪表故障或者网络抖动但把报文调出来一看问题就清楚了——该液位值对应的读取请求来自一个非法的源地址而且它请求的寄存器地址和轮询周期和正常任务完全不同。这不叫故障叫入侵。1.2 从报文格式看重放攻击的机会窗口要理解重放为什么能在Modbus TCP上轻松得手先把报文拆开看就明白了。Modbus TCP的协议数据单元PDU外面套了一层报文头MBAP结构大致如下事务标识符Transaction ID2字节用于匹配请求和响应由客户端生成。协议标识符Protocol ID2字节固定为0表示Modbus协议。长度字段Length2字节表示后续单元标识符、功能码、数据的字节数。单元标识符Unit ID1字节用于标识连接在串行链路后方的从站设备。功能码Function Code1字节如0x01读线圈、0x03读保持寄存器、0x05写单线圈、0x06写单寄存器、0x10写多寄存器。数据字段DataN字节包含起始地址、寄存器数量或写入值。看到这个结构你再对照一下安全设计的基本要求就能看出几个非常致命的问题。第一整个报文里没有任何时间概念。请求是哪一秒发出的、允许在多长时间内有效协议根本不关心。重放攻击利用的正是这个盲区抓下来的旧报文发出去接收方没有任何手段判断它已经过期。第二没有任何身份概念。虽然MBAP头里有事务标识符但这个标识符不是像令牌或会话ID那样的安全凭证它只是一个用于请求-响应匹配的流水号而且很多实现里干脆就是个从0递增的计数器。攻击者完全可以不管这个字段重放时把事务标识符原样复制从站依然会照单全收。第三所有通信都是明文。字段直接按字节排列没有加密没有消息认证码攻击者在中间随便挂一个抓包点就能把完整报文还原出来。我见过不少做等保整改的用户以为在PLC前面加一个防火墙就万事大吉结果只做三层ACL策略应用层报文照样能被捕获。这里有个很重要的理解重放攻击和篡改攻击是两种不同的威胁模型。篡改是改变报文内容需要攻击者真正理解协议语义难度较高重放则完全不需要理解内容只需要原样复制、按原样发送即可。哪怕攻击者完全不懂寄存器地址的含义他只要录下一条写寄存器报文并在合适的时间原样发回去也能达到同样的控制效果。这一点让重放的破坏力被很多人低估了——它门槛极低但危害一点不小。2. 重放攻击到底是怎么打进去的原理还原与实验复现2.1 重放攻击的技术本质用一个生活中的例子来类比重放攻击可能比直接背定义直观得多。想象一下你的小区门禁支持刷卡进门。一个陌生人没法凭空造出和你相同授权的门禁卡但他如果站在你身后用一个读卡器录下你刷卡时发出的信号回头再拿这个信号去对着门禁播放门照样会开。攻击者利用的不是伪造身份的能力而是身份凭证被重放这个漏洞——门禁系统只验证了凭证本身合法没有验证此刻持卡人是否真的在场。Modbus重放攻击的逻辑完全一致。PLC作为从站只校验功能码寄存器地址数据值是否合法完全不校验这条指令是不是从合法的主站发出来的它在时间上是否新鲜它会不会是被录下来二次播放的。所以攻击流程就简化为三个步骤录制、等待、重放。录制阶段攻击者需要想办法获得一段合法的读写流量。在攻陷了某个接入交换机的终端、或者通过物理方式接入车间网络后用Wireshark抓个几分钟的包就能从轮询流量里找到写指令。等待阶段是选择重放的时机关。比如一条写着闭合1号蓄水池出水阀的报文如果在值班人员离开控制室的时间段重放可能很久都没有人去现场发现异常。重放阶段则是用工具把保存的报文原封不动地发出去可以只发一次也可以循环发直到PLC执行了这条指令。这里还有一个容易被忽略的技术点重放不限于一对一重复发送。攻击者可以在录制到的报文基础上修改数据字段里的寄存器值这就变成了重放篡改的组合攻击。比如录下的是一条把PID设定值改为50的报文攻击者把数值改成0再发PLC同样会接受。因为协议本身没有完整性校验从站无法判断这1个字节是被动过的。2.2 用Wireshark完整走一遍攻击链路动手验证这套攻击并不难。我在实验室里还原过完整的链路一台普通PC装Wireshark做抓包工具一台虚拟PLC或者直接用Modbus模拟从站软件再准备一件能够发送原始TCP报文的工具比如用Python的Scapy库。整个实验不需要真实的工业设备也能跑通对理解原理非常有帮助。先看抓包位置。如果现场网络是走交换机连接最好把笔记本接到交换机的镜像端口Span Port或者用TAP分光器这样能看到所有经过该交换机的流量。如果没有条件做镜像也可以直接串到主站和从站之间的网线上抓。需要说明的是如果只是复现攻击原理把自己电脑接到同一个广播域内就能嗅探到一部分流量不过现在很多交换机默认做了端口隔离工程环境里还是老老实实配镜像端口。抓包过滤器先用这两条把范围缩小tcp.port 502 modbus第一条按端口过滤因为Modbus TCP的标准端口号是502。第二条是协议级过滤器Wireshark能直接解析出Modbus的各个字段。实际抓包时我更习惯用tcp.port 502先看TCP层完整情况具体分析时再叠加modbus过滤器避免一上来就过滤掉握手包导致上下文不完整。正常轮询流量里你能看到大量的读保持寄存器、读输入寄存器请求这些是主站在周期性地扫描从站数据。要找到值得重放的目标需要重点过滤写类操作。Wireshark显示过滤器可以这样写modbus.func_code 0x05 || modbus.func_code 0x06 || modbus.func_code 0x0F || modbus.func_code 0x100x05是写单线圈0x06是写单个寄存器0x0F是写多个线圈0x10是写多个寄存器。凡是出现这四类功能码的报文基本就是真正的控制指令是攻击者最眼馋的攻击目标。右键选中一条写指令的请求报文Wireshark的追踪流 - TCP流功能可以把这次TCP连接上的完整内容按原始序列排出来。这时候你能清楚看到事务标识符、功能码、寄存器起始地址、数据值等字段。如果只是想重放甚至可以不需要理解这些字段的具体含义直接把整条TCP流的内容保存成二进制文件后续原样发送。但我在实操中不推荐单纯保存TCP流的做法因为TCP流里还有Seq、Ack这些传输层状态直接原样重放可能导致TCP栈判定为重复包而丢弃。更稳健的方式是提取出应用层PDU然后在新的TCP连接里重新封装发送。这里我一般用Scapy来构造和重放代码如下from scapy.all import * import time # 从抓包文件里提取第一条写单个寄存器请求 pkts rdpcap(modbus_capture.pcapng) target None for pkt in pkts: if pkt.haslayer(TCP) and pkt[TCP].dport 502: raw bytes(pkt[TCP].payload) if len(raw) 8 and raw[2:4] b\x00\x00: # 协议标识符为0 if raw[7] 0x06: # 功能码0x06写单个寄存器 target raw break if target is None: print(未找到写单寄存器报文) exit() # 循环重放每2秒发一次 for i in range(5): # 注意MBAP头里的事务标识符会每次复用同样的值但TCP层是新的连接 # 构造IP和TCP头目的端口为502 pkt IP(dst192.168.1.10) / TCP(sport40001, dport502, flagsPA) / Raw(target) send(pkt, verbose0) print(f第{i1}次重放完成) time.sleep(2)这段代码里做了一件事把原报文里的事务标识符原样保留了。实际发送时PLC并不会因为事务标识符重复而拒绝因为PLC不回关心这个序号是否重复使用它只关心请求-响应对应关系。如果你在测试中遇到重放后PLC不应答的情况多半不是协议层拒绝而是TCP层面的Seq/Ack被判定为乱序。用新的TCP连接去承载旧的应用层数据就可以绕开这个问题。重放攻击是否生效判断标准很简单观察从站是否返回了响应报文以及线圈/寄存器的实际状态是否改变。在实验里我用一个模拟从站软件跑着出水阀开的状态正常操作把地址0x0001的线圈写成0x00关然后录制报文随后主站一直显示阀门关闭状态此时我把录制到的写入0x01开的报文原样重放从站立刻返回正常响应上位机画面里的阀门状态也就跟着变化了。整个攻击链路成功中间没有经过任何认证。3. 五种可落地的防御方案从设备加固到边界防护搞清楚原理之后接下来的问题就是怎么防。5种方案按部署位置和实施难度排开实际项目里可能需要组合使用没有哪一种方案能单枪匹马解决所有问题。3.1 方案一事务标识符与会话关联校验既然Modbus报文里唯一有点会话感的字段就是事务标识符那能不能把它利用起来做校验思路是在接入层或前置机处维护一张表记录每个合法主站的当前事务标识符以及事务标识符的使用频率。如果网络里出现的事务标识符与表里记录的最新值存在明显跳变或者在短时间内重复出现同一事务标识符就可以判定为可疑。这是一种应用层状态检测的思路优点是不需要改造PLC设备也不需要加密纯软件就能实现。但它有一个绕不开的局限攻击者只要抓几分钟报文就能掌握事务标识符的增长规律自己伪造一个合法的新序号。所以这种方案的防重放能力其实有限更适合做透明观察和粗筛告警而不是作为唯一防线。我在一些改造预算很有限的小项目里会把这个方案定成锦上添花的选项在网关中加一个简单的状态判断请求事务标识符与上一条相差过大时打日志并转发。它防不住高水平的攻击者但能给运维人员提供快速发现异常的时间窗口。真正要防住重放还得靠后面几个方案。3.2 方案二消息认证码与TLS/DTLS加密防护把安全责任交给密码学是治本也治标的正路。Modbus TCP本身不支持加密但可以给它加一层TLS包裹让整个协议跑在加密通道里更进一步可以在应用层增加消息认证码MAC对功能码地址数据时间戳做签名接收方再验签。加TLS之后重放攻击最起码会死在一个环节上攻击者拿不到明文无法录制可用的报文。即使录制到了密文原样重放也会因为会话状态不同、或者TLS会话已经过期而被拒绝。消息认证码的价值则更进一步它让从站或网关能验证消息的来源和完整性任何修改都过不了验签。但工控场景的最大矛盾也在这里很多在职PLC根本不支持TLS硬件算力也不够跑加密运算。遇到这种情况就得在PLC和上位机之间加一个安全网关。网关面向PLC的那侧继续用原生Modbus TCP面向主站/SCADA的那侧则改为安全Modbus如Modbus/TLS或加入了消息认证码的私有封装。我在某产线安全改造项目里就是采用网关方案PLC不动上位机软件更新配置统一走TLS到安全网关网关再透明地把明文翻译给PLC。这样改造对生产逻辑零影响唯一要处理的问题是SCADA调度软件的通信地址要改一层逻辑映射关系。调试那几天现场值班人员紧密盯了一整轮生产周期确认没有出现指令延迟或丢失才正式切换。这种方案在防重放的同时顺带解决了报文被篡改和窃听的问题是目前成熟度较高的做法。3.3 方案三时间戳与单调计数器防重放第四种思路是从新鲜度上卡死重放让每一条应用报文都带有一个不可重复的时间信息。经典实现是在应用层扩展一个字段里面放发送时的UTC时间戳或者单调递增的计数器接收方只接受时间差在允许窗口内或计数器值比上一次大的报文否则丢弃。这个方案的难点不在原理而在落地。原生Modbus协议没有这个时间戳字段你得牺牲掉一个或多个寄存器地址来承载时间信息或者干脆在最外层包一个私有报文头。另一个难点是PLC这些从站设备的时钟普遍不准很多设备断电后还会走偏如果严格按时间窗口校验会导致合法的正常指令被误杀。我在实际项目里更倾向于用单调计数器而非时间戳因为计数器不依赖设备有没有电池后备时钟。具体做法是主站侧维护一个每发一帧就自增1的序列号随报文写到从站的某个保留寄存器里从站或前置网关记忆上一次收到的序列号只接受比它大的序列号。问题来了如果PLC设备本身不支持这种逻辑你没法改它的固件就得靠外置网关来模拟这套计数器。网关从PLC侧读取序号、校验正确性然后向前传递或丢弃。这个方案的工程实现要比TLS简单很多适合没有条件做加密改造的老旧设备但它需要管理的状态量比较多多主站轮询同一从站时还要特别注意冲突。3.4 方案四基于基线的异常行为检测与轮询特征画像如果前面几个方案都是让非法报文无效化这个方案的思路就是让非法行为现原形。本质上不是阻断攻击而是用监控和告警去发现攻击。Modbus通信在正常生产场景下有极其强烈的规律性轮询周期是固定的、请求地址的集合是固定的、每个主站发出报文的速率是固定的、一天24小时的流量曲线甚至都有明显的峰谷。这些规律可以作为基线建下来。然后拿实时流量和基线去比对凡是出现下面这些偏差的就触发告警同一源IP在非轮询时间点突然发出一条写指令请求的寄存器地址范围从未在历史流量里出现过请求频率在短时间内陡增比如正常1秒1次的轮询变成了1秒10次事务标识符出现大量重复报文里明明没带写指令却出现了写功能码等。基线检测的好处是它对已有设备完全透明不需要改造任何控制器缺点是需要一定的算力支撑和策略调优而且只能事后发现做不到事前阻断。我在做这类系统时一般还会配一个联动处置开关一旦判定为异常自动通知交换机关闭端口或者让防火墙下发临时阻断规则减少人工介入的响应延迟。实际部署时有个经验基线一定要按分时段、分任务来做不能只建一条全天平均基线。因为生产班次不同、白天和夜间的轮询逻辑可能完全不同如果你用白天的模型去套夜间流量会误报率高到让人怀疑人生。我第一次做某车间的基线时忘了把夜班手动巡检模式开启导致轮询频率翻倍这个因素考虑进去上线第一天告警平台就刷了上千条误报。后来把基线按时间段拆分、按生产任务拆分误报率才降到可以接受的范围。3.5 方案五网络分区与工业防火墙白名单策略最后这个方案其实就是等保合规里经典的网络架构安全思路攻击者根本不在能碰到PLC通信的网段里重放就没有立足之地。用工业防火墙对车间控制网和生产执行网做严格的区域划分在防火墙上启用规则默认拒绝跨区域的新建连接只放行已知的、合法的Modbus通信路径。工业防火墙的优势在于它是纯外围部署——不需要动PLC、上位机、SCADA应用业务侧几乎是无感的。和通用IT防火墙不同的是工业防火墙能解析Modbus/TCP的应用层内容它的规则可以做得很细。比如允许 12.1.1.10 访问 12.1.1.50功能码 0x03读保持寄存器地址范围 40001-40100周期不超过 500ms 禁止 12.1.1.20 访问 12.1.1.50 的写类功能码0x05、0x06、0x0F、0x10。这样即使攻击者突破了到生产网段的外围防线防火墙也能阻挡他仿冒上位机去下发写指令。从防重放的角度看白名单策略的作用是最小化可重放流量的类型如果网络中压根不允许出现某条写指令那攻击者录下来的写指令报文就没有用武之地重放了也过不了防火墙。不过要提醒的是工业防火墙的规则维护压力不小。生产逻辑一变比如要增加一个新的轮询任务或者新的设备接入就得同步调整策略。有些现场团队怕麻烦用any any或者宽泛放行的方式绕过策略等于把防火墙当成了普通路由器在用安全效果就大打折扣了。我见过不止一个项目防火墙策略是由供应商一次性配好后三年没人再看一眼新加的设备和原策略冲突就偷偷放行了。这类问题要在管理流程上解决安全策略必须和运维变更走同一个流程。五种方案的对比我在项目里通常会向用户做成一张表这里直接放出来供参考方案防护层级对现有设备影响部署难度最适用场景事务标识符校验应用层/接入网关无低小项目、无改造预算的快速加固TLS/消息认证码加密通道层需网关或改主站中高对安全要求高、网络条件较好的系统时间戳/计数器应用层扩展需网关或改主站中老旧PLC设备存量大的场景基线行为检测监测/旁路层无中已有旁路抓包条件、关注异常发现工业防火墙白名单网络边界层无中所有有条件的控制系统首选4. Wireshark分析技巧从看得见到看得懂做这一行排查重放攻击这类问题拳头功夫都在抓包分析上。下面这些技巧不少是踩坑踩出来的先整理几个我常用的过滤器和分析方法。4.1 必须掌握的Modbus过滤器Wireshark对Modbus协议有完整的解析器直接在过滤器栏里写字段名即可。常用的显示过滤器如下modbus # 所有Modbus报文 tcp.port 502 # TCP 502端口流量 modbus.func_code 0x03 # 只显示读保持寄存器请求/响应 modbus.func_code 0x06 || modbus.func_code 0x05 # 显示写单个寄存器/写单线圈 modbus.func_code 0x10 # 显示写多寄存器 modbus.transaction_id 0x0001 # 按事务标识符过滤 modbus.unit_id 10 # 按从站地址过滤 modbus.reference_number 0 # 按寄存器起始地址过滤排查重放问题时我最常用的组合是这个modbus.func_code 0x05 || modbus.func_code 0x06 || modbus.func_code 0x0F || modbus.func_code 0x10先把所有写指令筛出来再一层层看源IP、目的IP、寄存器地址和写入值。写过一两次写操作后你就很容易在流量里看出哪些写指令不属于正常操作。4.2 追踪流与统计视图的高效用法单看单条报文只能看到局部要看全局得用Wireshark的追踪流功能。右键某条Modbus请求选追踪流 - TCP流可以把这个TCP连接上的完整交互过程按发送顺序排出来。对于排查一条写指令重放是否成功重点看响应报文的transaction_id是否与请求一致、响应功能码是否和请求功能码对应。在大量流量分析场景下我一般还会用统计功能快速缩小范围统计 - 对话里按IP地址和端口排序先找出占用流量最多的通信对通常主站和PLC关系一目了然。统计 - 协议分级里查看Modbus流量占总流量比例正常轮询类系统Modbus占比往往极高占比太低反而说明有问题。统计 - IO图表配合过滤器可以看到特定类型Modbus报文的实时速率曲线。发现某条写指令类型周期性脉冲出现这往往就是重放的工具在作怪。有个小技巧一定要说Wireshark的颜色规则可以自定义我建议给写指令设置明显的颜色例如红色这样在实时抓包或滚动浏览时一眼就能从大量轮询流量里挑出控制类指令。路径是视图 - 颜色规则 - 新建过滤表达式用上面说的写类功能码规则即可。4.3 重放特征识别与取证重放流量和正常流量在特征上的差异是可以通过抓包看出来的这也是判断是不是被重放了的关键证据。第一类是事务标识符重复。正常Modbus请求里事务标识符虽然是循环使用的但使用频率基本均匀。如果同一source ip的报文中同一个事务标识符在一秒内反复出现多次特别是连写指令的transaction_id出现快速重复就值得怀疑了。第二类是时间规律异常。正常轮询的请求节奏是机器级稳定的一帧一帧间隔几乎恒定。如果出现一条写指令的请求时间点附近没有任何人工操作事件交接班记录、组态软件打开、维护记录都查不到那它极可能是被重放的。第三类是TCP层特征异常。重放工具构造的报文在TCP头字段上有明显新连接老数据的特征TCP的Seq可能很小、时间戳选项与正常流量有偏差、甚至有的简陋工具连窗口大小都设得和正常的SCADA软件不一致。这类特征需要熟悉正常流量的TCP参数才能比对出来。取证方面我的建议是一旦怀疑重放攻击立即做以下操作把证据固定住——连续保存至少10分钟、覆盖攻击时间段的pcapng文件同时截图关键报文的每一层字段记录本机时间与NTP的时间偏移。攻击时间要能被复现和追溯才是能支撑安全事件的证据。千万不要在排查过程中反复开关抓包把最早的那一段丢掉了。5. 常见问题与排查实录5.1 合法读操作和重放请求怎么区分这是我在培训现场被问得最多的问题。重放报文的内容可能和正常报文一摸一样那技术人员凭什么判断哪条是原版哪条是翻版答案主要靠两个维度时间维度和上下文维度。时间维度看的是它出现的时机比如正常操作每天早上8点交接班时进行那8点前后出现一条写指令是合理的而凌晨2点在无自动任务计划表的情况下出现同一条写指令就要高度警惕。上下文维度看的是请求的邻居正常的主站发完一条写指令之后通常紧接着会发一轮读操作来确认状态而重放工具往往只会孤立地发送录制到的单条报文前后没有读确认过程。把这两个维度结合起来看误判率能低很多。5.2 加TLS后PLC拒绝连接的坑我去某实验室做TLS改造测试时遇到过改造后PLC一直拒绝连接的情况。排查了半天才发现问题不在TLS握手而在本地端口被防火墙默认拦掉了。很多现场网络里PLC和上位机通信走的端口是502但TLS包装后要么继续用502、要么用了8443等其它端口而接入交换机和终端防火墙默认只开了502。这个坑提醒我在做加密改造前先把端口放行策略梳理清楚不要等到现场才来现查。另一个常见坑是老模块的软件里硬编码了目的端口502你在网关层面把TLS端口改成了其它值主站根本不知道怎么连。遇到这种情况我建议网关的对外端口仍然保持502TLS握手在这个端口上完成。等于说监听502端口的软件以前收明文现在收TLS密文上层应用无感。5.3 多点部署时的时钟漂移与会话状态维护如果用了时间戳方案最头疼的就是多个主机、多个网关之间的时钟一致性。某次我在现场部署了三台前置机做冗余结果其中一台的时钟慢了两分钟导致从这台前置机发出的写指令经常被网关当成超时报文丢弃。这个问题很隐蔽生产线时好时坏查了很久才通过对比日志发现是三台机器的时钟漂移量不一致造成的。我的经验是所有参与Modbus通信的网关和主站必须统一接入NTP服务并且每天记录一次各节点时钟偏差值。时钟跳变超过1秒就要告警。注意某些工控现场的硬件防火墙会阻断NTP的UDP 123端口一定要提前确认NTP链路畅通。如果实在没有条件搭NTP宁可选择单调计数器方案也不要硬撑着用时间戳。最后再分享一个小技巧。在排查任何Modbus异常之前先在自己的笔记本上把Wireshark打开建立一条干净的基线采样从早上正式开工之后抓10到20分钟正常流量保存为baseline.pcapng。日后所有可疑流量都和这个基线去对比。有了这份基线判断哪条报文不正常就会快很多排查效率能提升一大截——这是我做了几年工控安全绕了不少弯路后觉得最值得养成的一个习惯。