ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Wireshark抓包实战:从流量分析到网络故障排查指南

Wireshark抓包实战:从流量分析到网络故障排查指南 你有没有遇到过这种情况服务端一切正常客户端却一直报超时接口代码没改过线上就是偶发卡顿Wi-Fi 信号满格网页偏偏打不开。这种时候与其对着日志和代码干瞪眼不如直接抓一把流量看一眼。Wireshark 就是干这个用的——网络抓包、流量分析、协议拆解、异常流量识别它几乎是排障的第一板斧。这篇文章我不打算讲那种绕来绕去的概念而是从一次真实的排障经历出发把 Wireshark 的核心玩法拆开揉碎怎么抓包、怎么看包、怎么在流量里找到问题。适合网络运维、后端开发、安全测试、嵌入式调试以及做 CTF 流量分析的同学照着做就能少走不少弯路。1. 抓包前的准备工作选对设备与工具1.1 安装与抓包引擎的选择Wireshark 本身只是一个图形化分析前端真正在底层采集数据的是跟着安装包一起装进去的抓包引擎。Windows 上安装时会让你选装 Npcap 或 WinPcap我强烈建议选 Npcap。WinPcap 已经多年不更新对 Windows 10/11 的兼容性、对 802.11 无线报文的支持都不太行Npcap 支持回环接口抓包、VLAN 标签保留、802.11 无线帧抓取这些在后面都会直接用到。如果已经装了老版本记得先卸载干净再装带 Npcap 的新版本否则驱动冲突会折腾到你怀疑人生。Linux 下安装比较简单Debian/Ubuntu 系直接sudo apt install tshark wireshark。安装过程中会弹一个交互界面问你是否允许非 root 用户抓包我一般选择“是”随后把当前用户加入wireshark组这样日常调试不用每次都 sudo安全性也可控。生产环境不上图形界面的话只装tshark和dumpcap就够了前者负责命令行过滤与分析后者是纯抓包进程资源占用低适合在服务器上长驻抓取。macOS 用户直接下载官方 dmg 安装包即可也可以用 Homebrew 安装brew install --cask wireshark不过每次启动图形界面可能还需要额外授权第一次启动按提示到系统设置里允许网络权限就行。装完之后先别急着开图形界面命令行里敲一下tshark --version确认版本号和编译参数正常。我见过不少“Wireshark 打不开 pcap”的帖子最后都是引擎版本和界面版本对不上造成的很基础但真的会踩到。1.2 抓包接口选择与无线抓包打开 Wireshark 首页第一屏是接口列表很多新手上来就选第一个然后抱怨“怎么抓不到包”或者“抓到的包看不懂”。Wireshark 默认抓的是链路层帧所以你必须选对物理网卡。接网线的选以太网接口连 Wi-Fi 的选无线网卡本地调试选回环接口Windows 下叫 Npcap Loopback AdapterLinux 下叫 lo。用 Wi-Fi 抓自己的电脑流量没问题但要抓同一 Wi-Fi 下其他设备比如手机的流量普通无线网卡默认是收不到的。原因是无线网卡在正常模式下只接收发给自己的单播帧和广播帧想抓邻居流量得让网卡进入监听模式monitor mode。Windows 下大部分无线网卡驱动不支持这个模式Intel AX210 这类新卡在 Windows 上也只能很有限地支持Linux 下可以用iw list查看网卡能力然后sudo ip link set dev wlan0 down sudo iw dev wlan0 set type monitor sudo ip link set dev wlan0 up临时切到监听模式或者用 airmon-ng 这类工具辅助。不过说实话真做无线空口分析还是建议用专用 USB 网卡配合 Linux 虚拟机省得在驱动上浪费时间。另外一个很多人忽略的点是“混杂模式”。Wireshark 抓包选项里的“Enable promiscuous mode”默认是勾上的表示网卡会接收所有经过它的帧而不只是发给自己的。但在交换机环境下流量只会按 MAC 地址转发到对应端口你不一定能收到别人端口的包。想抓全整个链路通常需要交换机端口镜像Port Mirroring或者用 TAP 分光器这是另一个话题但原理要清楚不然容易误判“网络里没有流量”。如果目标机器没有图形界面或者不想装 Wireshark远程抓包是最佳选择。我常用的方案是在目标机上只装dumpcap或tshark然后通过 SSH 管道把实时报文传回本地 Wireshark 显示ssh userremote dumpcap -i eth0 -w - | wireshark -k -i -。这比在远程机器上开图形界面靠谱得多也方便直接在本地做深度分析。USB 抓包的话Linux 下选usbmon接口Windows 下可以装 USBPcap只是 USB 报文结构比网络报文更复杂新手先不用深入知道有这个入口就行。2. 流量分析的第一步把过滤器练成本能2.1 抓包过滤器在源头过滤才能抓得住很多人一上来就点开始抓包抓了几百 MB 文件再慢慢翻结果文件卡死、内存暴涨、要的报文还被淹没在噪声里。正确做法是先明确“我要抓什么流”然后用抓包过滤器Capture Filter在源头做减法。抓包过滤器用的是 BPFBerkeley Packet Filter语法它工作在协议栈层性能极高是显示过滤器替代不了的。常见写法# 只抓某个主机的流量 host 192.168.1.100 # 抓所有发往或来自某个网段的包 net 10.0.0.0/24 # 抓 80 和 443 端口 tcp port 80 or tcp port 443 # 抓一段端口范围内的 UDP 包 udp portrange 8000-8100 # 排除 ARP 和 DNS 噪音 not arp and not port 53注意抓包过滤器里不要用ip.addr、tcp.port 这种显示过滤器的写法BPF 只认host、port、net、proto这些老语法。我在一个线上问题里见过同事把ip.addr 10.0.0.1直接粘进抓包过滤器提示语法错误还以为是软件出 bug 了实际是两套体系搞混了。源头过滤最大的好处是控制抓包文件体积。抓包文件默认会用环形缓冲区覆盖如果噪声太大真正要的包可能早就被滚动覆盖了。内网大流量场景下我一般会先把抓包文件大小限制在 20MB 到 50MB滚动保存到本地再配合editcap按时间或会话拆分这样既不会漏关键数据也不会撑爆磁盘。2.2 显示过滤器日常分析最核心的武器抓包完成之后显示过滤器Display Filter才是真正的主力。它不会删除任何数据只是把符合条件的数据包显示出来所以你可以反复切换条件随时回到全量视图分析效率完全由你过滤表达式的熟练度决定。几条天天都要用的# 只看某台主机的全流量 ip.addr 10.0.0.5 # 只看 80 端口 HTTP 请求 http.request # 只看 DNS 查询不是响应 dns.flags.response 0 # 只看 TLS 握手包 tls.handshake.type 1 # 只看 TCP 重传 tcp.analysis.retransmission # 只看大于指定长度的帧 frame.len 1400显示过滤器支持逻辑组合表示并且||表示或者!表示非括号调整优先级。比如排查一个“目标服务器 443 端口所有非本机 IP 的流量”可以写成tcp.port 443 !ip.addr 10.0.0.5。写不出来的时候别硬背在数据包里找到感兴趣的一个字段右键选择“Apply as Filter”Wireshark 会帮你把表达式自动套好。我经常在交流发现很多人用 Wireshark 几年了还不知道右键这个操作实际上这是最高效的入门路径。除了过滤统计功能也是分析的好帮手。菜单栏的 Statistics 下面有一堆工具Protocol Hierarchy 按协议栈看流量分布Conversations 看会话级别的流量排行Endpoints 看每个 IP/MAC 的收发字节数IO Graph 能把流量画成时间曲线。节点异常、慢会话排查我基本都是先用这些统计功能锁定方向再配合过滤器钻进去看细节。直接从头翻包那不是人干的活。3. 协议拆解实战从握手到应用层数据3.1 TCP 三次握手、重传与关闭过程拆解TCP 是互联网的顶梁柱也是排障时最常看的协议。一个标准的 TCP 连接开始是三次握手客户端发 SYN服务端回 SYNACK客户端再回 ACK。在 Wireshark 里看就是三条连续的高亮普通包用过滤器tcp.flags.syn 1 tcp.flags.ack 0可以过滤出纯 SYNtcp.flags.syn 1 tcp.flags.ack 1过滤 SYNACK。看的时候重点关注序列号和确认号。序列号 seq 表示当前报文里数据负载的第一个字节在整个字节流中的位置确认号 ack 表示对端期望收到的下一个字节序号。举个具体的例子客户端发的第一个包 seq0携带 500 字节数据那么服务端回的确认包 ack500意思就是“前 500 字节我收到了你下一个给我发序号 500 的字节”。如果数据被拆成多个段比如 MSS 协商为 1460 字节那第二个数据包的 seq 就是 1460第三个是 2920依次累加。Wireshark 默认显示相对序列号从 0 开始方便阅读想验证真实字节流可以到 Preferences 里关掉“Relative sequence numbers”。排障时我一般按这个顺序看只有 SYN没有 SYNACK客户端发出的 SYN 石沉大海可能是防火墙拦截、目的端口没监听、或者半连接队列溢出了。有 SYNACK但没有最后的 ACK服务端能回客户端不确认往往是客户端连接队列溢出或者客户端已经放弃。大量 TCP Retransmission重传包丢了或者超时了先看 RTT 是不是突变再看是不是有中间设备丢弃。出现 Zero Window零窗口接收方应用层不读数据接收缓冲区满了这通常意味着服务端应用卡死或处理太慢而不是网络问题。大量 Dup ACK重复确认某一段数据丢了但后面的包还在到达接收方反复要求重传缺失段。连接关闭分两个阶段正常关闭用四次挥手主动关闭方发 FIN对端回 ACK再反向来一次 FINACK两边就都关了。如果对端直接回 RST说明协议栈主动放弃了这条连接常见原因是应用层异常退出、端口不复用、或者中间设备注入 RST。抓住这个标志很多“连接被重置”的诡异问题都能缩小到具体环节。3.2 HTTP、TLS、DNS 等协议怎么读、怎么解密HTTP 是应用层最常见的协议之一在 Wireshark 里非常好认。请求行会标成GET /index.php HTTP/1.1响应是HTTP/1.1 200 OK。想快速看整个请求和响应右键任意一个 HTTP 包选“Follow HTTP Stream”就会把这次交互里的所有报文顺序拼在一起内容和浏览器开发者工具里的报文几乎一样但能看到 TCP 层的传输细节。要看资源传输记录用菜单栏 File 里的“Export Objects - HTTP”可以把这次抓包里通过 HTTP 传过的所有文件直接导出。这个方法在分析网页资源加载、排查图片/接口下载失败以及安全分析中都非常好用直接避免在乱糟糟的数据包里一个个翻。TLS/HTTPS 是另一个高频重点Wireshark 默认只能看到 ClientHello、ServerHello、证书交换、密钥交换这些握手消息实际应用层数据是加密的。但这并不代表 HTTPS 抓包没有意义——握手本身能暴露很多问题例如tls.handshake.type 1过滤出 ClientHello看客户端支持的 TLS 版本和加密套件tls.handshake.type 2过滤出 ServerHello看服务端最终选了哪个版本和哪个套件握手失败时看 Alert 消息类型能直接定位是不支持协议版本、证书无效还是密钥交换失败。如果这是你自己服务的流量或者你有测试环境服务器的私钥还可以用浏览器设置SSLKEYLOGFILE环境变量导出会话密钥然后在 Wireshark 的 Preferences - Protocols - TLS 里配置密钥日志文件路径Wireshark 就能解密出整个 HTTPS 明文内容包括 HTTP2 流。这个方法在调接口、排除连接问题时简直是外挂级工具但它严格要求你只能在自己有权限的测试环境里做别拿别人的流量试。DNS 报文结构更直观前面是事务 ID 和标志位中间是 Question 区后面是 Answer、Authority、Additional 区。用dns.flags.response 0过滤查询请求用dns.qry.name看具体的查询域名。比如排查域名解析慢看响应时间就是对比请求和响应包的时间戳排查解析错误看响应码字段dns.flags.rcode值为 3 表示 NXDOMAIN域名不存在值 2 表示服务失败。DHCP 排障同理用dhcp.option.dhcp过滤租约请求和确认dhcp.option.hostname看主机名。熟练之后你会发现协议解析其实就是在 Wireshark 的中栏Packet Details展开看字段第三栏Packet Bytes会同步高亮对应的原始十六进制字节。点到哪个字段右边的字节立刻帮你定位这种联动对理解协议编码极有帮助。做协议实验的时候比如《计算机网络自顶向下方法》第 9 版配套的 TCP 实验 pcap 文件拿 Wireshark 打开用 Follow TCP Stream 看完整交互再用 Statistics - Flow Graph 导出时序图报告里的很多分析自然就出来了比对着书本空想强得多。4. 异常流量识别从“能看到”到“能发现”4.1 先建立全局视图再钻到具体流里很多人把抓包文件打开之后第一件事就是翻包这是效率极低的做法尤其在分析大型 pcap 时。正确姿势是先点开 Statistics 菜单用全局统计建立“大局观”。Protocol Hierarchy 是最直观的入口它按协议层级展示各类协议的帧数量、字节数和占比。看到 HTTP 数据占比异常高那就去流里看 HTTP看到 TLS 流量占比过高就注意是不是有人在跑加密隧道。第二步看 Conversations这个表会列出所有会话的收发字节、起止时间、持续时长。哪个会话流量最大、持续最久哪个方向数据量严重不对称都一清二楚。第三步看 Endpoints按 IP 或 MAC 汇总收发包和字节数能快速定位“谁在跟外部通信最频繁”。之后配合 IO Graph 看时间维度。IO Graph 能把流量画成按秒/分钟聚合的曲线正常业务曲线一般是平稳或周期波动的。如果你看到一段流量曲线是等间隔的“脉冲”比如每整分钟一个尖峰那大概率是某种定时任务或心跳通信具体是正常业务还是恶意软件外联再进对应的流里翻一下就能定性。我的习惯是异常分析至少同时开 Protocol Hierarchy、Conversations、IO Graph 三个窗口三个视角交叉验证基本不会漏掉大方向。4.2 四类典型异常流量的识别特征ARP 异常。正常网络里的 ARP 请求是广播但低频的如果抓到某个 MAC 在短时间内向整个网段广播大量 ARP Request且每次都在询问不同 IP或者 ARP 应答中的 MAC 地址与你登记的硬件地址不一致就要高度警惕了。Wireshark 里用arp过滤全部 ARP 包然后按源 MAC 分组看频率。还有一种常见情况是 ARP 广播风暴整个网段几百上千个 ARP 广播网络直接卡死这时候先看是不是有设备配置了重复 IP再看是不是有网卡驱动异常。TCP 层异常。SYN Flood 的特征非常明显短时间内大量只有 SYN 没有 ACK 的短连接目的端口往往集中在同一个端口源 IP 分布散乱用tcp.flags.syn 1 tcp.flags.ack 0 tcp.flags.ack 0 tcp.analysis.flags这类组合先圈出可疑范围再统计源 IP 数量。TCP 重传率高代表链路丢包率上升正常内网丢包率应该在万分之几以下如果重传比例超过 2%-3%就要看是物理链路问题、网卡问题还是中间设备限速。零窗口大量出现说明应用层处理不过来不是网络问题但你要能看到这个指标才能把锅递到正确的人手里。DNS 异常。DNS 是流量分析里的“老实人”它一般不会被加密所以也常被用来做恶意通信的中转。DNS 异常常见三类一是大量 NXDOMAIN 响应说明某个程序在反复解析不存在的域名可能是业务配置错误也可能是 DGA 域名的探测行为二是查询域名长度异常域名由一串无意义的长字符串拼接而成比如dns.qry.name matches [a-z0-9]{20,}\.example\.com这种特征很容易用显示过滤器筛出来三是 TXT 记录查询量突增因为 TXT 记录可以携带较大文本载荷适合写数据。HTTP/应用层异常。在没有 CDN 的情况下某个 IP 段的 HTTP 错误率突然飙升http.response.code 500的包数量激增往往代表后端服务出问题或者被攻击大量 POST 请求集中打向一个具体的 URL配合 UA 字段全是一样的非浏览器标识很可能是在做撞库或爆破下载量和上传量突然对称性暴涨比如某个主机同时上行和下行都跑满带宽要留意是不是被人拿去做了代理转发。安全分析时还有一个更直接的技巧先 Filter 出 HTTP然后 File - Export Objects把所有传过来的文件倒出来扫一遍。CTF 流量分析题比如 DDCTF 那些 pcap 题基本都是这么解的导出对象、搜字符串、找攻击流量三步走。我记得有一次比赛题目给了一个看似正常的 pcap全场不少人盯着 TCP 窗口分析半天其实正确答案就是某个 HTTP POST 请求里带了一段 Base64解码就是 flag。所以方向没确认之前别扎进复杂分析里先看简单层。5. 高频问题与避坑指南5.1 Wireshark 显示与解析的常见坑“为什么我只看到 520 字节别人却能显示 2090 字节”这是我被问得最多的问题之一。多数情况下这不是丢包而是“分片重组”和“TCP 流重组”没有打开。一个完整应用层消息如果超过了单个 TCP 段的最大长度会被拆成多个段分别发送Wireshark 只有在“Allow subdissector to reassemble TCP streams”开启时才会把同一连接里多个段拼成一个完整应用层消息。设置路径是 Edit - Preferences - Protocols - TCP把重组相关的选项勾上再用 Analyze - Follow TCP Stream 查看完整流。另外一个原因是抓包时单个包的最大长度snaplen被限制了比如抓包工具只抓了每个包的前 96 字节那应用层数据天然缺失。解决方法是抓包选项里把“Limit each packet to ... bytes”设为 65535或者用 tcpdump 时加-s 0表示不限制。这两种情况要会区分一个能靠重组解决一个必须重新抓包。VLAN 标签不显示也是常见困惑。如果抓到的帧带了 802.1Q 标签Wireshark 默认会解析出 VLAN 字段但有些版本默认不开启识别Packet Details 里就没有 vlan 这一层。解决方法是到 Preferences - Protocols - Ethernet 里勾选“Assume packets have 802.1Q VLAN tags”之后再用vlan.id 100过滤就很方便了。时间戳乱也是很多人吐槽的点Wireshark 默认显示绝对时间排障时你更关心包与包之间的间隔把 View - Time Display Format 改成“Seconds Since Previous Displayed Packet”即可一眼看出哪个环节延迟最离谱。至于 MMS 报文解析可以在 Decode As 里手动指定 MMS 协议Wireshark 会按 MMS 结构来解析偏门但偶尔用到。5.2 命令行自动化、手机抓包与解密避坑处理超大 pcap 文件图形界面会很吃力这时候该上 tshark。常用命令我给你列几个# 查看抓包文件基本信息 capinfos traffic.pcap # 按过滤器导出字段适合做报表和自动化 tshark -r traffic.pcap -Y http.request -T fields -e ip.src -e http.host -e http.request.uri # 按会话统计 tshark -r traffic.pcap -q -z conv,tcp # 从大文件里切出某个时间段的流量 editcap -A 2024-01-01 00:00:00 -B 2024-01-01 00:05:00 big.pcap slice.pcap用 Python 调 pyshark 做自动化分析我踩过的坑要先说pyshark 本身不是抓包引擎它封装的是 tshark 的命令行能力所以系统里必须先装好 tshark 且版本匹配。Python 2.7 老版本 pyshark 常常报找不到 dumpcap 或者接口列表为空本质问题是 PATH 里没有 tshark或者当前用户没有权限访问网卡。解决方法是先用which tshark确认路径在代码里显式配置tshark_path并确保抓包用户有权限Python 2 本身已停止维护建议直接迁移到 Python 3 新版 pyshark不然光兼容问题就能耗一天。如果只想快速批量提取字段其实直接 subprocess 调 tshark 比 pyshark 更可控还不容易遇到版本陷阱。手机抓包这块很多新手会用 Fiddler、Charles 这类代理工具它们的原理是中间人代理手机把流量先发到电脑上的代理端口代理再转发出去同时安装代理的 CA 证书让 TLS 解密成明文。Wireshark 和这种方式完全不同Wireshark 是旁路被动抓包拿不到加密流量明文。想做手机 HTTPS 明文分析代理工具确实方便但有两个坑一是 Android 7 之后系统默认不信任用户安装的 CA 证书普通的“安装证书到用户信任区”根本解不开某些 App 的流量需要把证书装进系统证书目录或者借助 LSPosed 这类框架处理证书锁定二是如果你调试的 App 做了双向校验不光校验服务器证书还要求客户端出示证书单纯装 CA 证书就不够了得更深入改造测试环境客户端。无 root 环境下这些限制更明显常见的路数要么是让 App 支持记录 SSLKEYLOG要么用独立虚拟机做证书信任要么干脆只做密文元数据分析不追求解密。核心原则是在你没有明确授权的设备上做中间人解密既不合规也不安全要严格限定在自测环境中。还有一个高频问题小程序抓包。小程序本质是 HTTPS WSS 流量用代理工具抓包第一步还是证书信任问题。真机调试时可以在微信开发者工具的调试设置里配置代理并开启不校验合法域名证书校验也能在工具里关闭这种情况下抓包会顺畅很多。如果你非要抓线上小程序的加密流量那就回到 TLS 密钥导出的路子上来但前提依然是你对被调试对象有足够权限和授权别越界。多说一句无论是用 Wireshark、Fiddler 还是 Charles工具本身不分好坏关键是你对协议和信任模型的理解。抓包解决不了的 HTTPS 问题往往不是工具不行而是中间人这一层被人为锁死了。回到我开头的那个场景有一次线上偶发超时后端日志全是“上游读取超时”但是网关和服务的 CPU、内存都正常。我抓了五分钟的包用tcp.analysis.retransmission一看重传比例到了 5%再跟运维对了一下发现某个交换机端口在丢包。从被怀疑“服务有问题”到定位“交换机有问题”整个过程也就是喝杯茶的功夫。后来我就养成了习惯碰到任何网络怪问题第一时间抓包留存哪怕当下不看也把文件留着等情绪稳定了再回放流量。很多神秘故障其实都藏在那些被忽略的 ACK 和重传里。最后再送你一个我一直在用的偏方抓到包之后先把时间列调成相对时间再按 CtrlAltShiftT 打开 TCP 时序图很多问题会自己“画”出来。
返回列表