安装protocol命令
网络协议的头部封装的字段很难记住,需要查资料,这里介绍一种在linux
执行protocol
命令来展示协议的头部封装信息。
-
在
zabbixserver
虚机下载:git clone https://github.com/luismartingarcia/protocol.git
-
进入
/root/protocol
安装:./setup.py install
-
执行命令:
protocol ip
tcpdump练习
是否设置了IP选项
我们知道正常的ipv4
报头的长度通常为20字节,如果设置有option
字段,报头会更长。
ipv4
报头具有报头长度字段,我们将在此处对其进行筛选,以了解报头长度是否超过了20字节。
+-+-+-+-+-+-+-+-+
|Version| IHL |
+-+-+-+-+-+-+-+-+
通常,第一个字节的二进制值为0100 0101
0100 = 4 in decimal. This is the IP version.
0101 = 5 in decimal. This is the number of blocks of 32 bits in the headers. 5 x 32 bits = 160 bits or 20 bytes.
如果报头设置了ip
选项,则第一个字节的后半部分将大于5.
我们有两种方法可以处理这种筛选/过滤
- 尝试匹配大于01000101的值。这将匹配设置了
ip
选项的ipv4
流量,但也会匹配任何ipv6
的流量。
01000101十进制的值=64 + 4 + 1 = 69
过滤规则配置为:tcpdump 'ip[0] > 69'
- 正确的方法:掩盖第1个字节的前4位(
version
)0100 0101 : 1st byte originally 0000 1111 : mask (0xf in hex or 15 in decimal). 0 will mask the values while 1 will keep the values intact. --------- 0000 0101 : final result
所以正确的过滤应该为:
tcpdump 'ip[0] & 15 > 5'
(十进制)
tcpdump 'ip[0] & 0xf > 5'
(十六进制)- keep the last 4 bits intact, use (binary 00001111)0xf
- keep the first 4 bits intact, use (binary 11110000)0xf0
是否设置了DF位(不分段)
现在让我们尝试怎样知道ip
报文是否发生了分片。分片是不可取的。当发送方的mtu
大于目标路径上的路径mtu
时,就会发生分片。
分片信息可以在ip
报头的第7和第8个字节中找到。
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bit 0: reserved, must be zero
Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment.
Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments.
fragment offset
字段仅在发生分片时使用。
-
如果我们想匹配
DF
位为1(即不进行分片):tcpdump 'ip[6] = 64'
-
匹配分片
MF
(更多分片位),这将匹配分片数据报文,但不匹配最后一个分片。
tcpdump 'ip[6] = 32'
tcpdump 'ip[6] & 0xE0 =32'
-
最后一个分片的前3位设置为0。但在
fragment offset
字段中有数据。
tcpdump '((ip[6:2] > 0) and (not ip[6] = 64))'
第7个字节前3位为000,即是分片报文的最后一个报文
第7个字节前3为为001,即是不是最后一个报文的分片报文
tcpdump '(ip[6] & 0xE0 =0) or (ip[6] & 0xE0 =32)'
如果要测试分片,可以用-s
:ping -s 3000 192.168.1.1
匹配具有低TTL的数据报文
TTL
字段位于第9个字节中,占1字节,因此TTL
字段的最大值为255.
我们可以尝试在网关上使用以下的命令来查看我们的网络上是否有人正在使用traceroute
tcpdump 'ip[8] < 5'
验证可以使用 ping -t 3 192.168.1.200
匹配长度超过X字节的数据报文
tcpdump 'ip[2:2] > 600'
其中X为600字节。
TCP过滤
-
匹配源端口>1024的
TCP
流量:tcpdump 'tcp[0:2] > 1024'
或tcpdump tcp src portrange 1025-65535
-
将
TCP
流量与特定标志位组合匹配,标志位在TCP
报头的第14个字节中定义。
+-+-+-+-+-+-+-+-+
|C|E|U|A|P|R|S|F|
|W|C|R|C|S|S|Y|I|
|R|E|G|K|H|T|N|N|
+-+-+-+-+-+-+-+-+
如果我们只想匹配仅设置了syn
标志位的数据包,则第14个字节的二进制为00000010,等于十进制的2:tcpdump 'tcp[13] = 2'
匹配syn-ack
,二进制为00010010,等于十进制的18:tcpdump 'tcp[13] = 18'
匹配syn
或syn-ack
的数据包:tcpdump 'tcp[13] & 2 = 2'
匹配psh-ack
数据包:tcpdump 'tcp[13] = 24
-
匹配任何包含
FIN
组合的数据包:tcpdump 'tcp[13] & 1 = 1'
匹配RST
标志位:tcpdump 'tcp[13] & 4 = 4'
留言