ARTICLE DETAIL

资讯详情

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

Wireshark抓包实战:过滤器、TCP分析与疑难问题解决

Wireshark抓包实战:过滤器、TCP分析与疑难问题解决 1. 抓包这件事到底在解决什么问题第一次打开 Wireshark满屏滚动的彩色行能把人直接劝退这大概是绝大多数人接触 wireshark 抓包时的真实体验。它不像浏览器 F12 那样把请求列得整整齐齐也不会主动告诉你哪一条才是有问题的那一条。但只要你真正做过一次线上问题定位就会明白这个工具的不可替代性当应用日志只留下一句请求超时当客户端和服务端互相甩锅说不是我这边的问题能拍在桌面上的硬证据往往就是一份抓包文件。学会抓包本质上是学会在网络这个看不见的管道里取证。Wireshark 能做的事情远超大多数人对它的想象。它不只是抓 HTTP 请求这么简单DNS 解析、TCP 握手、TLS 协商、ARP 广播、DHCP 过程、无线 802.11 帧、USB 总线通信、甚至认证流程里的 EAPOL 交互全都能被它逐层拆开。它更像一台高速摄像机把经过网卡的每一个数据帧原样复制一份存下来再由协议解析器按规范翻译成人能读懂的字段。这个原样很关键——它不会帮你美化数据也不会替你隐藏任何细节问题出在哪一层它就呈现哪一层。这篇文章面向的读者跨度比较大。如果你是完全没碰过抓包的新手前面几节会从安装、选网卡、第一次抓包讲起步骤会让你照着做就能跑通如果你已经有抓包习惯只是卡在某个具体问题上比如为什么只能看到 520 字节数据怎么筛选出 UDP 前后两包的时间间隔手机抓包总失败那可以直接跳到对应的实操章节。全文按为什么要这么做—具体怎么做—踩过什么坑的顺序展开所有参数和操作我都会说明背后的原因避免你照抄之后换个环境就完全用不了。1.1 抓包的底层逻辑在数据流上开一扇窗网卡是数据进出计算机的唯一通道无论你访问网页、发消息还是系统后台同步所有数据都必须经过这里。抓包工具做的事情就是依赖操作系统提供的捕获机制在这条通道上旁路复制一份数据副本。Windows 上这套机制由 Npcap 提供Linux 上是 libpcapmacOS 上用的是 BPF 设备。Wireshark 的角色其实只是前端界面真正把数据从内核缓冲区捞出来的是这些东西。复制出来的数据是链路层的原始帧包含以太网头、IP 头、TCP 或 UDP 头再往上才是应用层负载。Wireshark 拿到之后依靠一大堆叫 dissector解析器的模块按协议规范逐层解码。举个例子你看到一行写着GET /index.html HTTP/1.1并不是网卡上真的写着这行字而是 Wireshark 认出了这是 TCP 80 端口上的 HTTP 流量然后按 HTTP 报文格式把二进制翻译出来的。理解了这一点很多困惑就自然解开了。为什么有时候抓到的东西看不懂因为那是你没见过的协议格式。为什么同样的操作有时候能看到明文有时候全是乱码因为一个是明文协议一个是加密协议Wireshark 在没有密钥的情况下只能把密文原样展示。为什么抓不到别的机器上的流量因为交换机只会把数据转发给目标 MAC 对应的端口除非你做了镜像否则数据根本不会经过你的网卡。1.2 Wireshark 和 Fiddler、Charles、Burp 到底该用哪个这是被问得最多的问题之一答案取决于你要解决的是哪一类问题。Fiddler、Charles、Burp Suite 这类工具的本质是应用层转发工具它们在系统里注册一个本地端口让应用的流量先走到自己这里再由它转发出去。好处是能直接看到 HTTP 报文的完整结构和美化后的 JSON改包、重放、断点都很方便。代价是它只能处理走 HTTP 协议栈的流量DNS、TCP 重传、TLS 握手细节、非 HTTP 协议的通信它一律看不见。Wireshark 恰好相反。它看得到所有东西但看得到不等于看得懂。它对 HTTP 报文不做美化一堆十六进制摆在那里需要你自己去拼。它能看到 TCP 层的重传、乱序、零窗口、RST这些恰恰是应用层工具永远看不到的信息而这几个指标又往往是判断到底是不是网络问题的关键证据。我的判断标准很简单问题出在业务语义层面比如接口返回 500、参数传错、时间戳不对、证书校验失败用 Fiddler 或 Charles 这类工具效率高得多问题出在连接层面比如连不上、时快时慢、偶尔断连、文件下载到一半卡住直接上 Wireshark。实际操作里这两类问题经常混在一起所以很多人的做法是两边同时开着应用层工具负责确认业务逻辑Wireshark 负责佐证链路状态。1.3 上手前先建立的三个基本认知第一个认知是抓包点的位置决定你能看到什么。抓自己电脑的流量就选本机网卡抓本机的 localhost 通信要选环回接口抓整个局域网的流量需要在交换机上做端口镜像或者串接一个物理分路器。这个顺序不能反位置选错了后面再怎么过滤都是白忙。第二个认知是过滤分两层别搞混。抓包过滤器Capture Filter在抓之前生效语法用的是 BPF决定哪些包被记录下来显示过滤器Display Filter在抓之后生效决定屏幕上显示哪些包。前者一旦设错被过滤掉的包根本没存下来神仙也找不回来后者设错了没关系原始数据都在改个表达式就能重新看。所以我的习惯是抓包过滤器宁可放宽一点显示过滤器再精确。第三个认知是抓包本身是有成本的。Wireshark 会把抓到的包里能解析的部分全部放在内存里维护索引一个几百兆的抓包文件轻松吃掉几个 G 的内存。磁盘写入同样是瓶颈尤其在全速抓万兆链路的时候。知道这个成本你才会理解后面为什么要用环形缓冲、为什么要用命令行工具先落盘。2. 安装与抓包环境搭建的避坑要点2.1 Windows 安装Npcap 那一步千万别乱勾从官网下载安装包一路下一步中间会弹出一个 Npcap 的安装向导这一步是整个安装过程里唯一需要动脑的地方。Npcap 是抓包能力的来源Wireshark 离开它就是个空壳所以必须装。安装界面里有几个选项值得说明Restrict Npcap drivers access to Administrators only建议勾上这样只有管理员权限的进程才能抓包安全性更好Support loopback traffic建议勾上否则你在本机测试两个服务之间的通信时会发现怎么抓都是空的。还有一个选项是安装 Npcap 的兼容模式驱动如果只是用 Wireshark 官方版本不需要勾。装完之后建议重启一次让驱动加载生效。有些机器装完不重启也能用但接口列表刷新不全的情况重启基本都能解决。顺便说一个高频疑问现在还需要用 Wireshark 2.6.6 这种老版本吗除非你是在复现某个受限于老旧操作系统的特殊环境否则没必要。老版本最大的问题是协议解析库过期对新版本的 TLS、HTTP/2 支持不完整而且有些已知的解析问题可能导致误判。Wireshark 4.0 换掉了显示过滤器的编译引擎过滤速度明显提升语法也比老版本更规范条件允许就直接上 4.x。2.2 Linux 和 macOS 下的权限处理Linux 上用包管理器安装 Wireshark 时安装过程会弹出一个问句大意是是否允许非 root 用户抓包这里一定要选是。选是之后安装脚本会把当前用户加进 wireshark 组并把 dumpcap 程序设置成特定的权限组。装完需要重新登录一次才能生效。如果当时手滑选了否可以手动补sudo usermod -aG wireshark $USER然后用sudo setcap cap_net_raw,cap_net_admineip /usr/bin/dumpcap给 dumpcap 单独授权。macOS 的情况类似安装包会创建一个叫 access_bpf 的用户组把当前用户加进去之后需要注销重登或者重启。权限不对的典型表现是接口列表空空如也或者点击网卡时弹出一个关于权限的提示看到这两个现象就先去检查用户组不要浪费时间在别的地方找原因。这里有个小细节值得注意。很多教程会让你直接用sudo wireshark启动图省事但这其实是个坏习惯。以 root 身份运行图形界面程序意味着所有的解析器都在最高权限下工作一旦遇到畸形的、构造过的报文触发解析器缺陷后果比普通用户运行时严重得多。正确做法是把权限授给 dumpcap让 Wireshark 以普通用户身份调用它来完成抓包。2.3 抓包点选在哪网卡、镜像口还是无线监听本机流量直接选对应网卡就行这个是最好理解的。难点在于抓本机内部通信也就是程序访问 127.0.0.1 或者 localhost 的场景这部分流量走的是环回设备不经过物理网卡。Windows 上要依赖 Npcap 安装时勾选的环回支持装好之后接口列表里会出现一个叫 Npcap Loopback Adapter 的条目Linux 上直接选 lo 接口macOS 上选 lo0。交换机环境里抓别人的流量就没那么直接了。交换机的工作方式是按 MAC 地址表把帧转发给对应的端口也就是说除非目标 MAC 正好是你否则帧根本不会到你这里。混杂模式在这个场景下几乎没用它只在集线器时代那种广播式介质上有意义。要看整条链路的流量只能在交换机上配置端口镜像把目标端口的流量复制一份送到你接的端口或者串接一个物理的分路设备。无线抓包是另一个独立的话题。普通无线网卡在系统里通常只能看到自己和接入点之间的单播流量而且是已经被无线加密处理过的。如果要抓无线管理帧或者分析无线协商过程需要网卡支持监听模式。在 Linux 下部分 Intel 无线网卡比如 AX 系列可以切换到监听模式用iw dev wlan0 set type monitor这类命令切换接口类型之后在接口列表里选中新出现的监听接口就能抓了。3. 第一次抓包从点击开始到看清一帧数据3.1 接口选择与抓包启停Wireshark 的欢迎界面就是网卡列表每张网卡旁边都有一条跳动的迷你折线这叫 sparkline显示的是当前这张网卡上的流量强度。这个设计很贴心它帮你快速判断该选哪张网卡——折线越活跃说明流量越大抓到数据的概率越高。如果你选了一张一直平躺的网卡抓了半天一无所获多半是选错了。选好网卡双击或者点左上角那个蓝色鲨鱼鳍图标开始抓包停止按红色方块快捷键是 CtrlE。这里有个我一直在用的操作节奏先点开始观察界面上的包在滚动确认抓到了流量然后再去复现你要排查的问题复现完立刻按停止。这样做的好处是抓包文件里包含的时间窗口非常精确前面和后面的无关噪声少后面用显示过滤器的时候效率高很多。还有个小技巧值得说。如果你的问题很难复现可以先把抓包开着设置好环形缓冲让它自己滚动记录等到问题出现之后立刻停止再从缓冲区里往回找。这个思路在排查偶发故障的时候特别有用因为偶发问题从来不按你的时间表出现。3.2 抓包选项里的几个关键参数点接口列表上方那个齿轮图标会展开抓包选项里面有几个参数值得逐个搞清楚。Promiscuous是混杂模式勾上之后网卡会把所有收到的帧都交给上层而不只是发给自己的那些。在交换网络里它的作用有限但抓广播、组播和 ARP 的时候还是有用。Snapshot length这个参数非常关键它决定每个包最多被抓多少字节。默认值在新版本里是 262144老版本是 65535。这个值设小了抓到的包就是残缺的详情面板里会有一行灰色的Packet size limited during capture提示告诉你这个包被截断了。很多新手遇到的数据看不全问题根子就在这个参数上而他们往往会在过滤器和协议解析上找半天原因方向完全跑偏了。Buffer size是内核里的缓冲区大小单位是兆字节。高流量场景下默认值可能不够包在从内核往用户态拷贝的过程中如果缓冲区满了新来的包就直接被丢弃Wireshark 会在状态栏显示丢包统计。抓千兆以上链路的时候把它调到 64 或者 128 很有必要。还有Capture Filter输入框语法是 BPF后面单独讲。输出选项里还有个Create a new file automatically可以按文件大小、时间或者包数量自动切分这是长时间抓包的基础。3.3 长时间抓包怎么做才不会丢包也不会把磁盘写爆长时间抓包有两个必须同时面对的敌人一是数据量太大把磁盘写满二是内存持续增长把机器拖垮。解决第一个问题的核心手段是环形缓冲在输出选项里勾上自动创建新文件设置单个文件大小比如 100MB和保留的文件数量比如 100 个Wireshark 就会滚动写入旧的覆盖新的磁盘占用被牢牢锁死在你设定的上限内。解决第二个问题靠的是命令行工具。长时间抓包千万别用图形界面因为 GUI 会把所有抓到的包读进内存维护完整的索引结构跑几个小时内存就满了。用dumpcap就好得多它只负责抓和写不做解析、不做渲染内存占用几乎恒定。一个典型的命令长这样dumpcap -i eth0 -b filesize:102400 -b files:100 -w /data/capture.pcapng这行命令的意思是在 eth0 上抓包每个文件最大 100MB最多保留 100 个文件循环覆盖输出到指定目录。100 乘 100MB 等于 10GB 的空间上限实际部署的时候根据你的磁盘容量调整这两个数字。抓包文件别往系统盘根分区写IO 打满会影响整个系统的其他服务单独挂一块盘最省心。再加一条经验能用抓包过滤器先筛掉无关流量就一定要用。DNS 查询、ARP 广播、各种心跳包在全速抓包的时候加起来体积惊人先把它们排除掉同样大小的文件里能容纳的有效信息会多好几倍。4. 过滤器双件套抓包过滤器和显示过滤器的配合打法4.1 BPF 抓包过滤器宁可宽一点也别太窄BPF 过滤器的语法由三部分组成协议、方向和目标。协议可以是ether、ip、tcp、udp、arp等等方向是src、dst不加就是双向目标可以是host、net、port、portrange。几个常用的例子host 10.0.0.5 src host 10.0.0.5 and dst port 443 tcp port 80 or tcp port 443 not arp and not icmp and not dns ether host aa:bb:cc:dd:ee:ff组合用and、or、not也可以用、||、!。写的时候注意 BPF 里没有括号优先级的坑复杂条件务必加上括号不然逻辑会和你预期的不一样。我最想强调的一点是抓包过滤器设得太窄是新手最容易犯的错。有次帮同事排查问题他信誓旦旦说流量肯定走 8080 端口抓包过滤器只留了 8080抓了半天一个包都没有最后发现实际走的是 8443。重新抓一次就得重新复现问题浪费的时间比什么都多。所以我的建议是凡是第一次抓的场景过滤器宁可只留最基本的条件比如只限定一个 IP 段先把数据抓全了再说。4.2 显示过滤器把数据从噪声里挑出来显示过滤器是日常使用频率最高的东西值得花时间把常用表达式背下来。基础的有ip.addr 192.168.1.100 tcp.port 443 udp.port 53 http.request.method POST http.response.code 500 dns tls.handshake.type 1 frame.len 1000 tcp.analysis.retransmission tcp.analysis.zero_window tcp.flags.syn 1 and tcp.flags.ack 0tcp.analysis.retransmission和tcp.analysis.zero_window这两个是 Wireshark 自己分析出来的虚拟字段原报文里并没有这两个字段是它根据前后包的关系推断出来的结论在排查链路质量的时候特别有用。除了手写还有更快的操作方式。在详情面板里右键某个字段值选Apply as Filter它会把当前的过滤条件替换成这个字段选Prepare as Filter则是追加到现有条件后面。比如你展开一个包看到某个 TCP 流的端口是 51234右键Apply as Filter → Selected屏幕上立刻只剩这条流。这个操作比手敲表达式快得多也是我平时用得最多的方式。Wireshark 4.0 在过滤器语法上做了一次升级把编译引擎从 libpcap 换成了自己实现的版本。实际体感就是过滤速度更快了尤其是对大文件做复杂条件过滤的时候等待时间明显缩短。语法层面基本兼容和eq两种写法都还能用老教程里的表达式照抄一般不会出问题。4.3 专项需求筛选 UDP 前后两个包的时间间隔这是个很具体的需求比如你要分析某个实时音视频流的发包节奏或者检查某个自定义 UDP 协议是不是按固定间隔发心跳。做法分两种图形界面和命令行各有一套。图形界面下的操作是先加显示过滤器udp或者再加一个 IP 条件收窄范围。然后在 Time 列的标题上右键进入Column Preferences新增一列字段名填frame.time_delta_displayed。这一列显示的差值含义是当前包距离上一个被显示出来的包的时间差。注意这里的关键词是被显示出来也就是说过滤器筛完之后剩下的相邻包之间的间隔正是你要的结果。如果用frame.time_delta就不对了它算的是当前包和原始序列里上一个包包括被过滤掉的的差值数字会对不上。命令行方式更适合批量处理导出成表格再算tshark -r capture.pcapng -Y udp -T fields \ -e frame.number -e frame.time_relative -e frame.time_delta_displayed \ -e ip.src -e ip.dst -e udp.srcport -e udp.dstport导出的内容可以粘到表格软件里按源目端口分组之后算平均值、最大值、标准差发包抖动一目了然。做性能分析的时候光看单个包的间隔没多大意义把一段时间内的间隔分布拿出来看才说明问题。4.4 把常用过滤器存成书签过滤器输入框右边的书签按钮可以保存当前表达式起个名字下次直接用。这个地方看起来不起眼但攒下来的收益很实在。我自己存了大概二十条从只看某台服务器的所有 TCP 流量到只看 TLS 握手失败的包需要的时候点一下就有。团队里如果有人做得比较细把这一套书签文件导出分享新人上手能省很多摸索时间。5. 读懂数据协议解析与可视化手段5.1 从 TCP 三次握手看链路健康度TCP 连接的建立过程在 Wireshark 里看得清清楚楚。客户端先发一个 SYN服务端回 SYN,ACK客户端再回 ACK三下握完连接建立。展开 TCP 层能看到序列号、确认号、窗口大小、MSS、窗口缩放因子、是否支持 SACK 这些协商参数。这些参数不是摆设它们直接影响后续传输的效率尤其是 MSS 和窗口缩放协商结果差一点点大文件传输的速度可能就差一大截。判断链路健康度我主要看三个东西。第一个是三次握手的总耗时正常情况下应该在一个 RTT 左右如果你看到几百毫秒甚至秒级说明中间链路或者服务端有问题。第二个是黑底红字的包那是 Wireshark 标出来的重传重传密度高说明链路在丢包。第三个是零窗口接收方通告窗口变成 0表示它的应用层处理不过来发送方只能停下来等。这三种现象指向的问题完全不同重传多半是网络问题零窗口则是接收端应用的锅。最高效的入口是Analyze → Expert Information它把整个抓包文件里所有的异常提示按严重程度聚合在一起点进去能直接跳到出问题的包。做初步判断的时候我基本都从这里开始比自己一行行翻快得多。5.2 TLS 流量的合规分析方法TLS 加密之后的负载内容确实是密文用普通手段看不到。但握手阶段是明文的这个阶段透露的信息量其实很可观。ClientHello 里包含服务端名称SNI也就是你要访问哪个域名、客户端支持的密码套件列表、支持的 TLS 版本、ALPN 协商结果能看出走的是 HTTP/2 还是 HTTP/1.1。ServerHello 里包含服务端最终选了哪套密码套件、协商出的版本、以及证书链。光看握手就能回答不少问题连的到底是哪个后端域名、有没有降级到老版本 TLS、证书链是不是完整、协商用的套件是不是太弱。显示过滤器里tls.handshake.type 1只看 ClientHellotls.handshake.type 2只看 ServerHellotls.alert_message看告警信息握手失败的场景重点看这个。如果确实需要看到应用层明文比如调试自己开发的服务正规做法是利用客户端自己输出的密钥日志。浏览器和部分运行时环境支持通过环境变量导出一个密钥日志文件把每次 TLS 会话的密钥材料写进去。在 Wireshark 的协议偏好设置里把 TLS 项的密钥日志文件路径指向它就能解密这部分流量了。前提限定得很清楚只能解密你自己这台机器、你自己发起的会话别人的流量你既拿不到密钥也不应该去碰。企业内部抓包本身要走审批流程这一点不用我多说。5.3 统计菜单和可视化把几千个包压缩成一张图Statistics菜单是我认为最被低估的部分。Conversations按会话维度统计把每个通信对的包数和字节数列出来按字节数排序谁在占用带宽一眼就能看出来。排查网络慢的时候我通常第一件事就是打开它看是不是某个后台同步把带宽吃光了。Protocol Hierarchy显示各协议的占比能快速判断这个抓包文件里主要是哪类流量在污染数据。IO Graph把流量画成随时间变化的曲线突发的尖峰和长时间的空洞都很直观配合时间轴定位问题发生的那一刻特别方便。Flow Graph生成的是时序图形式的交互过程把一次完整会话的请求响应顺序排出来理解复杂交互的时候比一行行看高效得多。日常分析里Follow → TCP Stream追踪流可能是用得最频繁的功能。它把一条 TCP 连接里的所有应用层数据按方向拼起来还原成完整的请求和响应还会顺手处理 TCP 分段的重组。看到一堆碎片化的包不知道从哪下手的时候右键追踪流往往一眼就能看到问题在哪里。File → Export Objects → HTTP还能把传输过程中的图片、脚本、文档直接导出到本地分析网页加载的时候很好用。6. 几个典型场景的实操记录6.1 应用偶发卡顿的排查路径这类问题的特点是现象明确但原因分散可能是网络、可能是服务端、也可能是客户端自己的问题。我的固定动作是这样的先在客户端网卡上抓包抓包过滤器设成host 服务端IP and tcp port 服务端口然后复现卡顿复现完立刻停止。停止之后加显示过滤器tcp.port 服务端口打开Conversations找到那条会话接着看时间列上的间隔。关键的判断逻辑在于把请求发出到响应返回这段时间拆开。如果请求包发出之后隔了很久才看到服务端的 ACK 或者响应而中间还夹着若干重传那基本可以判定是网络链路的问题。如果请求很快就到达了服务端服务端也很快开始返回数据但客户端侧看到数据是断断续续来的那问题可能在客户端的网络栈或者本地处理逻辑上。如果是服务端收到请求之后长时间没有任何动作然后才突然吐出一大段响应那多半是服务端业务逻辑慢网络是背锅的。我遇到过一次很典型的情况应用每隔几分钟卡一次抓包显示响应正常但客户端的确认包延迟很大而且和系统上一个定时任务的执行时间高度吻合。最后查出来是定时任务在跑的时候抢占了大量 IO导致网络栈处理延迟。这类问题不看抓包基本无解光看应用日志只会得出服务端响应正常的结论。6.2 抓包长度疑问为什么只看到 520 字节怎样才能拿到 2090 字节这个现象很多人遇到过抓到的包里数据只有几百字节想看完整内容却怎么也看不到。原因通常有三个层次按可能性从高到低排。第一层是抓包时的截断长度设小了。在抓包选项里Snapshot length决定了每个包最多抓多少字节如果这个值被设成 520 之类的小数字那所有超过的包都会被切掉详情面板里会出现灰色的Packet size limited during capture提示。看到这行提示直接去抓包选项把值改回默认的 262144 或者至少 65535 以上重新抓一次就行。第二层是这本来就不是一个完整的应用层报文。标准以太网的 MTU 是 1500 字节去掉各种头部单个 TCP 段能承载的有效载荷最多 1460 字节左右。一个大响应会被切成多个段传输你看到的 520 字节可能只是其中一段。想看完整内容用Follow → TCP Stream让 Wireshark 自动重组或者展开包详情时注意找一行类似[Reassembled TCP Segments (2090 bytes): #12(1460), #13(630)]的记录这行显示的就是多个段重组之后的总长度。2090 字节超过了标准 MTU说明它必然是重组后的结果单独看任何一个包都看不到这个长度。第三层要考虑特殊链路比如巨帧环境或者环回接口。启用了巨帧的链路 MTU 可以到 9000单个包能承载的有效载荷大得多Windows 的环回接口 MTU 也远比 1500 大。这种情况下 2090 字节出现在单个包里是完全正常的不需要重组。所以排查顺序就是先看有没有截断提示再确认是不是 TCP 分段最后看链路 MTU 设置。这三步走完绝大多数数据看不全的疑问都能定位。6.3 802.1x 认证过程的抓包位置与观察点接入认证的场景抓包的关键不在过滤器而在于抓在哪个位置。整个认证过程是客户端和认证设备交换机或无线接入点之间用 EAPOL 交互认证设备再和背后的认证服务器用 RADIUS 交互。如果你只在客户端本机抓包能看到的只有客户端到认证设备这一段服务器侧的 RADIUS 报文是看不到的。要在客户端本机抓过滤器用eapol或者eap流程大致是认证设备发出身份请求客户端回应身份信息双方协商认证方式然后进行凭证交换最后以成功或失败结束。无线场景下认证通过之后还有一组密钥协商的四次握手过滤器用eapol能看到这些报文。如果认证总是失败重点看几个地方失败报文里带的失败原因常见的有凭证错误、证书有效期问题、认证方式和服务器策略不匹配。证书问题里时间不同步导致的校验失败特别隐蔽设备时间偏差大了证书就会被判为无效报错信息又不会直接说时间不对得靠经验去关联。要看完整的 RADIUS 交互需要在认证设备的镜像端口上抓或者直接在认证服务器侧抓。这一段的过滤器用radius能看到认证请求和响应里的属性字段。这两段流量对照着看才能确定问题到底出在客户端、认证设备还是服务器侧。6.4 非以太网场景USB 抓包和脚本抓包USB 抓包是另一个很实用的方向。Windows 上装 Wireshark 的时候可以勾选 USBPcap 组件装好之后接口列表里会出现几个 USBPcap 开头的接口每个对应一个 USB 根集线器。Linux 上更简单sudo modprobe usbmon把模块加载起来接口列表里就会出现 usbmon1、usbmon2 这样的接口。过滤器可以用usb.device_address 3限定某个设备或者用usb.endpoint_number限定端点。分析外设协议、调试自己写的驱动这个手段比坐在那里猜有用得多。用 Python 脚本做自动化抓包大多数人选的是 pyshark。这里必须说清楚一件事pyshark 自己不抓包它只是调用命令行版本的 tshark把输出解析成 Python 对象。所以它报错的时候问题往往不在 Python 这边。先单独跑一下tshark -v如果这个命令本身就报错那说明 tshark 没装好或者不在环境变量里pyshark 再怎么调都是白费。tshark 路径不在 PATH 里的情况很常见在创建捕获对象的时候显式传tshark_path参数指过去就行。还有一个坑和老版本 Python 有关。Python 2.7 时代的 pyshark 依赖 asyncio 的兼容实现版本搭配稍微不对就报奇怪的错误。如果环境允许迁移到 Python 3 是最省事的方案。实在不能换就退一步用subprocess直接调 tshark加上-T json或者-T fields参数拿结构化输出自己解析虽然土但特别可靠。另外提一句读离线文件比实时抓取要稳得多做分析的话建议先用 dumpcap 落盘再用脚本处理文件不要在脚本里做长时间实时抓取。7. 常见问题速查与踩坑记录7.1 抓不到包、软件打不开的排查顺序遇到问题别乱试按固定顺序走一遍基本都能定位现象常见原因处理方式接口列表是空的权限不足或者 Npcap 没装好检查用户组重装 Npcap 并勾选需要的选项双击网卡没有反应驱动版本和系统不匹配更新 Npcap 到最新版本点击开始后一个包都没有抓包过滤器语法错或者选错网卡清空过滤器换一张有流量的网卡试试抓不到 localhost 的流量环回支持没启用重装 Npcap 时勾选环回选项抓不到其他机器的流量处于交换网络没有镜像在交换机上配置端口镜像或者串接分路设备软件启动就闪退配置文件损坏或者系统兼容问题删掉用户配置目录下的设置文件让它重新生成打开老版本的抓包文件报错文件格式差异用命令行工具先转换格式再打开表格里的配置文件损坏这条值得多说一句。Wireshark 的配置存在用户目录下如果某次退出异常导致文件写坏下次启动就会卡在加载界面或者直接闪退。删掉这个目录之后所有设置会恢复默认虽然恢复默认不划算但比起打不开软件这个代价可以接受。删之前记得把过滤器书签之类的文件备份出来。7.2 抓到了但看不懂字段缺失和显示异常的应对这个字段怎么没有是高频疑问。最常见的原因是包被截断了前面说的Packet size limited during capture就是判断依据。第二个原因是解析器没启用Analyze → Enabled Protocols里可以查看和启用协议解析模块默认情况下绝大多数是开着的但有时候为了排除干扰会手动关掉之后忘了开回来。显示乱码通常出现在压缩内容或者非文本协议上这种情况别在十六进制视图里硬啃用追踪流还原完整数据再看。如果响应体是压缩的Wireshark 有时候能自动解压解压不了的话在偏好设置里找对应的协议选项开启解压支持。时间显示不对往往是因为时间显示格式设成了相对时间而不是绝对时间。View → Time Display Format里可以切换排查跨系统问题时建议用日期和时间格式这样和日志里的时间戳能对上分析单次会话的耗时用自捕获开始以来的秒数更直观。抓包文件的时间戳精度也可以调默认是微秒级某些场景下需要纳秒级可以在捕获选项或者视图设置里改代价是文件体积会变大。7.3 性能、磁盘和合规方面的取舍关于性能有个认知必须建立显示过滤器只是隐藏不会减少内存占用。Wireshark 会把文件里所有的包都读进内存建立索引一个几百兆的文件在图形界面里打开内存占用轻松上到几个 G。所以处理大文件的时候思路应该是先用命令行工具和显示过滤器把范围缩下来再让图形界面去打开截取后的结果。关于磁盘前面提过的环形缓冲是标配另外还要注意写入速度。抓万兆链路的时候磁盘的持续写入带宽很容易成为瓶颈一旦跟不上就会丢包。这种场景下用 SSD 是基本要求输出格式也可以考虑压缩选项Wireshark 支持直接输出压缩格式的文件能省下不少空间和带宽代价是 CPU 占用高一些。关于合规这条不能省。抓包能看到的是链路上所有的通信内容所以只能在你有权限的设备和链路上操作。抓自己的机器、抓自己负责的服务、在自己维护的网络里做诊断这些都没问题对不属于自己管理范围的设备和流量做分析无论技术上是否可行都不应该去做。企业环境里做抓包分析事先把审批和范围弄清楚对人对己都是件好事。最后分享一个我自己的习惯。我电脑上常年留着一个抓包用的启动脚本里面把 dumpcap 的环形缓冲参数、输出目录、常用的抓包过滤器都预设好了需要的时候改一下网卡名就跑起来。同时另开一个终端用 tshark 做过滤和统计图形界面只在需要仔细看某个包的详情时才打开。这套组合用下来抓包这件事从一个很重的操作变成了随手就能做的事很多原本要靠猜的问题现在几分钟就能给出结论。真正花时间的从来不是敲命令而是知道该看哪个字段、该拿什么指标去对比这部分只能靠一次次实际问题喂出来。
返回列表