智传网优云课堂,专注分享IT技术
与IT技术爱好者一起共同学习进步

Linux tcpdump抓包命令详解(含安装教程)

1. 前言

对网络工程师和系统工程师而言,如何使用tcpdump命令分析网络流量是一个必须熟悉掌握的任务。tcpdump 是一个运行在命令行下的强大嗅探工具,我们一般俗称抓包工具或者软件。如果你对Windows上的wireshark软件熟悉,那么你可以很快对tcpdump上手,区别在于Windows wireshark使用的是图形界面,而tcpdump是命令行界面。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。

tcpdump 是一个在BSD许可证下发布的自由软件。tcpdump 适用于大多数的类Unix系统 操作系统:包括Linux、Solaris、BSD、Mac OS X、HP-UX和AIX 等等。在这些系统中,tcpdump 需要使用libpcap这个捕捉数据的库。其在Windows下的版本称为WinDump;它需要WinPcap驱动,相当于在Linux平台下的libpcap.

2. Linux安装tcpdump

Ubuntu 安装tcpdump

oucanrong@zcwyou:~$ sudo apt install -y tcpdump

CentOS安装tcpdump

[root@centos7 ~]# yum -y install tcpdump

Running transaction
正在安装 : 14:libpcap-1.5.3-11.el7.x86_64 1/2
正在安装 : 14:tcpdump-4.9.2-3.el7.x86_64 2/2
验证中 : 14:tcpdump-4.9.2-3.el7.x86_64 1/2
验证中 : 14:libpcap-1.5.3-11.el7.x86_64 2/2

已安装:
tcpdump.x86_64 14:4.9.2-3.el7
作为依赖被安装:
libpcap.x86_64 14:1.5.3-11.el7
完毕!

CentOS安装tcpdump

tcpdump 依赖于 libpcap,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。

检查tcpdump运行的位置

[root@centos7 ~]# which tcpdump

/usr/sbin/tcpdump

现在已经可以正常使用tcpdump了。

3. 试试使用tcpdump抓包

如果你没有使用root身份登录系统,请使用sudo获取root权限。

比如Ubuntu系统,一般使用普通账号登录,需要加sudo

查看可以被tcpdump使用的网络接口:

oucanrong@zcwyou:~$ sudo tcpdump -D

[sudo] oucanrong 的密码:
1.vmnet1 [Up, Running]
2.vmnet8 [Up, Running]
3.enp0s25 [Up, Running]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]
5.lo [Up, Running, Loopback]
6.wlp3s0 [Up]
7.bluetooth0 (Bluetooth adapter number 0)
8.nflog (Linux netfilter log (NFLOG) interface)
9.nfqueue (Linux netfilter queue (NFQUEUE) interface)
10.usbmon1 (USB bus number 1)
11.usbmon2 (USB bus number 2)
12.usbmon3 (USB bus number 3)
13.usbmon4 (USB bus number 4)

如果使用root身份登录,不需要加sudo

[root@centos7 ~]# tcpdump -D

1.bluetooth0 (Bluetooth adapter number 0)
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.usbmon1 (USB bus number 1)
5.ens33
6.any (Pseudo-device that captures on all interfaces)
7.lo [Loopback]

查看可以被tcpdump使用的网络接口

tcpdump对任意接口进行抓包:

[root@centos7 ~]# tcpdump -i any

tcpdump对任意接口进行抓包

tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。
在上面的示例中,由于我是通过 ssh 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。

4. 使用-c选项限制 tcpdump 抓包的数量

抓取5个包后自动停止

[root@centos7 ~]# tcpdump -i any -c 5

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
18:07:53.506327 IP centos7.ssh > zcwyou.59564: Flags [P.], seq 2122710787:2122710983, ack 2546646634, win 314, options [nop,nop,TS val 990878 ecr 4069694757], length 196
18:07:53.506506 IP zcwyou.59564 > centos7.ssh: Flags [.], ack 196, win 1444, options [nop,nop,TS val 4069694779 ecr 990878], length 0
18:07:53.506974 ARP, Request who-has gateway tell centos7, length 28
18:07:53.507127 ARP, Reply gateway is-at 00:50:56:ed:46:5b (oui Unknown), length 46
18:07:53.507134 IP centos7.49437 > gateway.domain: 24983+ PTR? 1.87.16.172.in-addr.arpa. (42)
5 packets captured
12 packets received by filter
0 packets dropped by kernel

tcpdump 在抓取 5 个数据包后自动停止了抓包。这在有些场景中十分有用 —— 比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包时,-c 的作用就十分突出了。

5. 指定抓取特定IP和特定端口

只抓取端口为22的流量,抓取5个后停止

[root@centos7 ~]# tcpdump -i any -c5 port 22

抓取网络接口ens33,IP地址为172.16.87.137,端口22的流量。

[root@centos7 ~]# tcpdump -i ens33 host 172.16.87.137 and port 22

在源 IP 和目的 IP 之后,可以看到是 TCP 报文标记段 Flags [P.]。该字段通常取值如下:

值 标志类型 描述
S SYN Connection Start
F FIN Connection Finish
P PUSH Data push
R RST Connection reset
. ACK Acknowledgment

使用!符号排除特定条件,
比如:不抓取目标端口是22的数据包
dst port ! 22

比如:不抓取目标端口是80的数据包
src port ! 80

6. 根据协议过滤

在命令中指定协议便可以按照协议类型来筛选数据包。比方说用如下命令只要抓取 ICMP 报文:

[root@centos7 ~]# tcpdump -i any -c5 icmp

在某台电脑上ping这台Linux服务器

oucanrong@zcwyou:~$ ping centos7

使用TCPdump抓取 ICMP 报文

抓取任意接口,IP地址为172.16.87.137,抓取5个包后自动停止。
-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn host 172.16.87.137

使用TCPdump抓取特定IP流量

抓取特定端口的流量:

[root@centos7 ~]# tcpdump -i any -c5 -nn port 80

使用src选项指定源IP地址192.168.77.98:
-n 选项显示 IP 地址,-nn 选项显示端口号:

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.77.98

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes

使用dst选项指定目标IP地址192.168.88.88:

[root@centos7 ~]# tcpdump -i any -c5 -nn dst 192.168.88.88

7. 根据多条件抓取待定数据包

你可以使用多条件组合来抓取指定的数据包,使用 and 以及 or 逻辑操作符来创建过滤规则。例如,筛选来自源 IP 地址 192.168.122.98 的 HTTP 数据包:

[root@centos7 ~]# tcpdump -i any -c5 -nn src 192.168.122.98 and port 80

你也可以使用括号来创建更为复杂的过滤规则,但在 shell 中请用引号包含你的过滤规则以防止被识别为 shell 表达式:

抓取端口为源IP为192.168.188.8或者123.123.123.123,抓取5个包后停止,

[root@centos7 ~]# tcpdump -i any -c5 -nn "port 80 and (src 192.168.188.8 or src 123.123.123.123)"

8. 显示数据包的详细信息

在以上的示例中,我们只按数据包头部的信息来建立规则筛选数据包,例如源地址、目的地址、端口号等等。有时我们需要分析网络连接问题,可能需要分析数据包中的内容来判断什么内容需要被发送、什么内容需要被接收等。tcpdump 提供了两个选项可以查看数据包内容,-X 以十六进制打印出数据报文内容,-A 打印数据报文的 ASCII 值。

[root@centos7 ~]# tcpdump -i any -c10 -nn -A port 80

9. 保存抓包内容

tcpdump 提供了保存抓包数据的功能以便后续分析数据包。例如,你可以结合Linux计划任务在指定时间抓包,然后早上起来再去分析它。同样当有很多数据包时,显示过快也不利于分析,将数据包保存下来,更有利于分析问题。

使用 -w 选项来保存数据包而不是在屏幕上显示出抓取的数据包:

抓取任意接口的流量,端口为80,抓取10个包后自动停止,保存文件为sample.pcap。

[root@centos7 ~]# tcpdump -i any -c10 -nn -w sample.pcap port 80

为什么要保存后缀名为.pcap,是因为它于wireshark兼容,也就是说,你可以使用wireshark图形界面版的软件打开它。

10. 查看抓包文件的内容

tcpdump 将数据包保存在二进制文件中,所以不能简单的用文本编辑器去打开它。使用 -r 选项参数来阅读该文件中的报文内容:

查看sample.pcap

[root@centos7 ~]# tcpdump -nn -r sample.pcap

这里不需要管理员权限 sudo 了,因为此刻并不是在网络接口处抓包。

根据特定条件查看抓包内容,比如只查看源IP为1.2.3.4的流量

[root@centos7 ~]# tcpdump -nn -r webserver.pcap src 1.2.3.4

当然,你可以在Windows上使用wireshark打开.pcap文件,也可以在Linux图形化界面上安装GUI版的wireshark

CentOS Gnome环境安装图形化的wireshark

[root@centos7 ~]# yum -y install wireshark-gnome

Ubuntu安装图形化的wireshark

oucanrong@zcwyou:~$ sudo apt install wireshark-gtk -y

11. 总结

相信以上教程已经可以帮助你使用强大的 tcpdump 抓包工具了。更多的内容请参考 tcpdump 网站以及它的帮助文件。

tcpdump 官网:
http://www.tcpdump.org/

tcpdump 命令行工具为分析网络流量数据包提供了强大的灵活性。如果需要使用图形工具来抓包请参考 Wireshark。

Wireshark官网地址:
https://www.wireshark.org/

你可以使用 tcpdump命令行在没有 GUI 界面的远程机器上抓包,然后下载到其他机器上使用 Wireshark 中分析数据包。

赞(0)
分享到: 更多 (0)

学习QQ群:557371664

关注微信公众号自助视频学习

评论 抢沙发

评论前必须登录!