tcpdump 强大的功能和灵活的策略,主要体现在过滤器(BPF)强大的表达式组合能力。
本节主要分享一些常见的所谓高级用法,希望读者能够举一反三,根据自己实际需求,来灵活使用它。
1. 抓取指定客户端访问 ssh 的数据包
$ tcpdump -ni eth0 src 192.168.1.100 and dst port 22
2. 抓取从某个网段来,到某个网段去的流量
$ tcpdump -ni eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16
3. 抓取来自某个主机,发往非 ssh 端口的流量
$ tcpdump -ni eth0 src 10.0.2.4 and not dst port 22
4. 当构建复杂查询的时候,你可能需要使用引号,单引号告诉 tcpdump 忽略特定的特殊字符,这里的 ()
就是特殊符号,如果不用引号的话,就需要使用转义字符
$ tcpdump -ni eth0
'src 10.0.2.4 and (dst port 3389 or 22)'
5. 基于包大小进行筛选,如果你正在查看特定的包大小,可以使用这个参数
小于等于 64 字节:
$ tcpdump -ni less 64
大于等于 64 字节:
$ tcpdump -ni eth0 greater 64
等于 64 字节:
$ tcpdump -ni eth0 length == 64
6. 过滤 TCP 特殊标记的数据包
抓取某主机发送的 RST
数据包:
$ tcpdump -ni eth0 src host 192.168.1.100 and
'tcp[tcpflags] & (tcp-rst) != 0'
抓取某主机发送的 SYN
数据包:
$ tcpdump -ni eth0 src host 192.168.1.100 and
'tcp[tcpflags] & (tcp-syn) != 0'
抓取某主机发送的 FIN
数据包:
$ tcpdump -ni eth0 src host 192.168.1.100 and
'tcp[tcpflags] & (tcp-fin) != 0'
抓取 TCP 连接中的 SYN
或 FIN
包
$ tcpdump
'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
7. 抓取所有非 ping 类型的 ICMP
包
$ tcpdump
'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
8. 抓取端口是 80,网络层协议为 IPv4, 并且含有数据,而不是 SYN、FIN 以及 ACK 等不含数据的数据包
$ tcpdump
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
解释一下这个复杂的表达式,具体含义就是,整个 IP 数据包长度减去 IP 头长度,再减去 TCP 头的长度,结果不为 0,就表示数据包有 data
,如果还不是很理解,需要自行补一下 tcp/ip
协议
9. 抓取 HTTP 报文,0x4754
是 GET
前两字符的值,0x4854
是 HTTP
前两个字符的值
$ tcpdump -ni eth0
'tcp[20:2]=0x4745 or tcp[20:2]=0x4854'
全部0条评论
快来发表一下你的评论吧 !