Linux之tcpdump抓包命令详解

article/2025/9/28 3:18:16

目录

前言

1. 控制抓包行为

2. 控制信息如何显示

3. 控制显示什么数据

4. 过滤命令

4.1 地址过滤

4.2 协议及端口过滤

4.3 报文特征过滤

4.3.1 IP选项设置(20字节,可变部分(0-20)B,最大40字节)

4.3.2 TCP选项设置(基础长度20字节,最长可达60字节)

4.3.3.匹配TCP标志位


前言

Tcpdum是Linux上强大的网络数据采集分析工具。

tcpdump选项可划分为四大类型:
1.控制抓包行为
2.控制信息如何显示
3.控制显示什么数据
4.过滤命令

#tcpdump --help
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]

抓包文件保存:

#tcpdump -i any -s 0 -X -w /tmp/tcpdump.pcap

抓包文件解析:

#tcpdump -A -r /tmp/tcpdump.pcap|less

1. 控制抓包行为

        这一类命令行选项影响抓包行为,包括数据收集的方式。之前已介绍了两个例子:-r 和 -w。
-w 选项允许用户将输出重定向到一个文件,之后可通过-r选项将捕获数据显示出来。
如果用户知道需要捕获的报文数量或对于数量有一个上限,可使用-c选项。
则当达到该数量时程序自动终止,而无需使用kill命令或Ctrl-C。
如收集到100个报文之后tcpdump终止:

 tcpdump -c 100

通过 -i 选项指定接口。在不确定的情况下,可使用ifconfig -a来检查哪一个接口可用及对应哪一个网络。

#tcpdump -i enp131s0 icmp

通过 -p 选项将网卡接口设置为非混杂模式。这一选项理论上将限制为捕获接口上的正常数据流,来自或发往主机,多播数据,以及广播数据。
-s 选项控制数据的截取长度。通常,tcpdump默认为一最大字节数量并只会从单一报文中截取到该数量长度。实际字节数取决于操作系统的设备驱动。通过默认值来截取合适的报文头,而舍弃不必要的报文数据。
如果用户需截取更多数据,通过-s选项来指定字节数。也可以用-s来减少截取字节数。
对于少于或等于200字节的报文,以下命令会截取完整报文:

#tcpdump -s 200

2. 控制信息如何显示

#tcpdump -n -tt -i bond_mgmt port 22
1639923887.526816 IP 172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], seq 1931446332:1931446528, ack 3414141942, win 318, options [nop,nop,TS val 2697135390 ecr 1876028651], length 196

-a,-n,-N和-f选项决定了地址信息是如何显示的。
-a 选项强制将网络地址显示为名称。
-n 阻止将地址显示为名字。
-N 阻止将域名转换。
-f 选项阻止远端名称解析。
-t 和 -tt 选项控制时间戳的打印。-t选项不显示时间戳而 -tt 选项显示无格式的时间戳。

3. 控制显示什么数据

可以通过 -v 和 -vv 选项来打印更多详细信息。例如,-v选项将会打印TTL字段。
要显示较少信息,使用 -q,或quiet选项。
-e 选项用于显示链路层头信息。上例中-e选项的输出为:

#tcpdump -ne -tt -i bond_mgmt port 22
1639923776.246051 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], seq 1929912564:1929912760, ack 3414140358, win 318, options [nop,nop,TS val 2697024109 ecr 1875917372], length 196

-x 选项将报文以十六进制形式dump出来,排除了链路层报文头。-x 和 -vv 选项报文显示如下:

#tcpdump -ne -v -x  -i bond_mgmt port 22
22:26:32.122212 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 190: (tos 0x10, ttl 64, id 23674, offset 0, flags [DF], proto TCP (6), length 176)172.30.136.59.ssh > 172.30.136.114.40948: Flags [P.], cksum 0x698d (incorrect -> 0x5143), seq 1934042648:1934042772, ack 3414143698, win 318, options [nop,nop,TS val 2697239985 ecr 1876133235], length 1240x0000:  4510 00b0 5c7a 4000 4006 74d3 ac1e 883b0x0010:  ac1e 8872 0016 9ff4 7347 2618 cb7f b2d2 ... ...

4. 过滤命令

要有效地使用tcpdump,掌握过滤器非常必要的。过滤允许用户指定想要抓取的数据流,从而用户可以专注于感兴趣的数据。

如果用户很清楚对何种数据流不感兴趣,可以将这部分数据排除在外。如果用户不确定需要什么数据,可以将源数据收集到文件之后再读取时应用过滤器。
实际应用中,需要经常在两种方式之间转换。

简单的过滤器是加在命令行之后的关键字。但是,复杂的命令是由逻辑和关系运算符构成的。对于这样的情况,通常最好用-F选项将过滤器存储在文件中。

非 : ! or "not" (without the quotes)
且 : && or "and"
或 : || or "or"

4.1 地址过滤

过滤器可以按照ip地址选择数据流。例如,考虑如下命令:

#tcpdump -ne -i bond_virt host 192.168.1.122:31:21.456181 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.4 > 192.168.1.1: ICMP echo request, id 9327, seq 54, length 64

通过机器的以太网mac地址来选择数据流:

#tcpdump -ne -i bond_virt ether host fa:16:3e:ed:88:5a
22:32:58.459154 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.4 > 192.168.1.1: ICMP echo request, id 9327, seq 151, length 64

数据流可进一步限制为单向,分别用src或dst指定数据流的来源或目的地。

#tcpdump -ne -i bond_virt dst 192.168.1.4
22:35:15.465312 fa:16:3e:f0:51:b2 > fa:16:3e:ed:88:5a, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, 192.168.1.1 > 192.168.1.4: ICMP echo reply, id 9327, seq 288, length 64

广播和多播数据相应可以使用broadcast和multicast。由于多播和广播数据流在链路层和网络层所指定的数据流是不同的,所以这两种过滤器各有两种形式。过滤器ether multicast抓取以太网多播地址的数据流,ip multicast抓取IP多播地址数据流。广播数据流也是类似的使用方法。注意多播过滤器也会抓到广播数据流。
除了抓取特定主机以外,还可以抓取特定网络。例如,以下命令限制抓取来自或发往224.0.0的vrrp报文:

#tcpdump -ne -i bond_virt net 224.0.0
22:37:15.092693 fa:16:3e:3a:19:69 > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 58: vlan 4003, p 0, ethertype IPv4, 169.254.192.11 > 224.0.0.18: VRRPv2, Advertisement, vrid 69, prio 50, authtype none, intvl 2s, length 20#tcpdump -ne -i bond_virt net 224.0.0.0 mask 255.255.255.0
22:38:14.880908 fa:16:3e:09:5a:de > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 58: vlan 3994, p 0, ethertype IPv4, 169.254.192.143 > 224.0.0.18: VRRPv2, Advertisement, vrid 72, prio 50, authtype none, intvl 3s, length 20

抓取目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据

#tcpdump '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'

4.2 协议及端口过滤

制抓取指定协议如IP,UDP或TCP。还可以限制建立在这些协议之上的服务,如DNS或HTTP。这类抓取可以通过三种方式进行:使用tcpdump关键字,通过协议关键字proto,或通过服务使用port关键字。
当我们继续之前,必须了解tcp/ip包头的头部信息

proto[x:y]          : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出2、3字节(第三、第四字节)(第一字节从0开始排)
proto[x:y] & z = 0  : proto[x:y]和z的与操作为0
proto[x:y] & z !=0  : proto[x:y]和z的与操作不为0
proto[x:y] & z = z  : proto[x:y]和z的与操作为z
proto[x:y] = z      : proto[x:y]等于z

操作符:

>  : greater 大于
<  : lower 小于
>= : greater or equal 大于或者等于
<= : lower or equal 小于或者等于
=  : equal  等于
!= : different  不等于

一些协议名能够被tcpdump识别到因此可通过关键字来指定。以下命令限制抓取UDP数据流:

# tcpdump -ne -i bond_virt udp
22:40:17.030950 90:1b:0e:ea:ea:7e > Broadcast, ethertype 802.1Q (0x8100), length 86: vlan 3122, p 0, ethertype IPv4, 10.34.244.146.49664 > 255.255.255.255.sentinelsrm: UDP, length 40

有很多传输层服务没有可以识别的关键字。在这种情况下,可以使用关键字proto或 ip proto 加上 /etc/protocols能够找到的协议名或相应的协议编号。

# tcpdump -ne -i bond_virt proto 112
22:48:07.891750 fa:16:3e:f3:fb:c8 > 01:00:5e:00:00:12, ethertype 802.1Q (0x8100), length 64: vlan 3981, p 0, ethertype IPv4, 169.254.192.22 > 224.0.0.18: VRRPv2, Advertisement, vrid 234, prio 50, authtype none, intvl 2s, length 20

对于更高层级的建立于底层协议之上的服务,必须使用关键字port。

# tcpdump -nnne -i bond_virt port 137
22:51:58.320013 94:c6:91:7f:bb:f7 > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 96: vlan 3122, p 0, ethertype IPv4, 172.16.0.89.137 > 172.16.0.255.137: NBT UDP PACKET(137): QUERY; REQUEST; BROADCAST

4.3 报文特征过滤

过滤器也可以基于报文特征比如报文长度或特定字段的内容,过滤器必须包含关系运算符。要指定长度,使用关键字less或greater。如下例所示:

# tcpdump -nnne -i bond_virt greater 200
22:54:38.206873 3c:8c:40:ad:11:ff > 01:80:c2:00:00:0e, ethertype LLDP (0x88cc), length 342: LLDP, length 328: NET-ACCE-05-XX.XX.XXX

该命令收集长度大于200字节的报文。

根据报文内容过滤更加复杂,因为用户必须理解报文头的结构。但是尽管如此,或者说正因如此,这一方式能够使用户最大限度的控制抓取的数据。

4.3.1 IP选项设置(20字节,可变部分(0-20)B,最大40字节)

在这里插入图片描述

4.3.1.1 IP version & Hdr Len

一般”的IP头是20字节,但IP头有选项设置,不能直接从偏移21字节处读取数据。IP头有个长度字段可以知道头长度是否大于20字节。
通常第一个字节的二进制值是:01000101,分成两个部分:
0100 = 4 表示IP版本 0101 = 5 表示 IP头32 bit的块数,5 x 32 bits = 160 bits or 20 bytes
如果第一字节第二部分的值大于5,那么表示头有IP选项。

  •  比较第一字节的值是否大于01000101(十进制等于69),这可以判断IPv4带IP选项的数据和IPv6的数据。
#tcpdump 'ip[0] > 69'
  •  位操作(IPv6的数据也可以匹配)

0100 0101 : 第一字节的二进制
0000 1111 : 与操作
0000 0101 : 结果

#tcpdump  'ip[0] & 15 > 5'

或者

#tcpdump  'ip[0] & 0x0f > 5'

4.3.1.2 DF分片标记

  •  Is DF bit (don’t fragment) set?

当发送端的MTU大于到目的路径链路上的MTU时就会被分片
分片信息在IP头的第七和第八字节:
Bit 0: 保留,必须是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片
Bit 2: (MF) 0 = 最后的分片, 1 = 还有分片
Fragment Offset字段只有在分片的时候才使用。

  •  :要抓带DF位标记的不分片的包,第七字节的值应该是:01000000 = 64
#tcpdump  'ip[6] = 64'
# tcpdump -nnne -c 10 -i bond_mgmt  'ip[6] = 64'
11:18:00.670704 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.22 > 172.30.136.114.57414: Flags [P.], seq 3649304248:3649304444, ack 1818371249, win 318, options [nop,nop,TS val 2743528534 ecr 1922421795], length 196
  •  :抓分片包

a:匹配MF,分片包(测试方法:ping -M want -s 3000 114.114.114.114)

# tcpdump -nnne -c 5 -i bond_mgmt  'ip[6] = 32'
11:20:49.542309 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ICMP echo request, id 24301, seq 1, length 1480

b:匹配分片和最后分片

# tcpdump -nnne -c 10 -i bond_mgmt  '((ip[6:2] > 0) and (not ip[6] = 64))'
11:23:34.367123 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ICMP echo request, id 24873, seq 1, length 1480
11:23:34.367136 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 1514: 172.30.136.59 > 114.114.114.114: ip-proto-1
11:23:34.367140 00:e0:ed:2e:43:6e > 00:00:5e:00:01:33, ethertype IPv4 (0x0800), length 82: 172.30.136.59 > 114.114.114.114: ip-proto-1

4.3.1.3 匹配小于ttl的数据报

TTL字段在第九字节,并且正好是完整的一个字节,TTL最大值是255,二进制为11111111。
可以来验证下,我们试着制定一个特需的ttl长度为 256 (ping -M want -s 3000 -t 256 192.168.1.200 ping: ttl 256 out of range)

 # tcpdump -nnne -c 10 -i bond_mgmt 'ip[8] < 80'
11:31:08.076553 00:e0:ed:2e:43:6e > 6c:92:bf:22:7f:d5, ethertype IPv4 (0x0800), length 262: 172.30.136.59.22 > 172.30.136.114.57414: Flags [P.], seq 3649329072:3649329268, ack 1818381829, win 318, options [nop,nop,TS val 2744315940 ecr 1923209214], length 196

4.3.1.4匹配协议头

一般使用语法 proto [ expr : size ]。字段proto指定要查看的报文头,ip则查看IP头,tcp则查看TCP头,以此类推。
expr字段给出从报文头索引0开始的位移。
即:报文头的第一个字节为0,第二字节为1,以此类推。
size字段是可选的,指定需要使用的字节数,1,2或4。

# tcpdump -nnne -vv -i bond_virt "ip[9] = 6"
tcpdump: listening on bond_virt, link-type EN10MB (Ethernet), capture size 262144 bytes
23:05:43.092721 fa:16:3e:26:67:7c > fa:16:3e:ed:88:5a, ethertype 802.1Q (0x8100), length 78: vlan 4030, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 8074, offset 0, flags [DF], proto TCP (6), length 60)

查看第十字节的IP头,协议值为6。注意这里必须使用引号。撇号或引号都可以,但反引号将无法正常工作。

 # tcpdump -nnne -vv -i bond_virt "ip[9] = 1" (ICMP的协议值为1)
23:08:52.719465 fa:16:3e:ed:88:5a > fa:16:3e:f0:51:b2, ethertype 802.1Q (0x8100), length 102: vlan 4030, p 0, ethertype IPv4, (tos 0x0, ttl 64, id 58371, offset 0, flags [DF], proto ICMP (1), length 84)

这一方式常常作为掩码来选择特定比特位。值可以是十六进制。可通过语法&加上比特掩码来指定。

4.3.2 TCP选项设置(基础长度20字节,最长可达60字节)

在这里插入图片描述

 4.3.2.1.抓取源端口TCP数据包

  •  源端口大于1024的TCP数据包
#tcpdump 'tcp[0:2] > 1024'

or

#tcpdump 'tcp src portrange 1025-65535'

4.3.2.2.匹配TCP数据包的特殊标记

TCP标记定义在TCP头的第十四个字节

++++++++++++++
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
++++++++++++++

在TCP 3次握手中,两个主机是如何交换数据
1、源端发送 SYN
2、目标端口应答 SYN,ACK
3、源端发送 ACK
只抓取SYN包,第十四字节是二进制的00000010,也就是十进制的2

  • 只抓取SYN包,第十四字节是二进制的00000010,也就是十进制的2
 #tcpdump 'tcp[13] = 2'
  • 抓取 SYN,ACK (00010010 or 18)
#tcpdump 'tcp[13] = 18'
  •  抓取SYN 或者 SYN-ACK
 #tcpdump 'tcp[13] & 2 = 2'
  • 抓取PSH-ACK
#tcpdump 'tcp[13] = 24'
  •  抓所有包含FIN标记的包(FIN通常和ACK一起)
#tcpdump 'tcp[13] & 1 = 1'
  • 抓取RST
#tcpdump 'tcp[13] & 4 = 4'
  •  抓取TCP连接建立及关闭报文。该过滤器跳过TCP头的13个字节,提取flag字节。掩码0x03选择第一和第二比特位,即FIN和SYN位。如果其中一位不为0则报文被抓取。
# tcpdump -nnne -vv -i bond_mgmt  "tcp[13] & 0x03 != 0"
23:14:51.210165 00:e0:ed:2e:43:6e > 00:e0:ed:49:3d:cd, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 53928, offset 0, flags [DF], proto TCP (6), length 60)172.30.136.59.53094 > 172.30.136.89.6789: Flags [S], cksum 0x6900 (incorrect -> 0x276e), seq 3618113769, win 29200, options [mss 1460,sackOK,TS val 2700139073 ecr 0,nop,wscale 7], length 0
23:14:51.211618 00:e0:ed:2e:43:6e > 00:e0:ed:49:3d:cd, ethertype IPv4 (0x0800), length 66: (tos 0x0, ttl 64, id 53936, offset 0, flags [DF], proto TCP (6), length 52)172.30.136.59.53094 > 172.30.136.89.6789: Flags [F.], cksum 0x68f8 (incorrect -> 0x646a), seq 332, ack 433, win 237, options [nop,nop,TS val 2700139075 ecr 1881252428], length 0
  •  如果需要查找端口号大于23的所有TCP数据流,必须从报文头提取端口字段,使用表达式:
 # tcpdump -nnne -vv -i bond_mgmt "tcp[0:2] & 0xffff > 0x0017"23:12:56.113286 6c:92:bf:22:7f:d5 > 00:e0:ed:2e:43:6e, ethertype IPv4 (0x0800), length 66: (tos 0x10, ttl 64, id 53673, offset 0, flags [DF], proto TCP (6), length 52)172.30.136.114.40948 > 172.30.136.59.22: Flags [.], cksum 0x614b (correct), seq 3414195790, ack 1936528380, win 4372, options [nop,nop,TS val 1878917274 ecr 2700023976], length 0

4.3.3.匹配TCP标志位

4.3.3.1 TCP标记值:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg

  •  实际上有一个很简单的方法过滤 flags(man pcap-filter and look for tcpflags)
#tcpdump 'tcp[tcpflags] == tcp-ack'
  • 抓取所有的包,用TCP-SYN 或者 TCP-FIN 设置
#tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0

下图表示了TCP各状态转换的标记:

在这里插入图片描述
 

tcpdump 提供了常用的字段偏移名字:
icmptype (ICMP类型字段)
icmpcode (ICMP符号字段)
tcpflags (TCP标记字段)
ICMP类型值有:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit,icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply

4.3.3.2 HTTP数据过滤

十六进制转换方法:python -c ‘print “MAIL”.encode(“hex”)’ --> 4d41494c

  •  抓取http请求开始头格式为GET / HTTP/1.1\r\n (16 bytes counting the carriage return but not the backslashes !) “GET ” 十六进制是 47455420
#tcpdump 'tcp[32:4] = 0x47455420'

在这里插入图片描述

  •  查看HTTP GET请求(GET = 0x47, 0x45, 0x54, 0x20),(tcp[12:1] & 0xf0) >> 2 等价于 (tcp[12:1] & 0xf0) /4 ,因为头部的长度为32bit 一个字,偏移量除4获取到data的数组位置。
$offset = ((tcp[12:1] & 0xf0) >> 2)
tcp[$offset:4]
#tcpdump -nnne  -i bond_virt -s 0 -A 'tcp dst port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
  • 查看HTTP POST请求(POST = 0x50, 0x4f, 0x53, 0x54))

查看HTTP请求响应头以及数据

在这里插入图片描述

#tcpdump -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

在这里插入图片描述


#tcpdump -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# tcpdump -nnne  -i bond_virt  -c 5 -X -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

在这里插入图片描述

 4.3.3.3 wireshark分析http包过滤:

按请求头、请求体
http contains "XXXXX" #显示HTTP包中包含指定内容的数据包  
http.request.uri contains "XXXXX" #显示HTTP请求包中包含指定内容的数据包  
http.time >=0.1 #显示HTTP响应时间大于等于指定时间的数据包  
http.request #显示HTTP请求数据包  
http.respone #显示HTTP应答数据包  
http.response.code == 404 #显示代码为404的HTTP响应数据包  
http.content_length < 10 #显示HTTP的内容长度小于指定长度的数据包  
#显示特定时间的数据包 
frame.time == "May 27, 2021 15:23:57.932344000"  
#显示时间间隔的数据包
frame.time >= "May 27, 2021 15:23:57.0" && frame.time < "May 27, 2021 15:23:58.0"  

4.3.3.4 使用tcpdump方式抓取uri包:

  •  抓取请求:GET /me-a-milkshake-please/ HTTP/1.1

过滤表达式:

在这里插入图片描述

tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:4] = 0x2f6d652d && tcp[((tcp[12:1] & 0xf0) >> 2) + 8:4] = 0x612d6d69 && tcp[((tcp[12:1] & 0xf0) >> 2) + 12:4] = 0x6c6b7368 && tcp[((tcp[12:1] & 0xf0) >> 2) + 16:4] = 0x616b652d && tcp[((tcp[12:1] & 0xf0) >> 2) + 20:4] = 0x706c6561 && tcp[((tcp[12:1] & 0xf0) >> 2) + 24:4] = 0x73652f20 && tcp[((tcp[12:1] & 0xf0) >> 2) + 28:4] = 0x48545450 && tcp[((tcp[12:1] & 0xf0) >> 2) + 32:4] = 0x2f312e31
  • 请求头 GET /productlist…

在这里插入图片描述

 tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 && tcp[((tcp[12:1] & 0xf0) >> 2) + 4:4] = 0x2f70726f && tcp[((tcp[12:1] & 0xf0) >> 2) + 8:4] = 0x64756374 && tcp[((tcp[12:1] & 0xf0) >> 2) + 12:4] = 6c697374'

在这里插入图片描述

 4.3.4 链路层数据头选项设置匹配(18字节)
Ethernet II 帧头:6+6+2+4=18Bytes
目标MAC|源MAC|类型|数据|FCS
最小帧长6+6+2+46+4 = 64字节,最大6+6+2+1500+4 = 1518字节。(注:ISL封装后可达1548字节(ISL标记的长度为30字节,思科私有),802.1Q封装后可达1522字节(+4字节vlan信息))

在这里插入图片描述

  •  下例提取从以太网头第一字节开始(即目的地址第一字节),提取低阶比特位,并确保该位不为0,该条件会选取广播和多播报文。
# tcpdump -nnne -vv -i bond_mgmt "ether[0] & 1 != 0"
tcpdump: listening on bond_mgmt, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:52.540436 a0:36:9f:89:0c:66 > 01:00:5e:00:00:12, ethertype IPv4 (0x0800), length 60: (tos 0xc0, ttl 255, id 23668, offset 0, flags [none], proto VRRP (112), length 40)
172.30.140.129 > 224.0.0.18: vrrp 172.30.140.129 > 224.0.0.18: VRRPv2, Advertisement, vrid 151, prio 50, authtype none, intvl 2s, length 20, addrs: 172.30.140.252

 在这里插入图片描述

 Dest MAC: 目的MAC地址
Src MAC: 源MAC地址
帧类型: 0x0806
硬件类型: 1( 以太网)
协议类型: 0x0800( IP地址)
硬件地址长度: 6
协议地址长度: 4
OP: 1( ARP请求) , 2( ARP应答) , 3( RARP请求) , 4( RARP应答)

在这里插入图片描述

  •  抓取vlan号:
#tcpdump -nnne -c 3 -i bond_virt  vlan 1012
  • 老版本内核已不支持tag信息流经libcap,所以下面命令无返回结果(使用vlan vlanid抓包):
#tcpdump -nnne -c 3 -i  bond_virt  'ether[12:2] = 0x8100'#tcpdump -nnne -c 3 -i  bond_virt  'ether[12:2] = 0x8100 and ((ether[14] << 8)+ ether[15]) = 1021 '


http://chatgpt.dhexx.cn/article/D3VWg7fw.shtml

相关文章

纯干货:Linux抓包命令集锦

/****************************************************************************************** *              版权声明 *   本文为本人原创&#xff0c;本人拥有此文的版权。鉴于本人持续受益于开源软件社区&#xff0c; * 本人声明&#xff1a;任何个人…

MySQL数据库约束

文章目录 一、表的约束二、空属性三、默认值四、列描述五、zerofill六、主键1.primary key2.复合主键 七、自增长八、唯一键九、外键 一、表的约束 MySQL数据库是有唯一性约束的&#xff0c;真正对表的字段进行约束的是字段类型&#xff0c;比如我们字段类型规定的取值范围是多…

MySql 数据库【约束】

MySql 数据库【约束】 1. 什么是约束&#xff1f;2. 约束包括哪些&#xff1f;3. 非空约束4. 唯一性约束1. 单字段唯一性约束2. 多字段唯一性约束 5. 主键约束1. 主键约束的相关术语&#xff1f;2. 什么是主键&#xff1f;有啥用&#xff1f;3. 单一主键4. 复合主键5. 其他主键…

MySQL_数据库的约束

文章目录 1. NULL约束 2. UNIQUE(唯一约束) 3. DEFAULT(默认值约束) 4. PRIMARY KEY(主键约束) 5. FOREIGN KEY(外键约束) 数据库的约束就是关系型数据库给我们提供的一种"校验数据"合法性的机制 1. NULL约束 创建表时,可以指定某列不为空 create table stud…

MYSQL--数据库约束

文章目录 1.数据库约束1.1约束类型1.2 null约束1.3 unique:唯一约束条件1.4 default:默认值约束1.5 primary key1.6 foreign key:外键约束 2.表的设计2.1一对一2.2一对多2.3多对多 1.数据库约束 1.1约束类型 not null: 指示某列不能存储null值&#xff1b;unique: 保证某列的…

MySQL 数据库约束

目录 一、数据库约束 1、约束类型 二、NULL 约束 三、unique 约束 四、default 约束 五、primary key 约束 自增主键 六、foreign key 外键约束 七、check 约束 一、数据库约束 我们使用数据库来存储数据&#xff0c;一般是希望这里存储的数据是靠谱的&#xff0c;…

数据库的约束和设计(完整版)

第一部分(约束和表设计) 1、DQL查询语句-limit语句(掌握) LIMIT是限制的意思&#xff0c;所以LIMIT的作用就是限制查询记录的条数 LIMIT语句格式: SELECT 字段 FROM 表名 LIMIT 索引, 显示条数; 索引&#xff1a;从0开始&#xff0c;一直变化 显示条数&#xff1a;每页显示…

MySQL数据库之数据库约束,一文带你了解

前言 从今天开始本系列就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约 【1785】字&#xff0c;不说废话&#xff0c;只讲可以让你学…

数据库的约束和设计

约束 作用 对表中的数据进行进一步的限制, 保证数据的正确性, 有效性和完整性 种类 primary key : 主键约束unique : 唯一约束not null : 非空约束default : 默认值foreign key : 外键约束auto_increment : 自增约束(适用于int数据类型) 主键约束 特点 非空且唯一 注意事项 …

MySQL:数据库的约束

目录 1.数据库约束 1.1 非空&#xff1a;not null 1.2 唯一&#xff1a;unique ​​​​​​​ 1.3 默认值&#xff1a;default 1.4 列描述&#xff1a;comment 1.5 主键约束&#xff1a;primary key 1.6 外键约束 1.7 综合案例 2.插入查询结果 3.聚合函数 4.group by…

oracle数据库:约束

约束简介 约束是数据库用来确保数据满足业务规则的手段&#xff0c;不过在真正的企业开发中&#xff0c;除了主键约束这类具有强需求的约束&#xff0c;像外键约束&#xff0c;检查约束更多时候仅仅出现在数据库设计阶段&#xff0c;真实环境却很少应用&#xff0c;更多是放到…

[数据库]表的约束

●&#x1f9d1;个人主页:你帅你先说. ●&#x1f4c3;欢迎点赞&#x1f44d;关注&#x1f4a1;收藏&#x1f496; ●&#x1f4d6;既选择了远方&#xff0c;便只顾风雨兼程。 ●&#x1f91f;欢迎大家有问题随时私信我&#xff01; ●&#x1f9d0;版权&#xff1a;本文由[你帅…

MySQL数据库,数据的约束

目录 1.数据的约束 1.1约束的类型 1.2NULL约束 1.3UNIQUE约束 1.4DEFAULT约束 1.5PRIMARY KEY约束 1.6FOREIGN KEY约束 1.数据的约束 首先&#xff0c;创建一个名为test的数据库&#xff1a; mysql> create database test charset utf8; Query OK, 1 row affected …

MySQL数据库(数据库约束)

目录 数据库约束 数据库约束的类型&#xff1a; null约束 &#xff1a; unique约束&#xff08;唯一约束&#xff09;&#xff1a; default约束&#xff08;默认值约束&#xff09;&#xff1a; primary key约束&#xff08;主键约束&#xff09;&#xff1a; for…

数据库中的8种常见约束定义

数据库中常见约束的定义理解和应用&#xff08;附代码&#xff09; 首先来说数据库中约束的定义是什么&#xff1f; 约束定义&#xff1a;按照表中的数据规则&#xff0c;如果存在违反约束的数据行为&#xff0c;行为就会被阻止。 一般在创建表之后就会创建相关列的约束&#…

基础SQL第二课:约束

一、约束&#xff1a; 什么是约束&#xff1f; 为了确保表中的数据的完整性(准确性、正确性)&#xff0c;为表添加一些限制。是数据库中表设计的一个最基本规则。使用约束可以使数据更加准确&#xff0c;从而减少冗余数据&#xff08;脏数据&#xff09;。 数据库完整性约束分…

sublime解决中文乱码问题

首先找到你选择的build-system&#xff0c;如下图所示&#xff1a; 第二步&#xff1a;找到preferences下的browse packages&#xff0c;点击进入目录 第三步&#xff1a;找到对应的.sublime-build文件 第四步&#xff1a;打开文件&#xff0c;将"env": {"LANG&…

sublime text 3211 安装中文包

sublime text 3211 安装中文包 安装步骤&#xff1a; 1、打开Sublime Text3&#xff0c;选择Preferences ->Package Contorol 2、在Sublime Text3 弹窗输入install package&#xff0c;选择对应命令,然后鼠标点击安装install package 3、等待一会Sublime Text3 的 insta…

Sublime 中文命名乱码(显示为方框)

今天在使用Sublime中发现&#xff0c;将文件名以部分文字以中文命名&#xff0c;非中文部分能正常显示&#xff0c;中文部分显示不出来。如下图所示 这里就是python能显示出来&#xff0c;其他的汉字就变成了方框。与此对应的现象还有部分文本的部分内容显示为繁体 &#xff0…

解决sublime汉化后部分中文显示为繁体字

解决sublime汉化后部分中文显示为繁体字 1. 问题描述2. 解决方法3. 修正之后的效果 1. 问题描述 使用插件下载汉化包之后&#xff0c;部门字体仍显示为繁体&#xff0c;如下图 这种字体看着实在是别扭的不行 2. 解决方法 找到首选项 -> 设置 添加以下内容 "font_o…