资讯详情

资讯详情

从运维到安全:网络通信模式与抓包分析实战指南

说个有意思的事。我离开运维行业整整十年前阵子又重新杀回了网络安全这个圈子。入职第一周领导丢给我一份抓包文件让我分析某台服务器为什么半夜对外发起大量异常连接。我看着Wireshark里那些花花绿绿的TCP流脑子里闪过的全是当年在机房撸网线、配VLAN、排查交换机环路的日子——网络通信模式这件事说白了就是网络的“底层语法”不管你是做运维还是做安全不懂这套语法后面全是空中楼阁。这篇“之二”我就想聊聊这次回归后我对网络通信模式的全新理解。做运维那会儿我看网络通信模式核心诉求是“通不通”只要ping通、端口通、业务不卡就万事大吉。但做安全再看同一套协议栈视角完全变了——我不光要关心数据能不能送到还要关心它“正不正常、有没有夹带私货、有没有人试图伪装或劫持”。这篇文章适合三种人一是刚从运维转安全的老哥们二是刚入门网络安全想打好地基的新手三是在甲方做基础防护但总觉得“差点意思”的工程师。我会把我在实操中重新梳理过的网络通信知识点配合抓包案例和检测思路尽量用大白话讲透。1. 视角切换从“通不通”到“正不正常”——运维老兵的安全转型第一课1.1 运维思维与安全思维的底层差异先聊点形而上的。运维和安全虽然天天跟同一张网打交道但看待网络通信模式的角度有着本质区别。运维的工作模型我用一句话概括保证可用性。链路通了、带宽够用、路由没环、延迟正常这就是好网络。你遇到问题时的惯用三板斧是ping、telnet、tracert判断标准很直接——通就是通不通就是不通。安全的工作模型则完全不同保证可信性。同样一段TCP流量运维看到的是“三次握手成功连接建立”安全看到的却是“这个握手频率异常可能是端口扫描”“SYN包源地址可疑可能被伪造了”。再举个更直白的例子一条DNS请求运维关心的是“域名能不能解析出来”安全关心的是“这条DNS查询的域名是不是一个恶意远控的C2地址”“查询长度为什么有60多个字节是不是在搞DNS隧道”。这个视角切换说起来简单做起来别扭。我刚开始看抓包文件的时候职业习惯作祟满脑子都是“这流量走的哪条链路为什么延迟这么高”根本没法从安全维度去拆解。后来我自己想了个办法把问题从“通不通”改成三个新的判断维度是否符合预期这个IP在这个时间点跟这些IP建立连接是否合理。是否符合协议规范包的标志位、长度、序列号是否有违背RFC的异常。是否有隐藏数据看似正常的通信内容里有没有夹带不属于业务的数据。这三句话基本就是后来我做所有流量分析、规则编写、告警研判的底层心法。1.2 为什么网络通信模式是安全工作的地基很多人转安全一上来就想学漏洞利用、学POC、学渗透测试觉得那才叫“黑客技术”。我的看法是如果网络通信模式这块地基不牢后面走得越远越容易踩坑。举个真实场景你拿到一个恶意流量样本想分析它跟C2服务器通信的规律如果你不懂TCP重传机制、不懂TLS握手过程、不懂HTTP/2的帧格式你连它在干什么都看不懂更别提写规则去检测同类攻击。再举个例子内网横向移动中最经典的攻击手法之一就是利用SMB协议如果你只看日志文件而不会结合网络通信模式去还原攻击链——某个内网IP先对其他IP发起445端口扫描然后再尝试用Psexec建立IPC连接——你根本不知道该在哪个环节做阻断。所以我说网络通信模式是安全行业的地基工程它决定了你的分析能力和检测能力的天花板。为了让大家更直观地理解这种“视角切换”我列个表对比一下同一个协议行为在运维和安全两个视角下的解读网络行为运维视角解读安全视角解读某个IP持续大量SYN请求可能是有大流量业务接入需扩容可能是SYN Flood攻击源地址疑似伪造某个主机频繁ARP广播可能是新设备接入正常可能是ARP扫描有人在探测内网活跃主机DNS查询一个陌生域名只要解析正常就忽略可能是DNS隧道外传数据或访问恶意域名一个TCP连接占用很长时间可能是长连接业务特性可能是C2通道心跳等待指令下发ICMP回显请求大量出现网络连通性测试正常可能是ICMP隧道或内网探测行为看清这张表的区别你就明白为什么我反复强调干网络安全不能停留在“网络通不通”的层面而是要在“为什么通”“这样通合不合理”“通的过程中有没有夹带”这些维度上多问几个为什么。2. 五层模型里的安全攻防点数据从网线到应用的旅程我们平时说的网络通信模式抽象到最后就是TCP/IP协议栈的层次化协作。做运维时你只需要会用命令去查每一层的状态做安全则需要清楚每一层具体存在哪些攻击点和检测点。这一节我按五层模型从下往上拆一遍每一层讲一个最常见的攻击手法、怎么看穿它、以及用什么思路去防御。2.1 物理层与数据链路层ARP欺骗与交换机的“信任危机”大多数人做安全目光都习惯往上走直接看TCP和HTTP却忽略了最底层的两层。但真实攻击中最容易得手、最难被发现的恰恰是数据链路层。这里必须重点讲ARP欺骗。ARP协议的设计初衷很单纯已知目标IP询问对应的MAC地址。但它没有任何认证机制谁回答都信这就给了攻击者一个天然的伪造窗口。攻击者只要在内网发送伪造的ARP响应声称“我是网关”受害主机的ARP缓存表就会被篡改之后所有的出网流量都会先经过攻击者这台机器。这相当于你寄快递结果快递员被掉包了你以为寄给了A公司实际上包裹先被拆开看了一遍再转寄。更难受的是从应用层看一切正常网页照样打开业务照样跑只不过你所有的明文账号密码都在攻击者眼皮底下过了一遍。当时代运维的时候我处理过ARP欺骗引发的“全网掉线”故障当时的做法简单粗暴——绑定IP和MAC。现在做安全思路要深一层绑定只能防外来的ARP欺骗如果攻击者已经控制了一台内网主机他照样可以以“合法身份”发送ARP包。所以更有效的检测思路是在交换机上配置DHCP Snooping和动态ARP检查同时用流量分析工具监控同一时间窗口内ARP响应包的数量和来源——正常网络里ARP响应不会像下暴雨一样频繁。2.2 网络层协议IP分片、ICMP隧道与路由安全再看网络层。这一层的主角是IP协议和ICMP协议攻击手法主要集中在两个方面分片滥用和隧道。IP分片本身是为了解决MTU限制但攻击者会故意构造畸形的分片包比如重叠分片Teardrop攻击、极小分片来触发目标系统协议栈的解析漏洞。检测这类攻击的关键在于对分片标志和偏移量的监控正常的业务流量很少出现大量连续的分片包更不会出现分片偏移重叠这类违背协议设计意图的情况。ICMP隧道则是另一类隐蔽性极强的通信方式。ICMP协议本来是为了传递网络诊断信息像ping发出的回显请求和回显应答一般防火墙和IDS都不会拦。攻击者正是看中了这点把数据隐藏在ICMP包的Data字段里用最不起眼的ping流量跟外部C2服务器通信。我在实际分析中见过一个案例某台服务器每隔一定时间就对外ping一个固定IP单看每条包都没有问题但把数据段提取出来拼接后里面是一段被编码过的指令序列。要发现这类隧道单靠安全设备的基础规则远远不够。我建议的做法是关注ICMP流量的“三高”—高频率、高字节数、高规律性。正常的ping流量每秒不会超过几条每条数据字节基本固定且很短如果看到ICMP包的数据段长度超过100字节、且间隔时间异常规律十有八九是在搞隧道。2.3 传输层TCP握手异常与端口扫描特征到了传输层事情变得更加复杂因为TCP协议的状态机本身就是攻击面的重灾区。SYN Flood我在第四节会详细演示这里先讲一个新手最容易忽视的检测点端口扫描的流量模式。一个攻击者在发起真正攻击之前一定会做信息收集而端口扫描就是最基础的动作。我举个例子全连接扫描TCP Connect扫描会在短时间内对目标主机的多个端口发起完整的TCP三次握手这在流量特征上表现为短时间内一个源IP对同一个目标IP发起大量SYN包目标IP回应SYN-ACK后源IP立刻回应ACK完成连接然后马上RST断开。这种模式在正常业务中几乎不会出现——正常的客户端访问服务器连接建立后会持续一段时间发送业务数据而不是建立后马上断开。检测思路很简单统计单位时间比如1分钟内同一个源IP对同一个目标IP新建的TCP连接数如果数值超过正常基线的5倍以上大概率是扫描行为。还有个细节如果SYN包的目标端口连续递增那几乎可以断定是扫描器在按端口顺序探测。我自己写规则时会在流量分析平台上做这样一个逻辑源IP、目标IP、目标端口三个维度聚合连接建立后500毫秒内发生RST的比例超过一定阈值就告警。2.4 应用层DNS隧道与HTTP隐蔽信道到了顶部的应用层攻击手法就更加“花哨”了因为应用层协议种类多、业务流量复杂恶意行为藏在正常行为里极难分辨。这里我挑两个典型DNS隧道和HTTP隐蔽信道。DNS隧道是把数据编码后放到DNS查询的域名部分例如xxx.malicious-domain.com里的xxx部分本质上就是一个编码过的数据块。传统防火墙不检查DNS载荷内容所以这种方式极其隐蔽。检测DNS隧道的思路有三个一是域名长度正常的域名查询很少超过30个字符隧道域名通常会拼接大量编码字符导致长度骤增二是查询频率隧道通信为了维持速率会以极快的频率发起解析请求三是DNS服务器类型隧道一般使用TXT、MX这类包含数据载荷的记录类型而不是普通的A记录。HTTP隐蔽信道就更防不胜防了因为它伪装成最普通的Web请求。比如攻击者控制了一台服务器通过HTTP POST请求往一个看似正常的URL上传数据请求头带的是标准User-Agent请求体是加密后的二进制从流量上看起来就是一个普通用户在提交表单而已。我处理过类似的事件最后是通过流量回溯发现该URL在短时间内出现了“请求体字节数明显大于响应体”的异常比例且请求频率跟正常用户分布显著不同才顺势揪出了隐蔽信道。3. 抓包分析实战从零还原一次完整的攻击通信过程讲完了各层攻击点可能大家还是觉得理论偏多。这节我把袖子撸起来带大家完整走一遍抓包分析攻击通信的实操流程。我会用一台虚拟的靶机环境和一个模拟的SYN Flood攻击作为案例手把手拆解整个过程。3.1 环境准备用tcpdump和Wireshark搭一个临时“显微镜”工欲善其事必先利其器。我做流量分析最常用的两把刷子就是tcpdump和Wireshark前者适合在服务器上快速抓包后者适合在本地做深度拆解。搭建一个临时的流量分析环境不需要什么高配机器一台普通的Linux服务器加一台能跑Wireshark的电脑就足够了。抓包前有个关键动作确认网卡是否支持混杂模式以及抓包位置是否合理。如果目标是分析攻击流量抓包点一定要部署在流量必经之路上比如核心交换机的镜像端口如果只是想分析某台服务器的进出流量直接在该服务器上抓包就可以。我常用的抓包命令是这样的tcpdump -i eth0 -s 0 -w /tmp/attack_traffic.pcap host 192.168.1.100解释一下参数含义-i eth0指定网卡-s 0表示抓取完整数据包不截断-w指定保存文件路径host后面跟目标IP做过滤。实际抓包之前我建议先用tcpdump -D列出所有可用网卡确认你想抓的那块网卡的名称避免抓错接口导致白忙一场。另外抓包文件会迅速膨胀一台中等流量的服务器抓五分钟就可能产生几个GB的文件所以建议再加一个-c参数限制抓包数量或者用-G和-W参数做文件轮转。3.2 分步还原SYN Flood如何把一台服务器打到“假死”抓包文件拿到手之后真正的分析工作才开始。假设我抓到了一个典型的SYN Flood攻击流量我会按照下面几个步骤逐步还原整个攻击通信过程。第一步先看流量概况。用Wireshark打开pcap文件选择“统计”菜单里的“流量图”或者直接用capinfos命令看文件的基本信息。重点关注总包数、总字节数、时间跨度、每秒包数。如果看到每秒包数达到数万甚至数十万而正常业务只有几百那已经可以初步判定这是异常流量了。第二步过滤出可疑的TCP握手包。在Wireshark的过滤栏输入tcp.flags.syn 1 tcp.flags.ack 0只看纯SYN包。正常网络里纯SYN包占比很低如果看到大量的纯SYN包、且源IP非常杂乱基本可以断定是伪造源地址的SYN Flood。我见过一个极端案例一分钟内收到超过15000个不同源IP的SYN包目标端口是一个不需要对外提供服务的内部端口。攻击目标显然不是在尝试连接服务而是纯粹要把服务器的半连接队列打满。第三步查看服务器的响应状态。过滤tcp.flags.syn 1 tcp.flags.ack 1查看SYN-ACK包如果发现服务器发出了SYN-ACK但没有后续的ACK响应说明攻击者根本没有完成握手服务器资源的半连接在不断增加。这就是SYN Flood攻击的原理利用TCP三次握手的漏洞让服务器一直等待永远不会到达的ACK包最终导致半连接队列满载正常的用户请求再也无法建立连接。第四步定位攻击源。虽然大多数SYN Flood会伪造源IP但如果攻击者忘了伪造或者伪造方式有规律我们可以直接用Wireshark的“统计”-“端点”功能按IPv4地址排序查看每个IP的包数和字节数。绝大多数时候你会看到攻击流量来自少量固定的IP但源IP分布呈现出明显的随机性这就是伪造IP的特征。整个分析做完你会对攻击的通信模式有一个非常立体化的认知它不是在发送正常业务数据而是在系统性地利用TCP协议机制的弱点制造大量永不完成的握手。3.3 流量基线的建立方法先认识“正常”才能判断“异常”上面那套分析做完只是了解了单次攻击的特征。但要真正把检测能力沉淀下来必须做一件更重要的事建立网络流量基线。这就好比你要在人群里识别小偷必须先知道正常人是怎么走路的。流量基线就是正常业务的“走路姿态”。我建议从四个维度来建立基线流量速率基线、连接数基线、协议分布基线、访问关系基线。流量速率基线解决“今天是不是特别慢”的问题连接数基线解决“是不是有人在疯狂建连”的问题协议分布基线解决“是不是突然出现了奇怪协议”的问题访问关系基线解决“这台服务器从来不出外网怎么就突然对外发起了HTTPS请求”的问题。建基线有一个经验至少要采集两周以上的数据并且要包含业务波峰波谷的完整周期。只抓一天的数据就定基线十有八九不准。比如很多业务系统在每月月底有集中出账或者结算流量会突然飙升如果不把这种周期性波动纳入基线月底那几天告警会多到让你怀疑人生。我在实际项目中还习惯把基线按“小时级”做切片——周五下午三点的流量跟周一凌晨三点的流量正常状态下的形态完全不同用一个全局平均值去套必然误报率爆表。4. 安全监测的落地实操从通信模式提炼检测规则学会看流量还不够最终目标是要把“人工分析”变成“自动检测”。这节我演示两个从通信模式提炼检测规则的实例一个是基于统计异常的DNS隧道检测思路一个是基于协议特征的HTTP隧道检测规则供大家直接抄作业。4.1 以DNS为例设计一个简单的异常检测思路前面讲过DNS隧道最核心的特征是域名长度异常、查询频率异常、记录类型异常。把这三个特征编码成一个检测逻辑就是一条可落地的检测规则。我给出了一个简单的思路第一步提取每一条DNS查询报文中的查询域名并计算域名总长度不含根域。第二步判断域名长度是否大于30字节如果是则进入异常候选列表。第三步统计每个域名的查询次数如果某个域名的查询频率明显高于正常DNS查询的频率且高频率持续了一段时间则标记异常。第四步检查查询类型如果大量的查询类型是TXT、MX这类非常规记录类型且这些记录类型与域名特征叠加则直接告警。这套检测思路我建议直接用Python写个小脚本挂到流量采集节点上周期运行。脚本只需要用到scapy这类发包解析库逻辑不复杂效果却很直观。我实战中遇到过很多隧道样本触发告警的基本都是因为“域名长度异常”这个特征因为正常业务域名没人会起几十个字符的子域——那既难记又浪费带宽。4.2 用Zeek编写一条针对HTTP隧道的检测规则如果说DNS隧道还有比较明显的长度特征可抓HTTP隧道的检测就更加考验协议解析能力了。我推荐用Zeek来实现它是一个开源的网络流量分析框架能够自动解析各种应用层协议并提供一套脚本语言来写检测逻辑。下面我演示一个最简单的HTTP隧道检测脚本框架module HTTPTunnelDetect; export { redef enum Log::ID { LOG }; global threshold: count 5 redef; } event http_request(c: connection, method: string, original_uri: string, unescaped_uri: string, version: string) { local req_len |c$http$request_body_len|; local resp_len c$http$response_body_len; if (req_len 1024 resp_len 10) { Log::write(HTTPTunnelDetect::LOG, [ $ts network_time(), $uid c$uid, $src_ip c$id$orig_h, $dst_ip c$id$resp_h, $uri original_uri ]); } } event zeek_init() { Log::create_stream(HTTPTunnelDetect::LOG, [$columns Info, $path http_tunnel]); }这条规则的核心思路是检测请求体极大、响应体极小的HTTP请求组合。因为这符合数据外传特征——攻击者把数据打包到POST请求里发给C2服务器服务器一般只需要回复一个极小的确认码。当然真实的生产环境里这条规则需要调整阈值以适配正常业务比如文件上传功能天然就是大请求体但响应体不可能只有几十字节所以把阈值设在1KB和10字节是一个相对稳妥的起步值。用Zeek的好处是它已经是成熟的开源工具部署在旁路镜像口后能自动解析HTTP、DNS、TLS等几十种协议你不用再费劲自己写协议解析器只要专心写检测逻辑就行。这是“站在巨人肩膀上干活”的典型例子。4.3 流量采集部署的坑镜像口、抓包丢包与存储规划规则写得再好如果流量采集环节出了问题等于白干。部署流量采集时我踩过不少坑总结几个最关键的经验。第一个坑是镜像口的带宽瓶颈。交换机的镜像口会把所有被镜像端口的流量复制一份发送到分析设备如果镜像口本身的带宽小于多个源口的总流量必然发生丢包。比如你把一个40GE的端口组镜像到一个10GE的出口高峰期流量直接被打满抓到的包缺胳膊少腿分析出来的结论自然不完整。我的建议是做镜像之前先统计一下源端口的峰值流量再决定镜像口的带宽配置必要时把流量分流到多个分析设备处理。第二个坑是抓包软件的参数配置不当导致丢包。tcpdump默认会申请一个环形缓冲区如果缓冲区太小流量一大就会丢包。我习惯在抓包前先用sysctl调整内核网络缓冲区大小使用如下命令sysctl -w net.core.rmem_max67108864 sysctl -w net.core.netdev_max_backlog10000然后把tcpdump的缓冲区参数加大用-B 4096参数指定4MB缓冲。别小看这个操作同样环境下调整前后抓包丢包率可以从30%降到几乎为零。第三个坑是存储空间的“隐形杀手”。很多人以为抓包文件压缩一下就没事但持续抓包半小时文件就可能超过几十GB而一个安全运营中心往往需要保存至少90天的流量日志。我给出的解决思路是分层存储最近的7天保留全量原始抓包文件用于深度分析7天到30天只保留关键元数据和告警相关的pcap子集30天以上只保留统计摘要。这本质上是在可追溯性和存储成本之间做平衡没有绝对正确只有适合自己业务的取舍。5. 十年运维经验在新岗位上的“复用清单”写到这里我特别想聊一个切身体会离开运维行业十年后重返安全哪些老本是能直接拿来用的哪些反而要主动丢掉。5.1 哪些老本行直接能打首先Linux系统操作功底是最大的一块优势。做安全分析你总要在各种Linux环境下跑分析工具写脚本处理日志配置抓包环境这些对前运维来说就是家常便饭。我碰见过不少纯安全出身的人写得出漂亮的检测规则但一上手Linux就抓瞎——文件权限搞不明白、系统日志不知道去哪看、遇到服务起不来只会重启。这种差距短期内根本补不上。其次网络排障的直觉非常值钱。以前排查网络故障时练出来的分层排查法——从物理层到应用层一层一层过——放到安全分析里依然非常有效。遇到一个可疑流量事件我先看数据链路层有没有异常ARP再看网络层有没有异常路由然后是传输层有没有握手异常最后才是应用层的内容分析。这套排查路径已经是肌肉记忆了帮我省了大量的时间。最后对业务系统的熟悉程度是新人难以复制的财富。我知道一个正常的业务系统在什么时间点会产生什么样的流量哪个区域的服务器之间应该有访问关系哪些端口是业务必须开放的。这种“业务感知”在做安全基线建设时太重要了因为你对“正常”的定义越精准对“异常”的判断就越锋利。5.2 哪些习惯反而要改掉虽然有很多复用优势但我也必须坦白讲有些运维时代的思维惯性在安全岗位上反而会成为障碍。最大的思维方式坑是“总是想修好它”。运维遇到故障的第一反应是排除故障、恢复业务这是一件以“可用性”为第一目标的事情。但安全分析遇到可疑事件时我不能立刻去做“修复”必须先完整保留证据分析攻击路径评估影响范围再考虑处置。如果把安全事件当普通故障来“顺手修掉”轻则这警报哑了你永远不知道攻击者到底干了什么重则你在恢复操作中破坏了关键证据整个溯源链条直接断掉。这个“先保留证据再动手”的习惯我是花了好几个月才真正养成的。另外一个要改掉的习惯是“信任内网”。做运维那会儿默认内网是相对可信的区段主要防护都集中在边界上。但在今天的攻防形势下内网失陷几乎成了常态——钓鱼邮件、恶意宏文档、USB摆渡、供应链投毒攻击者有一百种方式进入你的内网。如果还抱着“内网流量不用太较真”的旧观念那你整个内网的安全监控就是聋子的耳朵。现在我看任何内网流量默认都是不可信的都要基于流量特征和行为基线去验证它的合理性。6. 常见问题速查表与避坑心得6.1 新手最常见的五个疑问这块我把平时被问得最多的问题整理成一个速查表方便读者遇到类似问题时快速自查问题原因排查思路抓包文件太大打不开文件超过内存或Wireshark处理上限用editcap按时间切片分段处理或启动时仅加载部分包抓到的流量跟业务不符抓包位置不对或过滤器写错确认网卡混杂模式核对过滤器语法先用简单过滤验证Wireshark显示TCP Out-of-Order链路延迟或负载均衡导致乱序多数是正常现象重点看乱序比例若异常升高再往下查检测规则误报率高得离谱阈值不适应业务基线先花两三周建基线再做阈值校准不要拍脑袋定参数告警风暴导致没人看告警规则太多且互相重叠按风险优先级给规则分级高优规则数量控制在20条以内6.2 我踩过的三个坑最后毫无保留地分享三个我实际踩过的坑算是给新人的一份“避雷地图”吧。第一个坑是在不恰当的抓包位置部署了流量分析探针。当时为了图省事在一个汇聚交换机的上联口配置了端口镜像结果发现只能看到跨网段的流量同网段内部通信完全看不见。原因是同网段内通信流量只在接入交换机内部交换根本不会上到汇聚层。这个坑直接导致我们在很长一段时间里对内网横向攻击“选择性失明”。第二个坑是刻舟求剑式地套用网上公开的检测规则。从网上找到一个Zeek规则觉得不错就部署上线结果生产环境里大量业务被误报淹没。后来仔细分析才发现那条规则是在特定业务的假设条件下写的而我这边业务的正常请求体本身就很大直接触发了规则条件。从此我养成了一个习惯任何外部规则都要先用自己的流量基线去验证调优再正式上线。第三个坑是忽略了对流量的“上下文”分析。有一段时间我发现某个外联IP频繁告警就盯着这个IP猛查结论是“疑似恶意通信”。后来把日志和流量上下文串起来一看才发现那是某个软件更新服务的下载服务器IP刚好与威胁情报库里的一个条目重合。这类“误伤”告诉我流量分析必须结合资产信息、业务上下文和日志证据做综合研判孤立的IP信誉值只是最浅层的参考绝不能作为定案依据。回到开头那个话题离开运维行业十年再回网络安全我最深的体会是网络通信模式这层地基无论在哪个时代都是硬通货。变化的只是你要从流量里读出什么、防范什么、响应什么。把每一层协议的脾气摸透把抓包分析的基本功练扎实把思维方式从“通不通”切换到“正不正常”你会发现安全这条路虽然刚开始有点陡但越走越通透。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →