ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

重学网络通信模式:从TCP状态机到流量分析的安全视角

重学网络通信模式:从TCP状态机到流量分析的安全视角 离开运维行业十年重新回到网络安全这条线我给自己定的第一项功课就是把“网络通信模式”从头捡起来。这是这个系列的第二篇我想认真聊聊这一块。不是因为协议栈有多高深而是因为所有攻击手法、所有防御策略、所有流量分析工具最后都要落在通信模式这个底子上——数据怎么封装、连接怎么建立、状态怎么流转、流量长什么样。搞不清这些后续看日志、查威胁、做溯源全都会踩空。这篇内容我会尽量写得像坐在机房里聊天的感觉有基础解释也有实际坑点。适合几类人看一类是和我一样从运维转安全的老兵需要把旧知识重新映射到安全视角一类是刚入行的安全新人想找一个能落地的工作流还有一类是想给团队做培训的负责人可以直接拿里面的案例和排查思路做参考。1. 为什么回来第一件事是重学网络通信模式1.1 十年前的经验哪些还能复用哪些已经过时先说结论底层的通信原理几乎没变变的是承载它的环境。我十年前做运维的时候管的是物理服务器加交换机拓扑图是画在纸上的一根网线对应一个端口出了问题直接去机房看指示灯。那会儿我最熟的是路由交换、VLAN、ACL、链路聚合再加一套iptables规则。当时觉得这些知识很“硬”走到哪儿都能吃饭。这次回来一看环境变了公有云VPC、容器网络、微服务、Service Mesh、零信任甚至很多业务跑在K8s里连“网络到底在哪一层”都要重新理一遍。刚开始我是有点慌的因为命令行还是那些命令行但网络通信的形态已经抽象了好几层。不过真正上手之后发现底层的TCP/IP协议栈、三次握手、滑动窗口、DNS解析流程、HTTP请求响应模型这些全都没变。云上的VPC再复杂本质还是IP子网加路由表加ACL容器的Overlay网络再花哨本质还是封装和隧道。也就是说旧知识没有废只是需要套上一层新环境的外壳重新理解。所以我的建议很直接如果你也是隔了很多年想重归这行别急着刷工具先花一周把网络通信模式的核心重新过一遍比什么都有用。1.2 运维视角和安全视角的差异做运维的时候我看网络通信关心三件事通不通、快不快、丢不丢包。只要链路是通的Web服务器返回200数据库连接池正常这一天就算平安过去了。但安全视角完全不是这么看。同样一段流量运维看到的是“连接成功”安全看到的是“这个连接为什么在凌晨三点出现”“源IP为什么绕过正常路径直连数据库”“这个HTTP请求的Payload里为什么出现了命令执行的特征”。换句话说运维关注通信本身是否正常安全关注通信背后是否藏着人眼看不见的行为。这个差异决定了看问题的粒度。我以前排查一道网络故障抓到SYN重传就基本定位了现在做安全分析同一段SYN重传可能意味着扫描探测也可能是某台内网主机被控制后在外连。抓包命令还是那几条但读流量时的脑子得换一套。所以这次重学网络通信模式我不光在看协议是在重新训练自己“用怀疑的眼光看一段正常通信”的能力这是运维出身的人转安全最需要跨过去的一道坎。2. 网络通信模式的底核分层封装与TCP状态机2.1 分层模型的本质和排障时的分层思维OSI七层模型和TCP/IP四层模型这是我当年背得滚瓜烂熟的东西。先说个现实实际工作中没人天天念叨七层大家挂在嘴边的往往是“三层通不通”“四层端口通不通”“七层应用有没有问题”但这个分层思想本身极其重要因为它给了我们一套定位问题的顺序。举个生活化的类比网络发包就像寄快递。应用层是“我要寄什么”比如一个网页请求传输层是“快递单号”端口和会话信息网络层是“收件地址”IP路由链路层是“快递车在路上跑的物理规则”MAC、以太网帧。每一层只关心自己的事上一层的数据包到下一层会被重新包一层壳这叫封装接收方再一层层拆开叫解封装。排障时我就是按这个顺序一层层剥的。先ping看三层通不通通了再看端口用telnet或nc测四层端口通了但业务报错就抓包看七层协议。安全分析也一样链路层看是否有人伪造MAC地址搞欺骗网络层看扫描和伪造源IP的痕迹传输层看端口扫描和洪水攻击应用层看Payload里的漏洞利用特征。分层不是考试题是排障和安全分析共用的地图。2.2 TCP状态机里藏着的攻击线索TCP最核心的东西是状态机。三次握手建立连接四次挥手断开连接中间还有数据传输和流量控制。以前做运维时我花了很多时间调TIME_WAIT和CLOSE_WAIT因为这两种状态堆积会导致端口耗尽、连接超时是经典的高并发故障。但回到安全行业再看状态机我发现了以前没想过的用法攻击行为在状态机上是有指纹的。先看握手。正常三次握手是SYN、SYN-ACK、ACK一来一回非常干脆。但SYN Flood攻击就是只发SYN不发ACK让服务器一直维持半连接把半连接队列堵满。你用netstat或ss查的时候会看到一大堆SYN_RECV状态堆积这就是典型攻击信号。再看出端口扫描的形态差异。全连接扫描会完整走完三次握手留下正常的连接记录然后断开SYN扫描只发SYN拿到SYN-ACK就立刻RST不建立完整连接FIN扫描就发一个FIN包试你的响应。这些在抓包里都有非常明显的特征安全分析工具也是靠这些特征去识别扫描行为。还有CLOSE_WAIT。运维视角这通常是程序没关连接导致的bug但安全视角下某些后门程序会故意维持一条看起来“异常长”的连接或者大量连接卡在某些状态等待指令这种异常状态同样值得警惕。说白了TCP状态机不仅管连接生命周期也是安全检测的重要数据源。3. 应用层通信模式HTTP、TLS与加密流量的观测3.1 HTTP通信模式的正常与异常HTTP是目前应用层通信模式里出现频率最高的协议。它的基本模型是请求-响应客户端发一条请求服务器回一条响应。请求里有方法、路径、协议版本、Headers和Body响应里有状态码、Headers和Body。做安全分析这套模型里到处是可以提取的特征。先说方法。GET和POST是最常见的但一个正常业务系统里如果出现大量PUT、DELETE请求或者对敏感接口频繁调用就值得怀疑了。再说路径。正常访问的路径是设计好的比如/api/login、/assets/index.js。但Webshell为通信方便路径往往带一些怪异的编码字符、长串参数、或者直接放在静态资源后面。安全平台上最常见的告警之一就是“可疑脚本访问”本质上就是在抓这种异常路径。Headers是一个特别有价值的信息源。User-Agent正常浏览器会带完整的UA但很多自动化工具、扫描器、后门程序的UA要么是空泛的要么是明显编造的。我见过不少攻击流量里头的UA直接是python-requests或者curl一眼假但依然有人不换。Cookie和Referer同理攻击者的请求往往缺少正常用户才会产生的关联性。状态码也要会读。以前我做运维只看200、404、500现在还要看200是不是真的正常。有些Webshell交互会返回200但Body里的内容长度异常有些目录扫描会返回大量403和404有些命令注入的判定要靠响应时间的抖动来侧写。所以HTTP通信模式这块我的结论是要学会识别“看起来不像正常用户会做出来的HTTP行为”才算真正入门。3.2 HTTPS/TLS时代的安全盲区现在的网络流量加密的比例越来越高。TLS握手发生在应用数据之前客户端和服务端先协商版本、交换证书、算出会话密钥然后才开始加密通信。这套机制保护了用户的隐私也让传统的基于明文特征的安全检测方式大面积失效。以前做运维抓包看HTTP明文请求非常方便错了能直接看出问题在哪。现在全站HTTPStcpdump抓到的基本是密文除了握手阶段能看几个字段后续全是加密内容。这个转变对运维是排障变难对安全就是直接少了一只眼睛。但也不是完全没得看。我这次重新捡知识印象最深的就是TLS元数据也能做分析。握手时ClientHello里带的TLS版本、加密套件列表、扩展字段这些东西组合起来能形成一条TLS指纹业内叫JA3和JA3S。恶意工具哪怕改了域名和证书指纹只要客户端指纹不变一样能被识别出来。问题是很多工具也做了指纹随机化所以只能作为线索不能当铁证。另一个观测点是证书本身。正规站点证书有清晰的颁发机构、有效期、域名信息。恶意C2服务器的证书很多是自签的或者刚签发没几天或者组织信息特别奇怪。把证书序列号、签发者、有效期这些拉出来做情报关联能揪出一大批恶意基础设施。如果要做深度内容检测就得考虑解密。常见的做法是SSL卸载或者中间人解密但这里有个安全合规的坑如果你部署在企业内部网络边界对办公网流量做解密可能涉及员工隐私合规问题如果你对业务服务器的流量做镜像解密又可能需要客户侧授权。我在实际操作中就碰过解密方案技术上跑通了但合规评审没过最后只能退回元数据分析加抽样解密。所以要不要解密、在哪一层解密一定要先把边界谈清楚再动手。4. DNS通信模式网络的隐形入口4.1 DNS工作原理与解析链路DNS是我这次回归以后重点复习的协议因为它太特殊了。它平时存在感极低但几乎所有网络通信的第一步都要经过它。你访问一个网址客户端必须先通过DNS把域名解析成IP然后才能建立连接。也就是说DNS是网络通信最前端的入口浏览器、命令行、应用、设备固件全都在依赖这个模式。DNS的解析链路可以简化成一句话你向本地配置的DNS服务器发起查询如果它没有缓存就一层层往上递归或迭代直到找到权威答案然后返回给你并且按TTL时间缓存一段时间。这里面有几个点很关键本地DNS服务器的配置、缓存命中率、TTL的设置、以及DNS响应是否可信。排障时最常用的是nslookup和dig。dig能看完整解析链路查哪个DNS服务器回答的、用了多久、TTL是多少。以前我做运维遇到域名解析慢就换DNS服务器或者清缓存。但现在让我再做一遍我会问一句这个解析结果真的是对的吗响应的IP真的是目标权威服务器给的还是途中被人改了或者劫持了4.2 DNS在安全攻防中的位置DNS在安全领域的角色要比我十年前离开时重要得多。现在大量的恶意软件、钓鱼攻击、数据外传都藏在这个看似无害的通信模式里。最常见的关联是恶意域名。勒索软件、远控木马经常需要回连C2服务器为了方便记忆和躲避IP封禁它们会使用特定域名。如果一台内网主机频繁请求某个新建域名而该域名又没有任何正常业务记录就很可疑。更高级的还会用DGA算法即每天按随机种子生成一堆域名去试着连接其中少数几个这会让静态黑名单失效。检测DGA流量不能只看单一域名要看主机侧大量随机域名的请求模式。DNS隧道也是一个经典玩法就是把数据藏在DNS查询和响应里。因为DNS是基础服务很多防火墙默认放行正好成了隐蔽通道。特征上是DNS查询频率异常高、域名长度异常、TXT记录或响应内容明显超过正常应答的大小。这种手法在数据外传场景里很常见。所以现在我排查DNS问题时多了两个检查项一是看解析结果里有没有指向可疑IP的突发变化二是看终端设备上DNS请求有没有异常模式。运维时候配错的hosts、被改掉的局域网DNS配置现在都会多打一个问号因为它完全可能被人利用起来做中间人劫持。5. 从物理拓扑到云网络通信模式的变化5.1 虚拟化、Overlay与容器网络我离开那个年代机房网络是实实在在拿手摸得到的设备。这次回来发现大量环境都跑在虚拟化和云上通信模式也跟着变了。先看云上VPC网络。VPC里你看到的还是CIDR网段、子网、路由表、安全组和网络ACL概念跟传统网络很像但实际上是软件定义网络。你在控制台上点击配置一个安全组规则底层是虚拟交换机动态下发流表。排障时你不再能找一根网线拔掉测试一切动作都是配置和策略在生效。Overlay网络又是一个新的抽象层。为了在已有物理网络上跑出隔离的虚拟网络常见的做法就是VXLAN这类隧道技术把原本的二层数据包再封装进UDP里传。容器网络里Flannel、Calico用的都是类似思路。这带来一个好处是可以跨主机配置灵活网络坏处是排查链路变长了一个包要经过容器网卡、虚拟网桥、宿主机路由、物理网卡、物理交换机、对端宿主机再进到目标容器。任何一环出问题都可能导致通信异常。我刚回来看容器集群第一反应是拿以前查交换机的经验上去结果发现完全不是一回事。服务间的通信模式从小范围的东西向流量变成大规模相互调用一个故障往往不是单一链路问题而是服务发现、负载均衡、Sidecar代理等多个节点共同作用的结果。还好底层的TCP状态和抓包分析依然是通用的让我不至于完全抓瞎。5.2 新环境下的观察与控制手段在云网络里排查通信问题最直观的变化是流量不再“看得见摸得着”。以前可以找台交换机做端口镜像现在云上你可能没有物理设备权限但VPC流日志、负载均衡访问日志、安全组规则审计记录这些替代手段反而提供了更宏观的视角。tcpdump依然可以用但限制也多了。在云虚机上抓包只能看到自己那台机器进出流量看不到云平台内部的转发路径在容器里抓包要进入Pod所在的Network Namespace才行。所以现在的处理思路是宏观和微观结合先看流日志看谁到谁的通没通、丢包率如何再进虚机或容器里抓包看单个连接的行为细节。控制手段同样发生了变化。传统的ACL迁移到云上变成了安全组和网络ACL两层前者挂在实例上后者挂在子网边界。容器网络里还有NetworkPolicy做精细管控。这东西本质上就是更灵活的访问控制但粒度可以细化到Pod标签和端口。做安全的人尤其要重视这些控制面配置它们既是防守的第一道门也是排查时最先要看的地方。给同样从老运维转过来的同行一句经验到了云环境先分清楚控制面和数据面再动手。很多新人对配置规则不熟排障时一上来就抓包结果连流量根本没走到实例都不知道这是白费力气。6. 现场排障的抓包实践与问题速查6.1 抓包工具的选择和基本操作不管做运维还是做安全抓包分析都是最有说服力的手段没有之一。工具主要就是tcpdump和Wireshark两个一个在命令行环境干活一个做图形化深挖。tcpdump是我几乎天天用的最常用的参数组合是这几条tcpdump -i eth0 -nn -s0 -w /tmp/capture.pcap tcpdump -i eth0 -nn host 192.168.1.10 and port 443 tcpdump -i eth0 -nn tcp and (tcp-syn|tcp-ack)第一个是抓完整包写进文件适合事后慢慢分析第二个按IP和端口过滤针对单个目标定位问题第三个抓TCP状态相关的包看握手和重传。抓包位置的选择很关键原则上离可疑点越近越真实。业务访问慢就在客户端侧抓一次、服务端侧抓一次两边对比是最快的定位方法。Wireshark的优势是过滤和可视化。最常用的过滤表达式我给几个印象深的tcp.flags.syn1 tcp.flags.ack0是只看SYN包tcp.analysis.retransmission是只看重传包http.request是只看HTTP请求tls.handshake.type1是只看TLS握手ClientHello。这套东西熟练以后流量在你的眼里就不是乱码而是一条条带着状态的连接故事。6.2 典型问题复盘连接偶发超时写一个我这次回归后实际碰到的案例。现象是客户端访问一个Web服务偶发超时不是持续的故障一天有个几次每次几十秒。这类型的“幽灵问题”最能考验人对通信模式的理解。我的第一步是先看抓包。在客户端侧抓包发现SYN发出去了但迟迟没收到SYN-ACK接着就是TCP重传。这说明SYN到了中间某个环节被丢了或者没响应。然后我在服务端同步抓包发现服务端根本没收到那个SYN。这样一来问题范围就从“服务端应用异常”变成了“中间链路或服务端入口丢包”。接下来往下拆。先看服务端网卡有没有丢包ethtool -S里rx_dropped有计数再看半连接队列和全连接队列是否满了ss -lnt可以看到Send-Q和Recv-Q的堆积情况。最后发现是服务端程序的backlog参数设置得太小连接一多就溢出新连接直接不被接受表现就是客户端SYN得不到应答。改掉内核参数和进程监听队列之后问题消失。整个过程没有高深理论全是对通信模式每一层逐一排除。这件事给我的触动很大十年前我会用同样的方法排上网卡丢包现在用同样的方法排掉了安全侧“疑似被扫描导致连接异常”的告警。底层技术不变但你要能用新的场景语言重新叙述它。6.3 常见通信异常速查表整理一个我日常用得到的速查表帮助快速定位问题方向。注意这张表只给方向具体还得靠抓包确认。现象可能原因抓包特征排查动作客户端连接超时无响应目标不可达、防火墙丢弃、半连接队列满SYN重传无SYN-ACK分别抓两端包确认丢包位置服务端大量TIME_WAIT高并发短连接四次挥手正常结束检查端口范围与长连接利用率服务端CLOSE_WAIT堆积业务代码未关闭连接对端已发FIN本端未回FIN查进程Socket引用与代码偶发RST断开连接被重置、程序崩溃、安全策略抓包看到RST标志查服务端日志与WAF/Security策略DNS解析很慢但最终成功DNS服务器递归慢、缓存失效查询耗时高响应正常用dig trace逐级测时延DNS解析结果异常跳变缓存投毒、hosts被改、劫持响应IP与权威结果不一致对比公共DNS解析结果并检查本地配置大量异常SYN_RECVSYN Flood攻击大量SYN无ACK应答查看源IP分布与半连接队列占用容器间访问不通NetworkPolicy或CNI异常无ARP或封装层异常查Pod网络命名空间与策略规则这张表的思路其实不复杂核心就是两点第一任何异常都要落实到抓包或日志上的具体特征第二不要只盯应用层顺着通信模式一层层往下挖。做安全的时候也一样告警只是一个信号真正要回答的问题是“谁、在什么时间、通过什么方式、和谁通信”这全都离不开通信模式的底子。这次重学网络通信模式我最深的体会是技术框架可以变设备形态可以变业务架构可以变但通信的本质也就是数据怎么封装、状态怎么流转、流量怎么被观测这些东西永远是地基。十年前我用它修网络故障十年后我用它判断流量里是否藏着风险。对跨行回归的人来说把旧知识重新映射到新场景比从零学一堆时髦名词要有效得多。最后再分享一个小习惯。无论做运维还是做安全我都会在系统正常运行时抓一份“正常流量基线”存起来。比如某一台业务服务器趁业务稳定的时候抓五分钟的包存成文件标注清楚哪个网段、哪个端口、什么样的访问频率是正常的。等某天告警真来了把当时流量和基线一对比异常点通常一眼就能看出来。这个习惯帮我省了无数次深夜开会时间。
返回列表