一、基本语法
过滤主机:
tcpdump -i any host 192.168.1.1
过滤端口:
tcpdump -i any port 80
过滤某一网段:
tcpdump -i any net 192.168.0.0/16
过滤协议:
tcpdump -i eth1 arp/ip/tcp/udp/icmp
常用表达式
非 : ! or "not" (去掉双引号)
且 : && or "and"
或 : || or "or"
抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
常用参数:
-n 不把IP地址解析成域名
-nn 不用域名,不用端口名,使用IP+端口号
-i 指定要抓取数据包的网卡名称 例如:-i ens33 或者 -i any
-c 指定抓取包的个数
tcpdump -i ens33 -c 10 #只抓取10个包
-w 把抓取到的数据存放到文件中供以后分析
常用语句:
tcpdump -i any host 41.50.5.28 -s 0 -w /tmp/28stream.cap #抓包并保存
tcpdump -nn host 172.16.8.56 #抓包实时查看
tcpdump -i bond0 -s 0 -vv -w /tmp/605_5458.pcap host 236.0.1.178 and port 5458 #展示抓到的包数量
tcpdump -X -i any host 41.50.5.28 #实时展示包内容
tcpdump igmp -i bond0 -c 40 and host 239.252.15.220 -s 0 -w /tmp/igmp.cap #抓固定数量的igmp包
二、高级包头过滤
在网关可以用下面的命令看看网络中谁在使用traceroute
tcpdump -i eth1 'ip[8] < 5'
抓大于X字节的包
大于600字节
tcpdump -i eth1 'ip[2:2] > 600'
抓取源端口大于1024的TCP数据包
tcpdump -i eth1 'tcp[0:2] > 1024'
只抓SYN包,第十四字节是二进制的00000010,也就是十进制的2
tcpdump -i eth1 'tcp[13] = 2'
抓SYN, ACK (00010010 or 18)
tcpdump -i eth1 'tcp[13] = 18'
抓SYN或者SYN-ACK
tcpdump -i eth1 'tcp[13] & 2 = 2'
抓PSH-ACK
tcpdump -i eth1 'tcp[13] = 24'
抓所有包含FIN标记的包(FIN通常和ACK一起,表示幽会完了,回见)
tcpdump -i eth1 'tcp[13] & 1 = 1'
抓RST(勾搭没成功,伟大的greatwall对她认为有敏感信息的连接发RST包,典型的棒打鸳鸯)
tcpdump -i eth1 'tcp[13] & 4 = 4'
只抓SYN包
tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
抓SYN, ACK
tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'
抓SMTP数据
tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'
抓取数据区开始为"MAIL"的包,"MAIL"的十六进制为0x4d41494c。
抓HTTP GET数据
tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'
"GET "的十六进制是47455420
抓SSH返回
tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'
"SSH-"的十六进制是0x5353482D
tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'