文章目录
tcpdump 能抓取什么数据包(默认每个包只抓68+28=96个字节的说法应该是错误的)
tcpdump 直接从网络驱动层,抓取输入数据,不经过任何linux网络协议栈,iptables依赖netfilter模块,它工作在linux网络协议栈中.
#所以:
tcpdump 能 抓取被 iptables在INPUT 链上 DROP的数据
tcpdump 不能 抓取被 iptables在OUTPUT链上 DROP的数据
tcpdump 常用参数介绍
tcpdump -D 显示所有的网络接口(网卡)(可以用它先查看系统有哪些接口可以抓包)
tcpdump -l 开启行缓冲模式
tcpdump -i eth0 指定抓取某个网卡的流量
tcpdump -c 100 指定抓取数据包的数量,这里是100个数据包
tcpdump -r file.cap 读取数据包
tcpdump -s 0 抓取完整的数据包
tcpdump -n 不进行域名解释,不要将IP地址和端口号进行转换,进行转换会耗费CPU时间(只以ip地址形式显示)
tcpdump -t 在输出的每一行不打印时间戳
tcpdump -e 在输出行打印出数据链路层的头部信息
tcpdump -p 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。可以有效地过滤噪声。
tcpdump -a 将网络地址和广播地址转变成名字
tcpdump -v 输出稍详细的报文信息,-vv 输出更详细的报文信息
tcpdump -w /var/log/shuju.log 将抓取的数据包保存为shuju.log,并不显示在终端上
tcpdump -G 60 指定间隔60秒,每隔60秒就保存一个文件,通常与-w 文件名中的时间变量一同使用,见下面的高级用法
%d 每月中的第几天,十进制数字从01到31。
%H 表示当前的小时时间,十进制数字从00到23。
%M 表示当前的分钟时间,十进制数字从00到59。
%S 表示当前的秒时间,十进制的00到60
tcpdump udp 指定抓取udp协议的数据包
tcpdump port 80 指定抓取80端口的数据包
tcpdump src port 80 指定抓取源端口为80的数据包
tcpdump dst port 80 指定抓取目的端口为80的数据包
tcpdump portrange 1-1024 指定抓取的端口范围
tcpdump host www.wsfnk.com 指定抓取包含主机为www.wsfnk.com的所有数据包
tcpdump host 192.168.1.1 指定抓取包含主机为192.168.1.1的所有数据包
tcpdump src host 192.168.1.1 抓取来自192.168.1.1的数据包
tcpdump dst host 192.168.1.1 抓取去往192.168.1.1的数据包
tcpdump greater 1000 指定抓取大于1000字节的数据包
tcpdump less 15 指定抓取小于15字节的数据包
tcpdump -A 指定以ascii码的形式显示数据包的内容
tcpdump -X 以十六进制和ascii码两种形式显示包的内容
tcpdump 中过滤器 和 其他类型关键字 介绍
tcpdump 过滤器介绍
# tcpdump 的过滤器
host: # Host 过滤器
network: # Network 过滤器(可以使用CIDR模式,可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x))
proto: # Proto 过滤器(关键字为 proto,可省略,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp)
# 因为通常的协议名称是保留字段,所以在与proto指令一起使用时,必须根据shell类型使用一个或两个反斜杠(/)来转义。
# Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。
port: # Port 过滤器
# 如下分别是示例
tcpdump host 1.2.3.4 # 抓取 访问 1.2.3.4 的数据包
tcpdump src host 1.2.3.4 # 抓取 来自 1.2.3.4 的数据包
tcpdump net 192.168.1 # 抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量
tcpdump net 10 # 抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量
tcpdump src net 10 #
tcpdump src net 172.16.0.0/12 # 还可以使用CIDR
tcpdump -n proto \\icmp # 抓取icmp协议(第一种写法)
tcpdump -n icmp # 抓取icmp协议(第二种写法)
tcpdump port 389
tcpdump 其他类型关键字介绍(方向、协议、逻辑运算、Other)
1、确定传输方向的关键字
dst or src(缺省值) 指定源或者目标地址是 10.215.20.13 的流量包
src: src 10.9.51.13, 指定源地址是 10.9.51.13
dst: dst net 172.0.0.0, 指定目标网络地址是 172.0.0.0
dst and src 比如: src host 10.9.51.13 and dst host 10.215.20.13
2、协议的关键字(缺省值是监听所有协议的信息包)
ip
arp
rarp
tcp
udp
icmp
fddi
3、三种逻辑运算
非 : ! , not
与 : && , and
或 : || , or
4、其他关键字
gateway
broadcast
less
greater
例子:tcpdump 的逻辑组合及流量过滤
与 tcpdump tcp and src host 192.168.1.1 and port 80
或 tcpdump src host 192.168.1.1 or src host 192.168.1.2
非 tcpdump tcp and src host 192.168.1.1 and not port 80
tcpdump 的常规用法
tcpdump 的行缓冲模式
如果想实时将抓取到的数据通过管道传递给其他工具来处理,需要使用 -l 选项来开启行缓冲模式
使用 -l 选项可以将输出通过立即发送给其他命令,其他命令会立即响应。
tcpdump -i eth0 -s0 -l port 80 | grep 'Server:'
截获来自主机1.1.1.1的所有数据
tcpdump -v -i eth0 src host 1.1.1.1
截获发往1.1.1.1的所有数据
tcpdump -v -i eth0 dst host 1.1.1.1
抓取来自192.168.60.0/22网络的所有数据(注意这里的CIDR形式,注意一定要是网络地址,不能是广播地址,也不能是net中的其中一个主机地址,不然会报错的)
tcpdump -v -i eth0 'src net 192.168.60.0/22'
抓取vlan 10的所有数据
tcpdump -v -i eth0 vlan 10
tcpdump -ei eth0 vlan 10
tcpdump -ei eth0 | grep -i vlan
抓取vxlan 的数据包
tcpdump -evi phy-ext 'udp port 4789'
tcpdump -evi phy-ext 'udp port 4789 and src 164.155.204.2 and dst 154.201.73.254'
抓取pppoe的密码数据
tcpdump -v -i eth0 pppoes
抓取arp协议的数据包
tcpdump -v -i eth0 arp
抓取指定mac地址的数据包
tcpdump -ni eth0 ether src 34:17:eb:e4:b3:ca
抓取以太网地址数据
tcpdump ether host fa:26:3e:01:3c:40
抓取dhcp协议的数据包(dhcp使用udp 67 和68端口)
tcpdump -ni eth0 udp port 67 or port 68
[root@zjmf-controller ~]# tcpdump -ni eth0 udp port 67 or port 68
12:17:59.701212 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 34:17:eb:e5:87:d0, length 548
12:18:00.069302 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 34:17:eb:e5:8c:e3, length 548
12:18:01.895974 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 34:17:eb:e5:ad:37, length 548
抓取ospf协议的数据包(下面两个命令功能相同)(注意:抓tcp时不能写成ip proto tcp,应写成ip proto 6 )
tcpdump -v -i eth0 ip proto ospf
tcpdump -v -i eth0 ip proto 89
抓取端口范围的数据包(抓取21-23端口的所有数据包)
tcpdump -i eth0 portrange 21-23
抓取主机172.16.1.253访问服务器22端口的所有数据包
tcpdump -v -i eth0 src host 172.16.1.253 and dst port 22
抓取源ip是172.16.1.122且端口不是22的数据包
tcpdump -v -i eth0 src host 172.16.1.122 and not port 22
把抓取的数据包记录到123.cap文件中,当抓取1000个数据包后就退出程序。
tcpdump -v –i eth0 -c 1000 -w 123.cap
读取数据包文件,匹配显示 tcp的22端口数据
tcpdump -r /root/123.cap tcp and port 22 -v
抓取 300s 的dns 请求数据,并保存成文件dns_traffic.pcap
tcpdump udp port 53 -G 300 -W 1 -w dns_traffic.pcap
=========================
使用tcpdump抓取交换机连接的端口
有时候需要知道服务器连接到了哪个交换机的哪个端口。这是如果连接的交换机支持LLDP或CDP协议,并启用了该协议。那我们就可以用过tcpdump来抓取物理连接信息。
对于LLDP,协议号是0x88cc。于是我们可以使用以下tcpdump命令来抓取到我们想要的信息。
tcpdump -i eth0 ether proto 0x88cc -A -s0 -t -c 1
对于使用CDP协议的交换机,一般是Cisco的交换机。可以使用下面命令。即把LLDP的协议号换成CDP的协议号0x2000
tcpdump -i eth0 ether proto 0x2000 -A -s0 -t -c 1
巧用tcpdump 配合pv命令查看网卡实时速率
root@majorpve:~# tcpdump -i vmbr0 -w - | pv -bert >/dev/null
tcpdump: listening on vmbr0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
^C29MiB 0:00:19 [19.5KiB/s]
tcpdump 的高级用法
使用tcpdump抓取HTTP报文(注意tcp[20:2] 其中2应该表示的是两个16进制位)
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
#0x4745 这是十六进制表达式,0x表示十六进制,47=G,45=E,意思是GE
#0x4854 这是十六进制表达式,0x表示十六进制,48=H,54=T,意思是HT
#-XvvennSs 0 表示完全显示,就类似wireshark的三分栏
抓192.168.1.123的80端口和110和25以外的其他端口的包
tcpdump -i eth1 host 192.168.1.123 and ! port 80 and ! port 25 and ! port 110
抓取主机1.1.1.1和所有主机(除20.20.20.8)的通信数据包
tcpdump host 1.1.1.1 and !20.20.20.8
抓取主机1.1.1.1与192.168.1.5的通信,或则1.1.1.1与192.168.2.3的通信
tcpdump host 1.1.1.1 and \(192.168.1.5 or 192.168.2.3 \)
抓取源ip是172.16.1.2且目的端口是22,或源ip是172.16.1.65且目的端口是80的数据包。
tcpdump -v -i eth0 \( src host 172.16.1.2 and dst port 22 \) or \( src host 172.16.1.65 and dst port 80 \)
抓取源ip是172.16.1.59且目的端口是22,或源ip是172.16.1.68且目的端口是80的数据包。(上面和这种写法建议写成这种)
tcpdump -i eth0 -v 'src host 172.16.1.59 and dst port 22' or ' src host 172.16.1.68 and dst port 80 '
每隔60秒保存一次数据包文件,文件名是以年-月-日_时:分:秒.cap的形式进行命名的,一致持续抓包,持续保存数据包
tcpdump -G 60 -s 0 -i eth0 -w ip_%Y-%m-%d_%H:%M:%S.cap
#-G 指定间隔60秒,与-w 文件名中的时间变量一同使用,就是隔60秒,保存一个文件
tcpdump如何分割pcap数据包
tcpdump -r /root/123.cap -c 1000 -w out-123.cap
#将123.cap前一千个数据包导出保存为新的 文件 out-123.cap(这个文件可以使用wireshark直接打开)
提取 HTTP 用户代理
# 从 HTTP 请求头中提取 HTTP 用户代理:
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
# 通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
只抓取 HTTP GET 和 POST 流量
下述两个表达式中的十六进制将会与 GET 和 POST 请求的 ASCII 字符串匹配。
例如,tcp[((tcp[12:1] & 0xf0) >> 2):4]
首先会确定我们感兴趣的字节的位置(在 TCP header 之后),然后选择我们希望匹配的 4 个字节。
# 抓取 HTTP GET 流量
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# 抓取 HTTP POST 请求流量
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包.
附:理解tcpdump的输出
# 截取数据只是第一步,第二步就是理解这些数据,下面就解释一下 tcpdump 命令输出各部分的意义
21:27:06.995846 IP (tos 0x0, ttl 64, id 45646, offset 0, flags [DF], proto TCP (6), length 64)
192.168.1.106.56166 > 124.192.132.54.80: Flags [S], cksum 0xa730 (correct), seq 992042666, win 65535, options [mss 1460,nop,wscale 4,nop,nop,TS val 663433143 ecr 0,sackOK,eol], length 0
21:27:07.030487 IP (tos 0x0, ttl 51, id 0, offset 0, flags [DF], proto TCP (6), length 44)
124.192.132.54.80 > 192.168.1.106.56166: Flags [S.], cksum 0xedc0 (correct), seq 2147006684, ack 992042667, win 14600, options [mss 1440], length 0
21:27:07.030527 IP (tos 0x0, ttl 64, id 59119, offset 0, flags [DF], proto TCP (6), length 40)
192.168.1.106.56166 > 124.192.132.54.80: Flags [.], cksum 0x3e72 (correct), ack 2147006685, win 65535, length 0
# 此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是 SYN 报文,这个可以通过 Flags [S] 看出。下面是常见的 TCP 报文的 Flags:
[S] : SYN(开始连接)
[P] : PSH(推送数据)
[F] : FIN (结束连接)
[R] : RST(重置连接)
[.] : 没有 Flag (意思是除上四种类型外的其他情况,有可能是ACK也有可能是URG) 如第二条数据的 [S.] 表示 SYN-ACK,就是 SYN 报文的应答报文。
tcpdump如何快速测量网络带宽
[root@localhost ~]# tcpdump -i ens18 -w - | pv -bert >/dev/null
tcpdump: listening on ens18, link-type EN10MB (Ethernet), snapshot length 262144 bytes
174MiB 0:01:06 [11.5MiB/s]
附:更多关于数据包分析过滤案例,请参考该文章:
linux如何对pcap数据包进行分割与合并、过滤与分析等操作
网友的文章参考 https://www.sundayhk.com/post/linux-tcpdump/
网友的文章参考 https://www.sundayhk.com/post/tcpdump/
如果文章对你有帮助,欢迎点击上方按钮打赏作者
暂无评论