tcpdump抓包工具简单用法

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/

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/270.html
谢谢你请我吃辣条谢谢你请我吃辣条

如果文章对你有帮助,欢迎点击上方按钮打赏作者

最后编辑于:2025/2/27作者: 辣条①号

目标:网络规划设计师、系统工程师、ceph存储工程师、云计算工程师。 不负遇见,不谈亏欠!

暂无评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

arrow grin ! ? cool roll eek evil razz mrgreen smile oops lol mad twisted wink idea cry shock neutral sad ???

文章目录