实用的 tcpdump 常用命令
对于 tcpdump 的使用,大部分管理员会分成两类。有一类管理员,他们熟知 tcpdump 和其中的所有标记;另一类管理员,他们仅了解基本的使用方法,剩下事情都要借助参考手册才能完成。出现这种情况的原因在于, tcpdump 是一个相当高级的命令,使用的时候需要对网络的工作机制有相当深入的了解。在linux操作系统中, tcpdump 命令用来保存和记录网络流量。linux就该这么学,你可以用它来观察网络上发生了什么,并可用来解决各种各样的问题,包括和网络通信无关的问题。除了网络问题,我经常用 tcpdump 解决应用程序的问题。如果你发现两个应用程序之间无法很好工作,可以用 tcpdump 观察出了什么问题。 tcpdump 可以用来抓取和读取数据包,特别是当通信没有被加密的时候。
工具/原料
tcpdump命令工具
基础操作
1、不转换主机名、端口号# tcpdump -n通常情况下, tcpdump 会尝试查找和转换主机名和端口号。# tcpdump你可以通过 -n 标记关闭这个功能。我个人总是使用这个标记,因为我喜欢使用 IP 地址而不是主机名,主机名和端口号的转换经常会带来困扰。但是,知道利用 tcpdump 转换或者不转换的功能还是相当有用的,特别是有些时候,知道源流量(source traffic)来自哪个服务器是相当重要的。

2、增加详细信息# tcpdump -v增加一个简单 -v 标记,输出会包含更多信息,例如一个 IP 包的生存时间(ttl, time to live)、长度和其他的选项。tcpdump 的详细信息有三个等级,你可以通过在命令行增加 v 标记的个数来获取更多的信息。通常我在使用 tcpmdump 的时候,总是使用最高等级的详细信息,因为我希望看到所有信息,以免后面会用到。# tcpdump -vvv -c 1

4、写入文件# tcpdump -w /path/to/filetcpdump 运行结果会输出在屏幕上。但很多时候,你希望把 tcpdump 的脶巴躔炒输出结果保存在文件中,最简单的方法就是利用 -w 标记。如果你后续还会检查这些网络数据,这样做就特别有用。将这些数据存成一个文件的好处,就是你可以多次读取这个保存下来的文件,并且可以在这个网络流量的快照上使用其它标记或者过滤器(我们后面会讨论到)。# tcpdump -w /var/tmp/tcpdata.pcap

6、指定抓包大小# tcpdump -s 100较新版本的 tcpdump 通常可以截获 65535 字节,但某些情况下你不需要截获默认大小的数据包。运行 tcpdump 时,你可以通过 -s 标记来指定快照长度。
7、指定抓包数量# tcpdump -c 10tcpdump 会一直运行,直至你用 CTRL+C 让它退出。你也可以通过 -c 标记后面加上抓包的数量,让 tcpdump 在抓到一定数量的数据包后停止操作。当你不希望看到 tcpdump 的输出大量出现在屏幕上,以至于你无法阅读的时候,就会希望使用这个标记。当然,通常更好的方法是借助过滤器来截获特定的流量。
8、基础知识汇总# tcpdump -nvvv -i any -c 100 -s 100你可以将以上这些基础的标记组合起来使用,来让 tcpdump 提供你所需要的信息。

4、只显示源地址为特定主机的流量# tcpdump -nvvv -i any -c 3 src host 10.0.3.1前面的例子显示了源和目的地址是 10.0.3.1 的流量,而上面的命令只显示数据包源地址是 10.0.3.1 的流量。这是通过在 host 前面增加 src 参数来实现的。这个额外的过滤器告诉 tcpdump 查找特定的源地址。 反过来通过 dst 过滤器,可以指定目的地址。

6、查找两个特定瞿搋村乇端口和来自特定主机的数据流# tcpdump -nvvv -i any -c 20 '(port 80 or port 443) and host 10.0.3.169'前面的例子用来排查多端口的协议问题,是非常有效的。如果 Web 服务器的数据流量相当大, tcpdump 的输出可能有点混乱。我们可以通过增加 host 参数进一步限定输出。在这种情况下,我们通过把 or 表达式放在括号中来保持 or 描述。

6、非 TCP 数据流ICMP 数据包# tcpdump -nvvv -i any -c 2 icmpUDP 数据包# tcpdump -nvvv -i any -c 2 udp