Tcpdump和Wireshark的学习与使用


背景

2024年2月份农历小年时。
同事为了解决一个应用忽快忽慢的问题去了上海客户那里。
第二天自己在理发时(周末)接到了他的电话,说到了一些问题情况。
比较明确的是,应用和数据库的请求经常出现 20ms 左右的高延迟的情况。

其实子很早之前学习过tcpdump和wireshark,但是具体是啥场景自己已经想不起来了。
同事问到之后只是模糊的进行了一些tcp内核参数比如nodelay、nopush等的说明。

第二天上班后又继续沟通,发现的确与最开始开会时说的可能的问题点很相似。
虽然有一些庆幸自己猜的没偏差太多,但是感觉自己对这几个工具的学习和整理太少了。

网络其实比操作系统还要复杂, 自己还是需要大量的学习和整理才可以。

关于tcpdump和wireshark


基本命令
tcpdump -n -vvvv -i ens32 host 192.168.58.101 and port 8080 -w data.cap
复制
-n:不转换主机名、端口号(开启后看到的是IP地址,而不是主机名,
    实际使用中我们一般都比较关注服务器IP地址)
-v:显示详细信息,v越多信息越多
-i:指定网络接口,也就网卡的名字,常用的有eth0,eth1等,
    如果要监听所有网卡就是用-i any。
-w:抓取的包写入到文件,方便后续分析。实际中经常使用tcpdump抓包保存,
    然后使用Wireshark分析
-r:抓到的包也可以tcpdump打开再分析,tcpdump -n -vvvv -r data.cap 
-c:指定抓取的包的数目
-s:指定抓取的数据的长度

常用过滤条件

常用抓包命令
抓 HTTP GET 数据
tcpdump -i ens33 'tcp[(tcp[12]>>2):4] = 0x47455420'
# "GET "的十六进制是 47455420

抓 SSH 返回
tcpdump -i ens33 'tcp[(tcp[12]>>2):4] = 0x5353482D'
# "SSH-"的十六进制是 0x5353482D

抓 DNS 请求数据
tcpdump -i ens33 udp dst port 53

大于600字节
tcpdump -i ens33 'ip[2:2] > 600'

过滤器规则是tcpdump的核心技能,否则抓取的包太多,也根本无法分析。

过滤器的关键词有:host, port, net, src, dst, icmp, tcp, udp, http
逻辑关键词:and, or, not
包头过滤
 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

TCP的flags

[S] – SYN (开始连接)
[.] – 没有标记 (一般是确认)
[P] – PSH (数据推送)
[F] – FIN (结束连接)
[R] – RST (重启连接)
复制
为了提高网络效率,一个包也可以包含标志的组合,比如[S.],[FP.]

 seq:包序号
 cksum:校验码(见下面常见问题)
 win:滑动窗口大小
 length:承载的数据(payload)长度length,如果没有数据则为0

需要注意:
数据包中出现很多的cksum 0xxxx incorrect错误:
是因为操作系统为了提高网络效率不再计算校验码,
而是交给网卡计算。

tcp与wireshark的联合使用

联合使用方法:

使用 tcpdump 抓包:

tcpdump 是一个在类Unix操作系统中广泛使用的命令行抓包工具。你可以使用它来捕获网络流量,
并将捕获的数据包导出到一个文件中,以供之后分析。
例如,以下命令将捕获来自某个特定网络接口(eth0)的所有数据包,
并将它们保存到一个名为 capture.pcap 的文件中:
tcpdump -i eth0 -w capture.pcap

-i eth0 表明选择名为 eth0 的网络接口进行捕获。 
-w capture.pcap 表明将捕获的结果写入 capture.pcap 文件中。

使用 Wireshark 分析:

当你使用 tcpdump 捕获数据后,可以使用 Wireshark 打开 .pcap 文件进行详细分析。 
Wireshark 提供了用户友好的界面和强大的分析功能,如图表、流量统计、过滤器和协议解码器等。
你只需在 Wireshark 中打开之前保存的 capture.pcap 文件,
就可以看到所有的网络流量,并使用 Wireshark 提供的工具来进行深入分析。

区别与注意事项:

权限:
1. 使用 tcpdump 通常需要 root 权限,因为它需要访问网络接口进行原始数据包捕获。
2. Wireshark 通常不需要 root 权限打开 .pcap 文件进行分析,但捕获数据时需要。

性能考虑:
1. 捕获大量流量时,tcpdump 可以在没有图形用户界面的服务器上运行,减少资源消耗。
    对于可能导致性能下降的高流量网络,使用 tcpdump 的 -C(按文件大小切割)和
    -W(限制文件数量)选项可以轮替保存捕获的文件,避免产生一个非常大的文件。

滤波:
1. tcpdump 的滤波语法与 Wireshark 的不同。了解 tcpdump 
    的滤波语法可以让你更精确地捕获所需数据。
    当使用 tcpdump 过滤数据包时,需要特别小心以确保你不会无意中过滤掉重要的流量。
    
安全性:
1.捕获网络流量可能会涉及敏感数据,因此应确保你有权限进行这些操作,
并确保保存的 .pcap 文件安全。

存储空间:
长时间运行 tcpdump 可能会消耗大量的磁盘空间。
需要定期检查存储空间并根据需要管理 .pcap 文件。

时间同步:
1. 确保抓包时,服务器或计算机的时间是正确同步的,以便对事件进行正确的时间线分析。

将 tcpdump 捕获的数据包在 Wireshark 中进行分析,结合了 tcpdump 的高效数据捕获和 
Wireshark 的强大数据分析能力。通过这种方式,你可以准确、高效地监测和诊断网络问题。

关于wireshark的使用

下载:
https://2.na.dl.wireshark.org/win64/Wireshark-4.2.2-x64.exe
https://2.na.dl.wireshark.org/win64/WiresharkPortable64_4.2.2.paf.exe
# 注意下面这个是 使用手册
https://www.wireshark.org/download/docs/Wireshark%20User%27s%20Guide.pdf

需要注意 可以选择 Portable的安装文件。可以移动文件夹就可以了。 
不需要重启机器

需要说明 这是2024.2.4最新版本的下载地址。

wireshark的简史

Wireshark简史
在1997年末,Gerald Combs需要一种追踪网络问题并且想要学习更多网络知识的工具,
因此他开始编写Ethereal(Wireshark项目的原始名称)来解决这两个问题。
在经历了几次开发停顿后,Ethereal于1998年7月发布了0.2.0版本。
几天后,补丁、bug报告和鼓励的话语纷纷涌现,Ethereal开始走向成功之路。
不久,Gilbert Ramirez看到了它的潜力,并向项目贡献了一个低级解析器。

1998年10月,Guy Harris正在寻找比tcpview更好的工具,
于是开始应用补丁并向Ethereal贡献解析器。

1998年末,Richard Sharpe在进行TCP/IP课程时发现了它在这些课程上的潜力,
并开始检查它是否支持他所需的协议。尽管当时它还未支持这些协议,
但可以轻松地添加新的协议。因此,他开始贡献解析器并提交补丁。
从那时起,为该项目做出贡献的人员名单变得越来越长,
几乎所有的贡献者都是从Wireshark尚未处理的协议开始,然后复制现有的解剖器代码,
并将代码贡献给团队。

2006年,该项目更名为Wireshark。

2008年,经过十年的发展,Wireshark终于发布了1.0版本。
这个发布版本被认为是第一个完整的版本,最低限度地实现了功能。
其发布与第一次Wireshark开发者和用户大会——Sharkfest同时举行。

2015年,发布了Wireshark 2.0版本,这个版本具备了全新的用户界面
。
2023年,Wireshark移交给Wireshark基金会,
这是一个在美国税务法501©(3)条款下运作的非盈利性组织。
该基金会提供项目的基础设施,主办SharkFest(我们的开发者和用户大会),
并倡导低级网络教育。

Wireshark的使用注意事项

今天与李畅老师沟通, 其实wireshark的 tcp流图形是一个很好的工具。

可以使用过滤条件, 选择一定的范围之后, 点击

统计->TCP流图形->显示往返时间等进行展示。

总结

有点长了, 改天继续写wireshark的用法与过滤使用等。