Linux下的抓包工具Tcpdump
纸上得来终觉浅,绝知此事要躬行。
tcpdump 就是根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump 可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 and、or、not 等逻辑语句来帮助你去掉无用的信息。

1. 基本语法
主要介绍一下使用 tcpdump 工具时经常会使用到的参数!
过滤表达式可以给 tcpdump 传送过滤表达式来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式。当你传入的过滤表达式含有 shell 通配符时,别忘使用单引号把表达式括起来,以防 shell 自作主张的把含有通配符的表达式先进行了解释和通配。我们可以使用 man pcap-filter 命令来查看帮助信息,你会发现,过滤表达式大体可以分成三种过滤条件,类型、方向和协议,这三种条件的搭配组合就构成。 [1] 过滤主机
- 抓取所有经过 eth2,目的或源地址是 192.168.1.1 的网络数据
- tcpdump -i eth2 host 192.168.1.1
- 指定源地址
- tcpdump -i eth2 src host 192.168.1.1
- 指定目的地址
- tcpdump -i eth2 dst host 192.168.1.1
[2] 过滤端口
- 抓取所有经过 eth2,目的或源端口是 25 的网络数据
- tcpdump -i eth2 port 25
- 指定源端口
- tcpdump -i eth2 src port 25
- 指定目的端口
- tcpdump -i eth2 dst port 25
# 只查目标机器端口是53或80的网络包 dst port 53 dst port 53 1. tcpdump还支持如下的类型 host:指定主机名或IP地址 例如host roclinux.cn或host 202.112.18.34 net :指定网络段 例如arp net 128.3或dst net 128.3 portrange:指定端口区域 例如src or dst portrange 6000-6008 如果我们没有设置过滤类型,那么默认是host 1. tcpdump -i eth0 -c 3 'dst port 53 or dst port 53' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 13:29:04.530130 IP 114.255.192.96.29832 > 116.255.245.206.http: Flags [S], seq 3169042560, win 5840, options [mss 1460,sackOK,TS val 2949111416 ecr 0], length 0 13:29:04.530660 IP 116.255.245.206.43211 > ns.sc.cninfo.net.domain: 40188+ PTR? 206.245.255.116.in-addr.arpa. (46) 13:29:04.548589 IP 114.255.192.96.29832 > 116.255.245.206.http: Flags [.], ack 3709396068, win 5840, options [nop,nop,TS val 2949111475 ecr 1601243970], length 0 3 packets captured 10 packets received by filter 0 packets dropped by kernel
[3] 网络过滤
- tcpdump -i eth2 net 192.168
- tcpdump -i eth2 src net 192.168
- tcpdump -i eth2 dst net 192.168
# 想查看这个源机器和那个目的机器之间的网络包 设置src-source和dst-destination就好了,tcpdump还支持使用and和or来进行搭配组合呢! 如果没有设置的话,默认是src or dst。 1. tcpdump -i eth0 'dst 8.8.8.8' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 13:21:23.281978 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP echo request, id 23081, seq 1, length 64 13:21:24.286663 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP echo request, id 23081, seq 2, length 64 13:21:25.288612 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP echo request, id 23081, seq 3, length 64 ^C 3 packets captured 5 packets received by filter 0 packets dropped by kernel
[4] 协议过滤
- tcpdump -i eth2 arp
- tcpdump -i eth2 ip
- tcpdump -i eth2 tcp
- tcpdump -i eth2 udp
- tcpdump -i eth2 icmp
# 只想抓UDP的包,不被TCP的包打扰 可以把udp改为ether、ip、ip6、arp、tcp、rarp等等 1. 为啥这些协议里没有应用层协议呢? 其实理由很简单,应用层协议非基础类网络协议,经常会新增或淘汰。 tcpdump不会深入到应用层部分去智能解析,所以你看到的tcpdump支持的protocol都是应用层以下的。 1. tcpdump -i eth0 -c 10 'udp' tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 11:25:20.801612 IP 116.255.245.48.54808 > 229.111.112.12.csd-mgmt-port: UDP, length 4 11:25:20.802120 IP 116.255.245.206.54313 > ns.sc.cninfo.net.domain: 5256+ PTR? 12.112.111.229.in-addr.arpa. (45) 11:25:21.145126 IP ns.sc.cninfo.net.domain > 116.255.245.206.54313: 5256 NXDomain 0/0/0 (45) 11:25:21.145315 IP 116.255.245.206.46658 > ns.sc.cninfo.net.domain: 15551+ PTR? 48.245.255.116.in-addr.arpa. (45) 11:25:21.153966 IP 116.255.245.43.62220 > 229.111.112.12.csd-mgmt-port: UDP, length 4 11:25:21.180135 IP 116.255.245.61.hsrp > all-routers.mcast.net.hsrp: HSRPv0-hello 20: state=active group=21 addr=116.255.245.33 11:25:21.231151 IP ns.sc.cninfo.net.domain > 116.255.245.206.46658: 15551 NXDomain 0/0/0 (45) 7 packets captured 8 packets received by filter 0 packets dropped by kernel
[5] 常用表达式
- 非
- ! or not
- 且
- && or and
- 或
- || or or
- 抓取所有经过 eth2,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据
- tcpdump -i eth2 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
- 抓取所有经过 eth2,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
- tcpdump -i eth2 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
- 抓取所有经过 eth2,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据
- tcpdump -i eth2 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'