说明
TCP协议的Header信息,URG、ACK、PSH、RST、SYN、FIN这6个字段在14字节的位置,对应的是tcp[13],因为字节数是从[0]开始数的,14字节对应的就是tcp[13],因此在抓这几个标志位的数据包时就要明确范围在tcp[13]
示例1
抓取 eth0
网卡上所有 SSH(端口 22)
的 SYN
包(TCP 连接请求包),但不包含 SYN-ACK
包(即仅抓取初始的 SYN
请求)。
tcpdump -i eth0 port 22 and 'tcp[13] & 2 !=0' and 'tcp[13] & 16=0' -n
-
-n
-
不将 IP 地址和端口号解析为主机名和服务名(直接显示数字形式,提高抓包效率)。
-
-
-i eth0
-
指定抓取
eth0
网卡上的流量。
-
-
port 22
-
只抓取 SSH(端口 22) 相关的流量。
-
-
'tcp[13] & 2 != 0'
-
检查 TCP 头部第 14 字节(
tcp[13]
,因为字节从 0 开始计数)的第 2 位(SYN
标志位),2是SYN置1时对应的10进制数字 -
& 2
是位运算,检查SYN
位是否被置 1。 -
!= 0
表示SYN
标志位为 1(即该包是 SYN 包)。
-
-
'tcp[13] & 16 = 0’
-
检查 TCP 头部第 14 字节的第 5 位(
ACK
标志位)。 -
& 16
是位运算,检查ACK
位是否被置 1,ACK置1时对应的10进制数字就是16 -
= 0
表示ACK
标志位为 0(即该包 不是 ACK 包)。
-
示例2
看下面这个例子,只抓syn+ack的包
tcpdump -ni eth0 port 22 and 'tcp[13] & 18 = 18'
1. ‘tcp[13] & 18 =18’
tcp[13]表示第14个字节,二进制表示为 11 11 11 11
第一个18表示syn与ack同时置1的10进制,对应的二进制是 00 01 00 10
这两者进行与运算,11 11 11 11 & 00 01 00 10 = 00 01 00 10 换算成10进制就是18
2. 上步说明中的00 01 00 10分别代表什么意思,我们再进一步说明
第一个00 表示保留位,8位一字节,标志位只有6个因此要增加两个0凑成一个字节
01 其中0便是URG、1是ACK
00 表示PSH、RST都置0
10 表示SYN置1,FIN置0
3. 为什么 'tcp[13] & 18 != 0' 不仅能抓到syn+ack的包还能抓到很多其他包
原因是 & 18表示的是syn或者ack至少一个置1,因此抓到的包比较宽泛,包括syn、syn+ack、ack