整理下tcpdump的常见抓包用法
tcpdump使用
tcpdump可以将网络数据包截获下来提供分析,支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来进行过滤
常用选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| -i <iface> 指定网口,例如 -i eth0 -c <count> 捕获指定数量的数据包后退出 -w <file> 将抓到的数据包写入文件,例如.pcap,方便Wireshark分析 -n 不解析主机名,直接显示IP地址 -nn 不解析主机名和端口号,显示数字形式
-A 以ASCII形式显示内容(可读,适合HTTP请求) -v / -vv / -vvv 增加输出的详细程度 -s <snaplen> 指定抓包长度,默认 262144 字节 -X 显示数据包的 十六进制 + ASCII -XX 显示以太网头 + 十六进制 + ASCII -r <file> 从抓包文件读取数据 -tt / -ttt / -T 显示时间戳格式,可精确到微秒
type host(主机名,域名,IP 地址), net, port, portrange protocol ether, ip,arp, tcp, udp, wlan direction src, dst, src or dst , src and ds
|
常用示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| # tcpdump host 1.1.1.1 -w ./$(date +%Y%m%d%H%M%S).pcap
# tcpdump net 1.2.3.0/24
# tcpdump less 32 或 tcpdump greater 64
# tcpdump -vvAls0 src 10.5.2.3 and dst port 3389
# tcpdump dst 192.168.0.2 and src net 192.168.0.0/24 and not icmp and not dst port 22
# tcpdump -v -n port 67 or 68
# tcp[13] & 4 !=0 SYN 包 tcp[13] & 4 !=0 and tcp[13] & 16 !=0 SYN-ACK 包 tcp[13] & 4 !=0 and tcp[13] & 16 ==0 仅SYN(不含ACK) tcp[13] & 16 !=0 ACK 包 tcp[13] & 1 !=0 FIN 包 tcp[13] & 2 !=0 RST 包 tcp[13] & 2 ==0 非RST 包
# tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -20
# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# tcpdump port http or port ftp or port smtp or port imap or port pop3 or port telnet -l -A | egrep -i -B5 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user '
|
tcpdump理解
在网络包的发送和接收过程中,绝大部分的工作都是在内核态完成的,那么运行在用户态的程序tcpdump是如何实现抓到内核态的包的?
tcpdump是通过socket系统调用,在内核源码中用到的ptype_all中挂载了函数钩子。无论是在网络包的接收还是发送,都会在网络设备层遍历ptype_all中的协议,并执行其中的回调,tcpdump命令就是基于这个底层原理来工作的。
- netfilter过滤的包tcpdump是否可以抓到
在接收的过程中,由于tcpdump在前,所以完全可以捕获到命中netfilter过滤规则的包
在发送的过程中,由于网络包先经过协议层,这时如果被netfilter过滤掉,tcpdump就抓不到了
参考: