网络抓包神器Wireshark:从入门到实战,这一篇就够了!
之前有写一篇关于tcpdump的使用博文,今天我们来讲讲Wireshark。
说起Wireshark,我记得之前看到同事用这个工具抓包分析网络问题,感觉特别高大上,密密麻麻的数据包在屏幕上滚动,就像黑客电影里的场景一样。后来自己用多了才发现,这玩意儿虽然功能强大,但上手其实没那么难,关键是要掌握正确的使用方法。
什么是Wireshark
官网下载地址:https://www.wireshark.org/download.html
Wireshark(旧称 Ethereal)是一个开源的网络数据包分析器,可实时从网络接口捕获数据包中的数据。它尽可能详细地显示捕获的数据以供用户检查它们的内容,并支持多协议的网络数据包解析。Wireshark 适用于 Windows 和 UNIX 操作系统。它可被用于检查安全问题和解决网络问题,也可供开发者调试协议的实现和学习网络协议的原理。
在 GNU 通用公共许可证的保障下,用户可免费获得软件与源代码,并拥有对源代码修改及定制的权利。
这个工具最初叫做Ethereal,后来因为商标问题改名为Wireshark。它支持几百种网络协议,从最基础的以太网到复杂的应用层协议都能分析。
安装和基本界面
安装Wireshark很简单,去官网下载对应系统的版本就行。Windows用户直接下载exe文件安装,Linux用户可以用包管理器安装,比如Ubuntu下面:
sudo apt-get install wireshark
安装完成后打开Wireshark,界面分为几个主要区域:
- 菜单栏和工具栏:基本的操作按钮
- 网络接口列表:显示可以抓包的网络接口
- 数据包列表:显示捕获到的数据包
- 数据包详情:显示选中数据包的详细信息
- 十六进制视图:以十六进制格式显示数据包内容
第一次使用可能会觉得界面有点复杂,不过用几次就熟悉了。
开始第一次抓包
选择要监听的网络接口是第一步。一般来说,有线网络选择以太网接口,无线网络选择WiFi接口。双击接口名称就开始抓包了,这时候你会看到数据包开始在列表中滚动显示。
我记得第一次抓包的时候被吓了一跳,数据包刷得太快了,根本看不清。后来才知道现在的网络流量确实很大,即使是正常的系统后台通信也会产生大量数据包。
停止抓包很简单,点击红色的停止按钮就行。抓包文件可以保存为pcap格式,方便后续分析。
过滤器的使用
这里要重点说一下过滤器,因为没有过滤器的Wireshark就像没有搜索功能的百度,基本没法用。
Wireshark有两种过滤器:捕获过滤器和显示过滤器。
捕获过滤器在抓包时就开始工作,只捕获符合条件的数据包。语法比较简单:
host 192.168.10.108 # 只抓取与这个IP相关的包
port 80 # 只抓取80端口的包
tcp # 只抓取TCP协议的包
显示过滤器是在已经抓取的数据包中进行筛选,语法更丰富一些:
ip.addr == 192.168.10.108 # 显示源或目标IP为这个地址的包
tcp.port == 80 # 显示TCP端口为80的包
http.request.method == "GET" # 显示HTTP GET请求
dns # 显示DNS查询
我平时用得最多的几个过滤器:
tcp.flags.reset == 1 # 查找TCP重置包
http.response.code == 404 # 查找404错误
icmp # 查看ping包
arp # 查看ARP请求
实战案例一:网站访问慢问题排查
分享一个典型案例。用户反馈访问公司内部的一个Web系统特别慢,有时候要等十几秒才能打开页面。
我先在用户电脑上开始抓包,然后让用户重现问题。使用过滤器http
只显示HTTP流量,很快就发现了问题。
在数据包列表中,我看到用户的浏览器发出HTTP请求后,服务器响应时间正常,但是在传输过程中出现了大量的TCP重传包。使用过滤器tcp.analysis.retransmission
可以专门查看重传包。
进一步分析发现,重传主要发生在下载CSS和JavaScript文件的时候。这些文件比较大,在网络不稳定的情况下容易出现丢包,导致需要重传,从而影响页面加载速度。
解决方案也很简单,我们在Web服务器上启用了gzip压缩,减小了文件大小,同时调整了TCP窗口大小参数,问题就解决了。
实战案例二:DNS解析异常
还有一次遇到的问题更有意思。用户说访问某些网站时快时慢,很不稳定。
我用过滤器dns
查看DNS查询,发现了一个奇怪的现象:同一个域名的DNS查询,有时候响应很快,几毫秒就返回结果,有时候却要等好几秒。
仔细观察DNS响应包,我发现快的那些查询都是从本地DNS缓存返回的,而慢的查询需要向上游DNS服务器请求。更关键的是,我注意到有些DNS查询根本没有收到响应,过了几秒后客户端才重新发起查询。
用dns.flags.response == 0 and not dns.flags.response == 1
这个过滤器可以找出那些没有得到响应的DNS查询。结果发现确实有不少查询石沉大海了。
问题定位到了DNS服务器,我ping了一下公司配置的DNS服务器,发现丢包率挺高的。后来联系网络管理员才知道,那台DNS服务器最近负载很高,经常处理不过来请求。换了一个更稳定的DNS服务器后,问题就解决了。
这个案例让我印象深刻,因为DNS问题往往不太容易察觉,用户只会感觉"网络慢",但具体慢在哪里很难说清楚。
分析TCP连接问题
TCP连接的建立和断开过程在网络问题排查中特别重要。正常的TCP连接建立需要三次握手:
- 客户端发送SYN包
- 服务器回复SYN+ACK包
- 客户端发送ACK包
在Wireshark中可以用tcp.flags.syn == 1
查看SYN包,用tcp.flags.syn == 1 and tcp.flags.ack == 1
查看SYN+ACK包。
我遇到过一个案例,应用程序连接数据库经常超时。抓包分析发现,客户端发出SYN包后,服务器迟迟不回复SYN+ACK,或者回复得很慢。这通常说明服务器负载过高或者网络延迟太大。
还有一种情况是服务器直接回复RST包,表示拒绝连接。这可能是端口没开放,或者服务没有启动。
TCP连接的断开也值得关注。正常断开是四次挥手过程,但如果看到RST包,说明连接被强制重置了,可能是网络设备或者应用程序主动断开了连接。
HTTP协议分析技巧
HTTP是我们最常分析的协议之一。Wireshark对HTTP的支持很好,可以直接看到请求和响应的内容。
用http.request
可以只显示HTTP请求,http.response
只显示响应。如果要查看特定的HTTP状态码,可以用http.response.code == 500
这样的过滤器。
有一次我们的Web应用出现间歇性的500错误,用户反馈说刷新几次就好了。我抓包分析发现,500错误主要出现在POST请求上,而且都是一些比较大的请求。
通过查看HTTP请求头,我发现这些出错的请求都有一个共同特点:Content-Length比较大。进一步分析服务器日志,发现是因为我们设置的请求体大小限制太小了,超过限制的请求就被拒绝了。
调整了服务器配置后,问题就解决了。这个案例说明,有时候网络层面看起来正常,但应用层可能有问题。
抓包时的注意事项
在实际工作中使用Wireshark需要注意几个问题。
网络权限是第一个要考虑的。在交换网络环境中,你只能抓到发送给本机或者本机发出的数据包,抓不到其他设备之间的通信。如果需要抓取其他设备的流量,可能需要配置交换机的端口镜像功能。
数据量也是个问题。现在的网络流量很大,长时间抓包会产生巨大的文件。我建议设置合适的捕获过滤器,只抓取需要的流量。另外可以设置文件大小限制,让Wireshark自动轮转保存文件。
还有就是要注意数据安全。抓包文件可能包含敏感信息,比如用户名密码、个人数据等。保存和传输抓包文件时要格外小心,用完及时删除。
一些实用的分析技巧
我平时用Wireshark还有一些小技巧分享给大家。
右键点击数据包可以"Follow TCP Stream",这样能看到完整的TCP会话内容,对于分析应用层协议特别有用。
统计功能也很强大,在Statistics菜单下可以看到各种统计信息,比如协议分布、会话统计、IO图表等。这些对于了解网络流量特征很有帮助。
Expert Info功能能自动分析数据包中的异常情况,比如重传、乱序、重复ACK等。虽然不是100%准确,但可以作为问题排查的起点。
时间显示格式也可以调整。默认显示的是相对时间,但有时候需要看绝对时间或者时间差,可以在View菜单中调整。
常见协议的分析要点
除了HTTP和TCP,还有一些协议在日常工作中经常遇到。
DNS协议比较简单,主要关注查询类型、响应时间和返回结果。如果DNS查询时间过长,可能是DNS服务器问题或者网络延迟。
DHCP协议用于自动分配IP地址。DHCP过程包括Discover、Offer、Request、ACK四个步骤。如果设备获取不到IP地址,可以抓包看看是哪个步骤出了问题。
ARP协议用于IP地址和MAC地址的映射。ARP欺骗攻击在企业网络中偶尔会遇到,通过分析ARP包可以发现异常。
ICMP协议主要用于ping和traceroute。除了常见的Echo Request/Reply,还有一些错误消息,比如Destination Unreachable、Time Exceeded等,这些对网络问题诊断很有价值。
安全分析应用
虽然Wireshark主要用于网络问题排查,但在安全分析方面也很有用。
可以通过分析流量模式发现异常行为。比如大量的端口扫描会产生很多TCP SYN包但没有后续的数据传输。
DDoS攻击通常会产生异常的流量模式,比如大量来自不同IP的相同请求。
恶意软件通信也可能被发现。很多恶意软件会定期与C&C服务器通信,这些通信往往有固定的模式。
当然,现在很多通信都是加密的,直接分析内容比较困难,但还是能从流量特征、通信频率、目标地址等方面发现一些线索。
我记得有一次公司网络管理员怀疑有台电脑中了病毒,因为网络流量监控显示这台机器的外网流量异常。我用Wireshark在网关处抓包分析,发现这台机器确实在定期向某个可疑IP发送数据,而且发送的时间间隔很规律,每隔5分钟一次。
虽然数据是加密的,看不到具体内容,但这种行为模式很像恶意软件的心跳包。后来安全团队对那台机器进行了深度检查,果然发现了木马程序。
移动端和WiFi分析
现在移动设备越来越多,WiFi网络的问题也经常遇到。
WiFi抓包比有线网络复杂一些,因为WiFi是共享介质,所有设备的流量都在同一个信道上。而且WiFi还有很多管理帧,比如Beacon、Probe Request/Response等。
我遇到过一个WiFi网络经常断线的问题。通过抓包分析发现,网络中有大量的Deauth(去认证)帧,这通常说明有设备在进行WiFi干扰攻击,或者是AP设备有问题。
还有一次是WiFi连接慢的问题。抓包发现在DHCP阶段耗时很长,原因是DHCP服务器响应慢。这种问题用传统的网络工具很难发现,但Wireshark能清楚地看到整个过程。
云环境和虚拟化网络
现在很多应用都部署在云上,虚拟化网络的问题排查也有一些特点。
在虚拟机中抓包时,可能看不到物理网络的一些细节。比如VLAN标签可能被虚拟交换机处理掉了,物理网络的错误也可能被虚拟化层屏蔽。
容器网络更复杂一些,因为容器之间的通信可能通过各种网络插件实现,比如flannel、calico等。这时候需要在合适的位置抓包,可能是宿主机的网络接口,也可能是容器内部。
我之前排查过一个Kubernetes集群中Pod之间通信异常的问题。在Pod内部抓包看起来正常,但在宿主机上抓包发现数据包被防火墙规则丢弃了。这种问题如果不用抓包分析,很难定位。
自动化和脚本化
对于重复性的分析工作,可以考虑用脚本来自动化。
Wireshark提供了命令行工具tshark,功能和图形界面版本基本一样,但可以在脚本中使用。比如:
# 抓取HTTP流量并保存
tshark -i eth0 -f "port 80" -w http_traffic.pcap
# 分析已有的抓包文件
tshark -r traffic.pcap -Y "http.response.code == 404" -T fields -e frame.time -e ip.src -e http.request.uri
我写过一个监控脚本,定期抓包分析网络质量,如果发现重传率超过阈值就发送告警。这样能提前发现网络问题,而不是等用户投诉。
还可以用Python的scapy库来分析pcap文件,功能更灵活一些。不过对于大部分场景,Wireshark自带的功能就够用了。
学习建议和进阶方向
想要熟练使用Wireshark,最重要的是多练习。可以在自己的环境中故意制造一些问题,然后用Wireshark来分析。
网络协议的基础知识很重要。至少要了解TCP/IP协议栈的基本原理,知道各层协议的作用和交互方式。推荐看看《TCP/IP详解》这本书,虽然比较厚,但讲得很清楚。
实际工作中遇到问题时,不要急着下结论。先用Wireshark收集足够的数据,然后仔细分析。有时候表面现象和真正的原因差别很大。
还可以关注一些网络安全和协议分析的博客、论坛,学习别人的经验。Wireshark官方文档也很详细,遇到不懂的功能可以查阅。
工具的局限性
虽然Wireshark很强大,但也有一些局限性需要了解。
加密流量是最大的挑战。现在HTTPS、TLS越来越普及,很多应用层的问题无法直接通过抓包分析。这时候需要结合应用日志、系统监控等其他手段。
性能也是个问题。在高流量环境中,Wireshark可能跟不上数据包的速度,导致丢包。这时候可能需要专业的网络分析设备。
还有就是抓包位置的选择。在复杂的网络环境中,选择合适的抓包点很重要。有时候需要在多个位置同时抓包,才能完整地分析问题。
实际部署中的经验
在生产环境中使用Wireshark需要格外小心。
我建议先在测试环境中验证分析方法,确认没问题后再在生产环境操作。生产环境的抓包要控制好时间和范围,避免影响正常业务。
抓包文件要及时清理,特别是包含敏感数据的文件。可以设置自动清理脚本,定期删除过期的抓包文件。
团队协作时,要建立统一的分析流程和文档规范。这样其他同事也能快速理解分析结果,提高工作效率。
我们团队现在有一个共享的知识库,记录各种常见问题的Wireshark分析方法。新人入职时,这个知识库能帮他们快速上手。
说了这么多,其实Wireshark就是一个工具,关键还是要理解网络原理和协议机制。工具只是帮助我们更好地观察和分析网络行为,真正解决问题还是要靠扎实的基础知识和丰富的实践经验。
我刚开始用Wireshark的时候,经常被各种数据包搞得头晕,感觉信息太多了不知道从哪里入手。后来慢慢总结出一套分析方法:先看整体流量模式,再关注异常数据包,最后深入分析具体协议细节。这样层层递进,问题就容易定位了。
现在回想起来,Wireshark确实帮我解决了很多棘手的网络问题。有些问题如果没有抓包分析,可能要花几倍的时间才能找到根因。所以我觉得每个做网络运维的同学都应该掌握这个工具。
当然,技术在不断发展,网络环境也越来越复杂。SDN、容器网络、服务网格这些新技术带来了新的挑战,但基本的分析思路是不变的。掌握了Wireshark的使用方法,再学习其他网络分析工具也会容易很多。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记