简介
tcpdump 是一个很常用的网络包分析工具,可以用来显示通过网络传输到本系统的 TCP/IP 以及其他网络的数据包。tcpdump 使用 libpcap 库来抓取网络报,这个库在几乎在所有的 Linux/Unix 中都有。
tcpdump 可以从网卡或之前创建的数据包文件中读取内容,也可以将包写入文件中以供后续使用。必须是 root 用户或者使用 sudo 特权来运行 tcpdump。
在本文中,我们将会通过一些实例来演示如何使用 tcpdump 命令,但首先让我们来看看在各种 Linux 操作系统中是如何安装 tcpdump 的。
安装
tcpdump 默认在几乎所有的 Linux 发行版中都可用,但若你的 Linux 上没有的话,使用下面方法进行安装。
CentOS/RHEL
使用下面命令在 CentOS 和 RHEL 上安装 tcpdump
yum install tcpdump*
Fedora
使用下面命令在 Fedora 上安装 tcpdump
dnf install tcpdump
Ubuntu/Debian/Linux Mint
在 Ubuntu/Debain/Linux Mint 上使用下面命令安装 tcpdump:
apt-get install tcpdump
安装好 tcpdump 后,现在来看一些例子。
案例演示
从所有网卡中捕获数据包
运行下面命令来从所有网卡中捕获数据包:
tcpdump -i any
从指定网卡中捕获数据包
要从指定网卡中捕获数据包,运行:
tcpdump -i eth0
将捕获的包写入文件
使用 -w 选项将所有捕获的包写入文件:
$ tcpdump -i eth1 -w packets_file
读取之前产生的 tcpdump 文件
使用下面命令从之前创建的 tcpdump 文件中读取内容:
$ tcpdump -r packets_file
获取更多的包信息,并且以可读的形式显示时间戳
要获取更多的包信息同时以可读的形式显示时间戳,使用:
$ tcpdump -ttttnnvvS
查看整个网络的数据包
要获取整个网络的数据包,在终端执行下面命令:
$ tcpdump net 192.168.1.0/24
根据 IP 地址查看报文
要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:
$ tcpdump host 192.168.1.100
要指定 IP 地址是源地址或是目的地址则使用:
$ tcpdump src 192.168.1.100 $ tcpdump dst 192.168.1.100
查看某个协议或端口号的数据包
要查看某个协议的数据包,运行下面命令:
$ tcpdump ssh
要捕获某个端口或一个范围的数据包,使用:
$ tcpdump port 22 $ tcpdump portrange 22-125
我们也可以与 src 和 dst 选项连用来捕获指定源端口或指定目的端口的报文。
我们还可以使用“与” (and,&&)、“或” (or,|| ) 和“非”(not,!) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。
使用“与”
可以使用 and 或者符号 && 来将两个或多个条件组合起来。比如:
$ tcpdump src 192.168.1.100 && port 22 -w ssh_packets
使用“或”
或”会检查是否匹配命令所列条件中的其中一条,像这样:
$ tcpdump src 192.168.1.100 or dst 192.168.1.50 && port 22 -w ssh_packets $ tcpdump port 443 or 80 -w http_packets
使用“非”
当我们想表达不匹配某项条件时可以使用“非”,像这样:
$ tcpdump -i eth0 src port not 22
这会捕获 eth0 上除了 22 号端口的所有通讯。
参数的含义如下:
参数 | 含义 |
---|---|
-A | 以ASCII格式打印出所有分组,通常用来抓取www的网页数据包数据。 |
-c | 在收到指定的数量的分组后,tcpdump就会停止。 |
-C | 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。 |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出。 |
-dd | 将匹配信息包的代码以c语言程序段的格式给出。 |
-ddd | 将匹配信息包的代码以十进制的形式给出。 |
-D | 打印出系统中所有可以用tcpdump截包的网络接口。 |
-e | 在输出行打印出数据链路层的头部信息,也就是使用数据链路层的MAC数据包数据来显示. |
-f | 将外部的Internet地址以数字的形式打印出来。 |
-F | 从指定的文件中读取表达式,忽略命令行中给出的表达式。 |
-i | 指定监听的网络接口。 |
-l | 使标准输出变为缓冲行形式,可以把数据导出到文件。 |
-L | 列出网络接口的已知数据链路。 |
-b | 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。 |
-n | 不把网络地址转换成名字。 |
-nn | 不进行端口名称的转换。 |
-N | 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。 |
-t | 在输出的每一行不打印时间戳。 |
-O | 不运行分组分组匹配(packet-matching)代码优化程序。 |
-P | 不将网络接口设置成混杂模式。 |
-q | 快速输出。只输出较少的协议信息。 |
-r | 从指定的文件中读取包(这些包一般通过-w选项产生)。 |
-S | 将tcp的序列号以绝对值形式输出,而不是相对值。 |
-s | 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。 |
-T | 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议)。 |
-t | 不在每一行中输出时间戳。 |
-tt | 在每一行中输出非格式化的时间戳 |
-ttt | 输出本行和前面一行之间的时间差。 |
-tttt | 在每一行中输出由date处理的默认格式的时间戳。 |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。 |
-vv | 输出详细的报文信息。 |
-w | 直接将分组写入文件中,而不是不分析并打印出来。 |
-X | 可以列出16进制以及ASCII的数据包内容,对于监听数据包内容很有用. |
还没有评论,来说两句吧...