tcpdump工具详解

概述

tcpdump语法图解

在这里插入图片描述

常用过滤规则

其实就是ip,端口过滤。

基于ip地址过滤(host/dst/src)

  • 案例1:捕获特定主机192.168.0.108的主机收到的和发出的所有的数据包。
tcpdump host 192.168.0.108

只捕获源ip、目的ip为host的报文。
如果你非常明确哪个主机的收发报文,那么久可以直接过滤这个主机的数据包。host后面加主机的IP地址,就可以只抓取这个主机的所有数据包,其他主机的数据包就会被过滤掉。

  • 案例2:获取目的地址是192.168.0.108的报文
    tcpdump dst 192.168.0.108
    tcpdump src 192.168.0.108
    说明:dst指的是目的地址;src是源地址,这两个是确定传输方向的关键字。
[root@localhost ~]# tcpdump dst 192.168.0.108
16:34:24.227160 IP localhost.centos8 > 192.168.0.108: ICMP echo request, id 2731, seq 11, length 64

[root@localhost ~]# tcpdump src 192.168.0.108
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:34:31.254655 IP 192.168.0.108 > localhost.centos8: ICMP echo reply, id 2731, seq 18, length 64

基于网段过滤(net)

  • 案例3: 捕获特定网段192.168.10.0/24内的所有主机收到和发出的所有数据包。
    tcpdump net 192.168.10.0/24
[root@localhost ~]# tcpdump net 192.168.10.0/24
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
16:49:32.551044 IP localhost.centos8 > 192.168.10.108: ICMP echo request, id 2731, seq 909, length 64
16:49:32.552961 IP 192.168.10.108 > localhost.centos8: ICMP echo reply, id 2731, seq 909, length 64

说明:tcmdump net 192.168.10.0/24,指明192.168.10.0/24网段,可以直接过滤这个网段的数据包,网段同样可以再细分为源网段和目标网段。

tcpdump src net 192.168.0.0/24
tcpdump dst net 192.168.0.0/24

基于端口号过滤(port)

案例:获取特定端口,比如http的包

tcpdump tcp port 80

说明:port 80指明端口80,之后抓取这个80端口的数据包;加上具体某个协议的某个端口,就可以更加精确的捕获对应的业务数据报文了。

tcpdump src port 80 / tcmpdump dst port 80

如果你想要同时指定两个端口,可以这样写:

tcpdump port 80 or port 22 
# 或者
tcpdump port 80 or 22

如果想抓取的不再是一两个端口,而是一个范围,一个个指定非常麻烦,此时可以指定一个端口段。

tcpdump portrange 8000-8080
tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080

对于一些常见协议的默认端口,我还可以直接使用协议名,而不用具体的端口号:比如http:80,https:443等。

tcpdump tcp port http

基于协议过滤

部分协议可以直接根据协议名称过滤,比如icmp。

tcpdump icmp

说明:表明要抓取的协议报文,一般常用的比如ip、ip6、arp、icmp、tcp、udp等。
但是,http,dns,https,ssh等这些应用层的协议,不能直接这样写,需要写成。
tcpdump port http或者tcpdump port 53(DNS)

常用参数

tcpdump -h 查看所以参数

-i 指定监听网络接口

tcpdump -i eth0

默认监听在第一块网卡上,监听所以经过此网卡的数据包;
在-i 参数后面跟具体需要捕获的接口名称,就可以抓取经过这个具体接口的所有数据包。

tcpdump -i ens33
tcpdump -i lo
tcpdump -i any  监听所以的网卡接口,用来查看是否有网络流量。

-w 将捕获到的信息保存到文件中,且不分析和打印在屏幕

tcpdump -i eth0 -w tt.cap

报文打印在shell里会太多且不方便查看,我们可以保存成文件。
保存的文件可以设置成cap或者pcap的格式,可以直接用wireshark工具打开,可以用wireshark工具分析报文具体信息。

-r 从文件中读取数据,读取后,我们可以使用过滤规则语法进行过滤分析

tcpdump -r tt.cap

-n/-nn/-N

-n 不把ip转换成域名,直接显示ip,避免执行DNS lookups,速度会快很多

tcpdump -n

-nn 不把协议和端口号转换为名称,速度也会快很多

tcpdump -nn

-N 不打印出host的域名部分

-t/-tt/-ttt/-tttt

-t:在每行的输出中不输出时间
-tt:在每行的输出中会输出时间戳
-ttt:输出每两行打印的时间间隔(以毫秒为单位)
-tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)

-v/-vv/-vvv

-v:产生详细的输出。比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
-vv:产生比-v更详细的输出。比如NFS回应包中的附加域将会被打印,SMB数据包也会被完全解码。
-vvv:产生比-vv更详细的输出。比如telnet时所使用的SB、SE选项将会被打印,如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来。

-c 指定捕获数据包的次数

在收到指定数量的数据包后退出tcpdump,停止抓包 --count

tcpdump -c 20 -w tt.pcap

说明抓满20个报文后,就停止tcpdump抓包。

-C 与-w file选项配合使用,超过指定的大小写入新文件

该选项使得tcpdump在把原始数据包直接保存到文件中之前,检查此文件大小是否超过file-size。如果超过了,将关闭此文件,另创一个文件继续保存原始数据包。新创建的文件名与-w选项指定的文件名一致,但文件名后多一个数字,该数字会从1开始随着新创建的文件增加。file-size的单位是百万自己(这里指1,000,000字节,并发1,048,576个字节)。

tcpdump -C 1 -W 3 -w abc 

说明:指定一个单位后(1MB)就换文件,最多3个文件,名字是abc0,abc1,abc2,不会停止,字节会循环写入到3个文件中。

-Q 选择是入方向还是出方向的数据包,可选项有:in,out,inout,也可以使用–direction=[direction]

tcpdump -Q in
tcpdump -Q out
tcpdump -Q inout

-q 简洁打印输出。即打印很少的协议相关信息,从而输出行都比较简单。

-D 显示所以可用网络接口的列表

-L 列出网络接口的已知数据链路

-s 指定每个包捕获的长度,单位是byte

如果不想使用默认的262144byte,可用指定 -s size,超过了设定的大小限制,包就会被截断,在打印行出现[proto]这种标识,这个proto就是被截断的报文的协议名字。抓取的len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,从而导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小也会(-s 0 使用默认长度262144)。

[root@localhost ~]# tcpdump -s 50 -Q in
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 50 bytes
22:41:38.253812 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]
22:41:38.293013 ARP, Request who-has localhost.centos8 tell _gateway, length 46
22:41:38.293319 IP _gateway.domain > localhost.centos8.50624: [|domain]
22:41:38.299668 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]
22:41:38.332530 IP _gateway.domain > localhost.centos8.59378: [|domain]
22:41:38.346794 IP _gateway.domain > localhost.centos8.38725: [|domain]
22:41:38.347403 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]
22:41:38.370391 IP 192.168.195.1.61513 > localhost.centos8.ssh: [|tcp]
22:41:38.370727 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]
22:41:38.413841 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]
22:41:38.455860 IP 192.168.195.1.61512 > localhost.centos8.ssh: [|tcp]

说明:不同的tcpdump版本,默认抓取的报文长度不一样。

-A/-X

-A:以ASCII格式打印出所有的分组并且读取次文件,这样可以使读取更加简单,方便使用grep 等工具解析输出内容。

tcpdump -A -r tt.cap
tcpdump -A |grep baidu

-X:表示同时使用十六进制和ASCII字符串显示报文。-X和-A两个参数不能同时使用。

tcpdump -X -r tt.cap

-e 输出行打印出数据链路层头部信息

默认情况下tcpdump不会显示数据链路层信息,使用-e 选项可以显示源、目的MAC地址,已经VLAN tag信息。

[root@localhost ~]# tcpdump -Q in -e -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:23.372166 00:50:56:c0:00:08 (oui Unknown) > 00:0c:29:43:91:a3 (oui Unknown), ethertype IPv4 (0x0800), length 66: 192.168.195.1.61586 > localhost.centos8.ssh: Flags [.], ack 2824820130, win 4116, options [nop,nop,TS val 47903996 ecr 3170123672], length 0
22:55:23.483869 00:50:56:c0:00:08 (oui Unknown) > 00:0c:29:43:91:a3 (oui Unknown), ethertype IPv4 (0x0800), length 102: 192.168.195.1.61587 > localhost.centos8.ssh: Flags [P.], seq 2648613208:2648613244, ack 847890799, win 4100, options [nop,nop,TS val 47904107 ecr 3170063824], length 36

-F指定使用那个文件的过滤表达式抓包

使用-F命令时,命令行上的输入过滤规则将被忽略。

tcpdump -F filter_rule.txt -c 10

这种情况适用于将表达式放置在文件中长期维护。

-l 对标准输出进行行缓冲

式标准输出设备遇到一个换行符就马上把这行内容打印处理。
在需要同时观察抓包打印以及保存记录的时候很有用。
比如,可通过下面命令组合来达到在抓包时保存到文件的同时打印抓包内容。
简单说就是边打印边保存,实时查看和内容保存都不耽误。

tcpdump -l | tee data.cap

这命令是使用tee把tcpdump的输出同时放到文件data.cap和标准输出中。tee:读取标准输入的数据,并将其内容输出成文件。

tcpdump -l > data.cap & tail -f data.cap

抓包内容保存到data.cap且实时查看data.cap的内容。

逻辑运算符 and or not

and:所有的条件都需要满足,也可以表示为&&
or:只要有一个条件满足就可以,也可以表示为||
not:取反,也可以使用!

示例

  • and例子:抓一个来自100.100.30.26主,80端口的包。
    tcpdump src 100.100.30.26 and port 80
  • or例子:抓取UDP 53端口或者TCP 53端口的包
    tcpdump tcp port 53 or udp port 53
  • not例子:抓取不是22端口的报文
    tcpdump not tcp port 22
  • 多个过滤器进行组合:需要用于括号,而括号在shell中是特殊符号,因此需要使用引号将其包含
    tcpdump “src 10.0.2.4 and (dst port 3389 or 22)”
  • 监听目的主机192.168.56.1,源主机192.168.56.210,ip协议的80端口,且排除www.baidu.com通信的所有数据包
    tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host ! www.baidu.com
    或者
    tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host not www.baidu.com

基于包大小进行过滤

查看指定大小的数据包
案例:抓取包大小小于32 byte的数据包
tcpdump less 32
案例:抓取包大小大于1000 byte的数据包
tcpdump greater 1000

参考

Linux网络抓包分析工具(tcpdump、wireshark)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
tcpdump 是一款常用的网络抓包工具,可以捕获网络数据包并将其打印出来,常用于网络故障排除、网络性能分析等。以下是 tcpdump 命令的详解: 1. 命令格式 ``` tcpdump [选项] [过滤表达式] ``` 2. 常用选项 - -i:指定抓包的网络接口,如 -i eth0; - -c:指定抓包的数量,如 -c 100,表示只抓取前 100 个数据包; - -n:不将 IP 地址和端口号转换为域名和服务名称; - -X:以十六进制和 ASCII 码形式显示数据包的内容; - -w:将抓包结果保存到文件中,如 -w capture.pcap; - -r:读取保存到文件中的抓包结果,如 -r capture.pcap。 3. 过滤表达式 过滤表达式用于过滤需要捕获的数据包,常用的过滤表达式包括: - host:指定 IP 地址或域名; - port:指定端口号; - tcp、udp、icmp:指定协议类型; - src、dst:指定源IP地址或目的IP地址。 以下是一些常用的过滤表达式示例: - 捕获所有数据包:tcpdump -i eth0; - 捕获指定协议类型的数据包:tcpdump -i eth0 icmp; - 捕获指定 IP 地址的数据包:tcpdump -i eth0 host 192.168.1.1; - 捕获指定端口号的数据包:tcpdump -i eth0 port 80; - 捕获指定源IP地址和目的IP地址的数据包:tcpdump -i eth0 src 192.168.1.1 and dst 192.168.1.2。 以上就是 tcpdump 命令的详解。在实际使用中,我们可以根据需要结合选项和过滤表达式来捕获和分析网络数据包,从而进行网络故障排除和性能优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

融极

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值