Linux 基础教程 29-tcpdump命令-1

Linux 基础教程 29-tcpdump命令-1,第1张

    在Linux中输入命令man tcpdump给出的定义如下所示:

是不是感觉很懵?我们用通俗、形象、学术的表达方式来全方位描述tcpdump:

常用选项如下所示:

1、第一个抓包示例

-i : 指定用来抓包的网络接口,这个参数在服务器有多个网卡的时候非常有效

-nn : 不转换协议和端口号,当tcpdump遇到协议号或端口号,不需要将这些数字转换为对应的协议名称或端口名称,如22端口SSH端口,我们希望显示22,而非SSH

-X : 将协议头和包内容原原本本的显示出来,tcpdump会同时以16进制和ASCII的形式进行显示,在协议分析时非常好用。

'port 22' : 告诉tcpdump要有选择的显示所抓到的包,在该示例中,只显示源端口或目的端口是22的数据包,其他的数据包则不显示。

-c : 用来指定抓包的个数,示例设置的个数为1,则代表仅抓取一个包之后就退出不再抓包了。

2、-e 增加数据链路层的头部信息

    通过两个命令的输出对比,可以看到增加-e选项后,输出的结果中增加MAC地址信息。而且在输出内容中会有 oui Unknown ,OUI即Organizationally unique identifier(组织唯一标识符),在任何一块网卡中烧录的6字节MAC地址中,前3个字节体现了OUI,其表明了网卡的制造组织,通常情况下,该标识符是唯一的。在本例中,由于没有识别出网卡的制造商,因此显示为Unknown。

3、-l 将输出变为行缓冲模式

    -l的作用是将tcpdump的输出行为变为 行缓冲 方式,这样可以保证tcpdump遇到换行符,就立即将缓冲的内容输出到标准输出(stdout),方便利用管道或重定向方式进行后续处理,而不会造成延迟。

    在Linux的标准I/O中提供了 全缓冲 行缓冲 无缓冲 三种缓冲方式。标准错误是不带缓冲的,而终端设备常为行缓冲,其他默认则为全缓冲。

    在该例中,将tcpdump输出的内容通过管道提取第5列,可以用来查看详细的连接信息。而如果不加 -l 选项时,则只有当缓冲区全部占满时,tcpdump才会将缓冲区中的内容输出,这样就有可能导致输出不连续的,如果强行结束,则会影响下一行的完整性。

4、-t 输出不加时间戳

    在增加选项 -t 选项后,时间23:48:03.193526就消失了。tcpdump默认情况下是按微秒来计时,因此最一个时间精确到了第6位。

5、 -v 显示详细信息

    在增加 -v 选项后,会在输出的内容中增加 tos ttl id offset 协议编号 总长度 等,如需要理解这些信息,就需要了解TCP/IP协议中的头的具体定义了。

6、-F 指定过滤表达式所在的文件

    在第一个示例中,命令行增加了 'port 22' ,而这一项就叫 过滤条件 ,如果设置了过滤条件,则tcpdump只抓取满足过滤条件的数据包。如需要设置较为复杂的过滤条件或复用过滤条件时,这时可以将过滤条件保存为文件,然后通过-F加载该过滤文件。

7、 -w 将原始数据包信息保存到文件中

    当我们查看保存的文件时,出现的是乱码。则代表无法直接查看,很有可能是二进制文件。那么怎么查看保存的文件了?请看下一个示例。

7、 -r 从文件中读取原始数据包

    通过-w和-r选项即可实现抓包的录制回放功能。

大部分 Linux 发行版都内置了 Tcpdump 工具。如果没有,也可以直接使用对应的包管理器进行安装(如: $ sudo apt-get install tcpdump 和 $ sudo yum install tcpdump )

通过表达式可以对各种不同类型的网络流量进行过滤,以获取到需要的信息。这也是 tcpdump 强大功能的一个体现。

主要有 3 种类型的表达式:

指定网络接口

# tcpdump -i <dev>

原始信息输出模式

# tcpdump -ttttnnvvS

更详细的输出,不解析主机名和端口名,使用绝对序列号,方便阅读的时间戳

通过IP地址过滤

# tcpdump host 10.2.64.1

HEX 输出

# tcpdump -nnvXSs 0 -c1 icmp

通过源地址和目标地址进行过滤

# tcpdump src 10.2.67.203

# tcpdump dst 10.2.67.203

通过子网进行过滤

# tcpdump net 10.2.64.0/24

监听指定端口号

# tcpdump port 515

指定协议

# tcpdmp icmp

端口范围

# tcpdump portrange 21-23

通过包大小过滤

# tcpdump less 32

# tcpdump greater 64

# tcpdump <= 128

写入 PCAP 文件

# tcpdump port 80 -w capture_file

读取 PCAP 文件

# tcpdump -r capture_file

可以通过命令选项的不同组合(使用 逻辑运算符 )完成更复杂的任务。运算符包括以下3种:

# tcpdump src 10.2.64.29 and dst port 80

即捕捉从指定主机(10.2.64.92)发出,且目标端口为 80 的所有网络数据

# tcpdump src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

即捕捉从指定子网(192.168.0.0/16)发送到目标子网(10.0.0.0/8 和 172.16.0.0/16)的所有网络数据

# tcpdump src 192.168.56.1 and not dst port 22

即捕捉从指定主机(192.168.56.1)发出,且目标端口不为 22 的所有网络数据

# tcpdump 'tcp[13] &32!=0' 所有 URGENT ( URG ) 包

# tcpdump 'tcp[13] &16!=0' 所有 ACKNOWLEDGE ( ACK ) 包

# tcpdump 'tcp[13] &8!=0' 所有 PUSH ( PSH ) 包

# tcpdump 'tcp[13] &4!=0' 所有 RESET ( RST ) 包

# tcpdump 'tcp[13] &2!=0' 所有 SYNCHRONIZE ( SYN ) 包

# tcpdump 'tcp[13] &1!=0' 所有 FINISH ( FIN ) 包

# tcpdump 'tcp[13]=18' 所有 SYNCHRONIZE/ACKNOWLEDGE ( SYNACK ) 包

其他指定标志位的方式如:

# tcpdump 'tcp[tcpflags] == tcp-syn'

# tcpdump 'tcp[tcpflags] == tcp-fin'

一些特殊的用法

# tcpdump 'tcp[13] = 6' RST 和 SYN 同时启用的数据包(不正常)

# tcpdump 'tcp[32:4] = 0x47455420' 获取 http GET 请求的文本

# tcpdump 'tcp[(tcp[12]>>2):4] = 0x5353482D' 获取任何端口的 ssh 连接(通过 banner 信息)

# tcpdump 'ip[8] <10' ttl 小于 10 的数据包(出现问题或 traceroute 命令)

# tcpdump 'ip[6] &128 != 0' 非常有可能是黑客入侵的情况

A tcpdump Tutorial and Primer with Examples


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11613028.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存