引子

之前我一直对tcpdump抵触,但是经过几次尝试之后我想还是喜欢上了它。在讨论原因之前,我们先来了解一下 tcpdump 是什么?

tcpdump 是一个帮助你分析网络流量的工具。我很长时间以来都很害怕它,拒绝学习如何使用它。现在我完全释然了,这里我带你去了解tcpdump,它 很棒,没有必要害怕它。Let’s GO!

tcpdump:基础知识

如果我只是运行sudo tcpdump -i wlan0(请监听无线网络流量!),tcpdump 会显示以下内容:

23:48:26.679315 IP 206.126.112.170.https > kiwi.lan.47121: Flags [P.],
seq 1:42, ack 2294, win 1672, options [nop,nop,TS val 675931991 ecr
60685517], length 41

我第一次运行 tcpdump 时,看了一下类似的输出,然后就出现了 WELP NOPE NOPE NOPE NOPE NOPE NOPE 然后就放弃了 tcpdump。什么是 ecr?什么是 win?什么是 flags?一堆专业的术语。

我几乎不知道这些术语代表什么含义。

后来我知道了需要向 tcpdump 传递一些…参数…才能真正使用它,即使不是 TCP 专家。下面让我们具体分场景写写怎么用。

HTTP 请求慢分析

假设您的机器上有一些慢的 HTTP 请求,并且你想要了解它们的速度分布。有两种方式解决: 1)在自己程序内部加监控。 2)可以使用 tcpdump。它的工作原理如下!

1)使用 tcpdump 记录机器上10分钟的网络流量
2)使用 Wireshark 分析记录
3)成为一名高手

这里的秘密是,我们可以使用 tcpdump记录网络流量,然后使用我们Wireshark在我们的笔记本电脑上对其进行分析。

让我们开始吧!假设我想记录到端口 80(也就是 HTTP)的所有 TCP 流量。然后我可以使用

$ sudo tcpdump -i wlan0  \
               src port 80 or dst port 80 \
               -w port-80-recording.pcap

这将仅过滤往返于端口:80 的数据包(此语法的名称为“pcap 过滤器”)并将数据保存到port-80-recording.pcap。

接下来是 Wireshark!我将从wireshark port-80-recording.pcap

以下是我们开始时看到的:

在这里插入图片描述

这看着挺吓人。每当我发出 HTTP 请求时,可能会有 200 个 TCP 数据包,手动识别和理解这些数据包非常麻烦。但我们可以解决这个问题!我单击了Statistics -> Conversations,它将所有这些不同的数据包组织到 TCP 会话中。让我们看看它是什么样子!

在这里插入图片描述

对我来说,这已经容易理解多了!有12 个左右的 HTTP 请求。有一个“duration”列告诉我们TCP 会话的总持续时间。所以我的一些请求花费了 47 毫秒,而有些请求花费了 655 毫秒。47毫秒的请求来自 Google,655 毫秒的请求来自 ask.metafilter.com。ask.metafilter.com 向我的机器发送了更多数据包(Google 就像“lol 重定向”,10 个数据包,完成),所以我知道它需要更多时间。没什么大不了的。这非常简单!

最近我在自己的工作中统计性能发现有些数据显示一些 HTTP 请求每次耗时约 100 毫秒。我运行了 tcpdump,执行了上述 Wireshark 操作,Wireshark 的结果是“是的,这些请求都耗时 3 毫秒。您的指标是错误的,或者至少计算了网络请求以外的其他内容!”。这是一个非常有用的事实。

使用 tcpdump,我非常有信心它能告诉我网络流量的真实情况,因为这实际上是它的全部工作。我可以捕获数据包并将其与Wireshark一起使用,这是一个非常友好和令人愉快的工具。

pcap 文件

我曾简要提到过,tcpdump 可以让你保存 pcap 文件。这很棒,因为实际上每个网络分析工具都支持 pcap 文件。pcap就是通用的网络包数据格式,对每个工具友好。

过滤数据包

现在让我们想象一下,我们在一个正在发生很多事情的机器上。我们想要捕获一些 TCP 流量,以便稍后进行分析。但不是所有的流量!只有一部分。我之前提到过,您可以使用“pcap 过滤规则”来执行此操作。我只知道如何做两件事——过滤端口和 IP 地址。这是关于 pcap 过滤规则的 3 秒教程(只要3s你完全能看懂)。

stuff being sent to port 80
    dst port 80
    
you can use booleans!
    src port 80 or dst port 80 

here's how to filter on IP:
    ip src 66.66.66.66

我不知道为什么 src port $ip不行只能ip src $ip。如果我弄错了,我就会尝试切换顺序。也可以阅读pcap-filter 手册页并进行更复杂的过滤,但到目前为止,这对我来说已经足够好了。

tcpdum的开销

我观看了Google 员工 Dick Sites 的精彩演讲(如果你对出色的性能故事感兴趣,那么绝对应该观看),他在演讲中提到,每当他引入的性能监控工具占用超过 1% 的资源开销时,他都需要与数据中心管理员进行长时间的认真交谈。他说 tcpdump 就是一个成本过高的例子。

这个说法要因人而异,如果我在收集网络数据包时管理的东西在 10 分钟内变慢了 5%, 我是能接受的。

tcpdump 使用这种 pcap 过滤器语言,thomas ptacek在 Twitter 提到过,这些过滤规则被编译成某种超级高效的东西(使用优化编译器?)。

我的看法是:过滤规则正在收集 500KB/s 左右的网络流量,这可能没什么大不了的,您可以在生产机器上使用 tcpdump。如果您是 Netflix,并且试图将 200MB/s 的数据包保存到磁盘,可能会遇到些麻烦。

我不知道。我从未观察到使用 tcpdump 的任何不良影响,但我确实希望dstat首先了解我可能捕获了多少网络流量,并尝试进行适当的过滤。

用-n参数打印 IP 地址

默认情况下,tcpdump 将尝试对每个 IP 地址进行反向 DNS 查找,以将其转换为主机名。我通常更想看到 IP 地址,而不是主机名,因此我喜欢使用 关闭此功能-n。

输出-n如下:

$ sudo tcpdump -ni any example.com
09:36:10.837004 IP 192.168.1.173.49363 > 192.168.1.1.53: 287+ [1au] A? example.com. (52)
09:36:10.850843 IP 192.168.1.1.53 > 192.168.1.173.49363: 287 1/0/1 A 93.184.216.34 (56)

通过any参数,告诉tcpdump 在任何网络接口上捕获数据包。

更牛逼的工具:tshark 可以查看你的数据包

现在,我们已经知道如何通过 IP 等进行过滤,以及如何使用 wireshark。接下来,我想介绍一下tshark,它是 Wireshark 附带的一个命令行工具。

tcpdump 不了解 HTTP协议或其他网络协议。它几乎了解 TCP 的一切,但它并不关心您在TCP 数据包中放入了什么。但是 tshark 知道您的 TCP 数据包中的全部内容!

假设我想监视我的机器上发生的所有 GET 请求。使用 tshark 非常简单:

$ sudo tshark -i any \
            -Y 'http.request.method == "GET"' \
            -T fields \
            -e http.request.method -e http.request.uri -e ip.dst
            
GET   /hello.html     54.186.13.33
GET   /awesome.html   172.217.3.131
GET   /               172.217.3.131

这会过滤包含 HTTP GET 请求的数据包,然后打印出每个数据包的请求方法和 URI。太棒了!我以前根本不知道这是可能的。HTTP 非常简单。每个人都知道 HTTP。但是tshark 不仅知道 HTTP还能继承Wireshark 的一切功能。

最近,我的工作上的要求想知道从特定机器查询了哪些 Mongo 数据。使用我拥有的工具,这完全不可能。但使用 tcpdump/tshark 没有什么是不可能的!毕竟,这只是网络流量。所以我运行了如下命令:

sudo tshark -i any \
            -f src port $mongo_port or dst port $mongo_port \
            -T fields \
            -e ip.dst -e mongo.full_collection_name

而且由于 tshark 完全理解 Mongo 协议,它立即开始打印出 Mongo 集合名称,我可以清楚地看到发生了什么。太牛逼了,tshark 居然能识别MongoDB的协议吗,你说你值得不值得拥有它。

能动手别逼逼

开启tcpdump之旅吧

如果对机器上的网络流量有疑问,那么 tcpdump 可能就是适合您的工具!如果您有有趣的 tcpdump 故事或其他我未在此处提及的使用方法,本帖下面留言交流。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐