一定要了解的tcpdump实用技巧
常见抓包用法
1. 抓取指定主机的网络包
1 | tcpdump -nni eth0 host 192.168.1.100 |
在eth0网卡上抓与主机192.168.1.100相关的数据包,默认直接将数据包打印到屏幕上。
2. 抓取指定端口的网络包
1 | tcpdump -nni eth0 dst port 443 |
在eth0网卡上抓目的端口为443的数据包,直接打印在屏幕上。
3. 抓取指定数量的数据包
1 | tcpdump -nni eth0 host 192.168.1.100 -c 1024 |
指定-c参数,抓取 1024 个数据包就停止
4. 抓包并以文本方式打印显式
1 | tcpdump -nni eth0 port 80 -A |
指定-A选项,将以ASCII格式打印数据包的应用层内容,比如 HTTP 请求就很方便打印可见内容。
常见选项总结
一、基础选项参数
-i:指定从哪个网卡抓包,any 表示抓所有网卡;-n:不解析主机,nn,主机和端口都不解析,不指定可能影响抓包性能;-c:指定抓包的数量,抓够就停止;-s:指定抓包数据包最大长度,0表示抓取完整数据包,不指定使用默认的最大值-D:列出可用于抓包的接口-w:将抓包数据保存在文件中-r:从文件中读取数据-C:指定文件大小,与-w配合使用-F:从文件中读取抓包的表达式;-P:指定要抓取的包是流入还是流出,取值in、out、inout
二、输出选项
-A:以 ASCII 格式打印数据包的应用层内容;-x:以十六进制格式打印数据包,不包括链路层;xx:以十六进制格式打印数据包,包括链路层;-X:以十六进制和 ASCII 格式打印数据包,不包括链路层;XX:以十六进制和 ASCII 格式打印数据包,包括链路层;-e:输出信息中包含数据链路层头部信息-t:显式时间戳,tttt显示更详细的时间-v:显式详细的报文信息,v越多显示越详细
过滤表达式
一、操作对象
type:表示对象的类型host、net、port、portrange如果不指定默认是host
dir:表示传输的方向src、dst
proto:表示协议ether、ip、ip6、arp、icmp、tcp、udp
二、组合条件
or:表示或操作and:表示与操作not:表示非操作
三、表达式示例
host 192.168.1.100:抓取 目的地址 或 源地址 为192.168.1.100的数据包;src host 192.168.1.100:抓取 源地址 为192.168.1.100的数据;dst host 192.168.1.200:抓取 目的地址 为192.168.1.200的数据;port 443:抓取 源端口 或 目的端口 为443的数据包;src port 339:抓取 源端口 为339的数据包;dst port 443:抓取 目的端口 为443的数据包;net 192.168.1.0/24:抓取指定网段的数据包;portrange 900-905:抓取指定端口范围的数据包;
组合条件用法
1. 抓取指定主机和端口的数据包
1 | tcpdump -nni eth0 src host 192.168.1.100 and dst port 80 |
抓取源地址为192.168.1.100且目标端口为80的数据包。
2. 抓取指定主机但非 ssh 数据包
1 | tcpdump -nni eth0 host 192.168.1.100 and not dst port 22 |
3. 指定复杂与或逻辑过滤数据包
1 | tcpdump -nni eth0 'host 192.168.1.100 and (dst port 3389 or 22)' |
抓取主机为192.168.1.100且非3389和非22端口的数据包,注意这里要加单引号,括号是特殊符号。
报文字段过滤
1. 仅抓取TCP连接中的SYN数据包
1 | tcpdump -nni eth0 'tcp[tcpflags] & (tcp-syn) != 0' |
2. 仅抓取TCP连接中的RST数据包
1 | tcpdump -nni eth0 'tcp[tcpflags] & (tcp-rst) != 0' |
3. 仅抓取TCP连接中的FIN数据包
1 | tcpdump -nni eth0 'tcp[tcpflags] & (tcp-fin) != 0' |
4. 抓取TCP连接中的SYN或FIN包
1 | tcpdump -nni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' |
5. 抓取 TCP 连接中包含数据,非SYN、FIN、ACK等数据包
1 | tcpdump -nni eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0' |
ip[2:2]IP 包第 3-4 个字节(16 位总长度)(ip[0]&0xf)<<2IP 包第 1 字节低 4 位,最后结果乘以 4(tcp[12]&0xf0)>>2TCP 包第 13 字节高 4 位(数据偏移)x 4,实际应用数据长度。
6. 仅抓取 HTTP 报文
1 | # 应用数据前四个字符是 'GET ' |



