tcpdump网络抓包工具分析
简介
tcpdump 是分析网络和排查网络问题的一个很好用的工具,它通过抓取数据包,显示网络的实时情况,并将结果输出到标准输(STDOUT)上,也可以存储在文件中。
tcpdump是网络数据包截获分析工具。支持针对网络层、协议、主机、网络或端口的过滤。并提供and、or、not等逻辑语句帮助去除无用的信息。
安装
1 | yum install -y tcpdump |
检查可用网卡(interfaces)
查询所有可用的网卡,使用 -D 选项:
1 | sudo tcpdump -D |
上述命令将会列出系统中所有可用的网络接口,包括有线和无线接口,使用 --list-interfaces 选项也可以达到相同的目的:
1 | sudo tcpdump --list-interfaces |
运行结果如下图所示:
抓取某个网卡的数据包
不指定任何参数的时候会监听第一块网卡上经过的数据包。主机上可能有不止一块网卡,所以经常需要指定网卡。使用 -i 选项可抓取某个特定网卡的数据:
1 | tcpdump -i <target-interface> |
在上述命令中
1 | sudo tcpdump -i eth0 |
注:为了方便演示,我们后文中将会使用 eth0 或者 eth1 作为目标网卡。
预设抓包数量
使用 -c 选项可以预设抓包的数量。比如,下面命令将会抓取 4 个数据包:
1 | sudo tcpdump -c 4 -i eth0 |
如果没有预设抓包数量,需要使用 ctrl+c 或者 ctrl+z 手动停止抓包操作。
获取详细输出
使用 -v 选项可以获取详细输出,如下命令:
1 | sudo tcpdump -c 6 -v -i eth0 |
详情的输出,有个详细程度的区别,换句话说,可以使用更多的 -v 标志,比如 -vv 或者 -vvv,这将会在终端上产生更加详细的输出:
1 | sudo tcpdump -vv -i eth0 |
以 ASCII 格式打印抓取到的数据
有时候我们希望数据以 HEX 或者 ASCII 格式展现,这里可以使用 -A 选项来表示以 ASCII 格式,-XX 选项表示以 ASCII 和 HEX 格式展示数据:
1 | sudo tcpdump -XX -i eth0 |
抓取从某个源 IP 发送的数据包
要抓取来自某个特定源 IP 的数据包,可使用如下命令:
1 | sudo tcpdump -i eth0 src <source-ip-address> |
比如,我们查看来自 IP 为 192.168.56.11 的数据:
1 | sudo tcpdump -i eth1 -c 5 src 192.168.56.11 |
上面例子中的计数 5 为只抓取5个数据包。
抓取发送到特定目标 IP 的数据包
如果要检查发送到特定目标 IP 地址的流量,可使用以下命令:
1 | sudo tcpdump -i eth0 dst <source-ip-address> |
比如我们将目标 IP 设为 192.168.56.11,查看流量的详细信息:
1 | sudo tcpdump -i eth1 -c 5 dst 192.168.56.11 |
在 tcpdump 中使用过滤选项
tcpdump 命令提供了一些过滤选项,以缩小抓包数据的范围,这样可以过滤掉一些不必要的数据,以便于分析数据。过滤方式包括主机地址、端口、协议或者其他过滤条件。下面我们来举例说明。
端口号
如果要执行端口号(比如端口22)过滤,可参照如下方式执行 tcpdump 命令:
1 | sudo tcpdump -i eth0 port 22 |
此命令将抓取 TCP 和 UDP 数据流。
协议
与端口号类似,proto 指令根据特定流量过滤数据包捕获。在这里,你可以使用协议名称或协议编号作为参数值:
1 | sudo tcpdump -i eth0 proto tcp |
或者:
1 | sudo tcpdump -i eth0 proto 6 |