tcpdump 是一款强大的网络抓包工具,它使用 libpcap 库来抓取网络数据包,这个库在几乎在所有的 Linux/Unix 中都有。
# 1. 基于IP地址过滤
# 根据源ip进行过滤
$ tcpdump -i eth2 src 192.168.10.100# 根据目标ip进行过滤
$ tcpdump -i eth2 dst 192.168.10.200# 2. 基于网段进行过滤:net
$ tcpdump net 192.168.10.0/24
# 根据源网段进行过滤 可以理解为 ip 的前缀
$ tcpdump src net 192.168# 根据目标网段进行过滤
$ tcpdump dst net 192.168# 示例
$ tcpdump -i ens160 src net 10.10
17:11:59.473114 IP 10.10.2.238.55742 > master01.cluster.local.ssh: Flags [.], ack 14604, win 2028, options [nop,nop,TS val 1375892214 ecr 4001186014], length 0
17:11:59.473188 IP master01.cluster.local.ssh > 10.10.2.238.55742: Flags [.], seq 20844:23340, ack 1, win 501, options [nop,nop,TS val 4001186225 ecr 1375892214], length 2496
17:11:59.489447 IP 10.10.2.50.ideafarm-door > 10.10.1.21.41714: Flags [.], ack 149, win 128, length 0
17:11:59.498194 IP 10.10.2.238.55742 > master01.cluster.local.ssh: Flags [.], ack 15852, win 2048, options [nop,nop,TS val 1375892216 ecr 4001186042], length 0
17:11:59.498231 IP master01.cluster.local.ssh > 10.10.2.238.55742: Flags [.], seq 23340:24588, ack 1, win 501, options [nop,nop,TS val 4001186250 ecr 1375892216], length 1248
17:11:59.539698 IP 10.10.2.33.etcd-client > 10.10.2.49.45720: Flags [.], ack 3363427380, win 1432, options [nop,nop,TS val 3296084139 ecr 1511276523], length 0
17:11:59.539699 IP 10.10.2.33.etcd-client > 10.10.2.49.45130: Flags [.], ack 2489720301, win 801, options [nop,nop,TS val 3296084139 ecr 1511276523], length 0
# 可看出筛选出 所有 1 段的源 ip 包,也可以理解为前缀符合 10.10.1
$ tcpdump -i ens160 src net 10.10.1
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
17:13:23.179904 IP 10.10.1.21.41714 > 10.10.2.50.ideafarm-door: Flags [P.], seq 3089274228:3089274265, ack 2296379143, win 3507, length 37
17:13:23.199903 IP 10.10.1.21.41714 > 10.10.2.50.ideafarm-door: Flags [P.], seq 37:74, ack 54, win 3507, length 37
17:13:23.386367 IP 10.10.1.21.41714 > 10.10.2.50.ideafarm-door: Flags [P.], seq 74:111, ack 210, win 3507, length 37
17:13:23.596409 IP 10.10.1.21.41714 > 10.10.2.50.ideafarm-door: Flags [P.], seq 111:148, ack 279, win 3507, length 37# 3. 基于端口进行过滤:port
$ tcpdump port 8088
# 根据源端口进行过滤
$ tcpdump src port 8088# 根据目标端口进行过滤
$ tcpdump dst port 8088# 想要同时指定两个端口你可以这样写
$ tcpdump port 80 or port 8088# 想抓取的不再是一两个端口,而是一个范围,一个一个指定就非常麻烦了,此时你可以这样指定一个端口段
$ tcpdump portrange 8000-8080
$ tcpdump src portrange 8000-8080
$ tcpdump dst portrange 8000-8080# 对于一些常见协议的默认端口,我们还可以直接使用协议名,而不用具体的端口号 比如 http == 80,https == 443 等
$ tcpdump tcp port http# 4. 基本IP协议的版本进行过滤
# 当你想查看 tcp 的包,你也许会这样子写
$ tcpdump tcp# ip 根据版本的不同,可以再细分为 IPv4 和 IPv6 两种,如果你只指定了 tcp,这两种其实都会包含在内。
# 那有什么办法,能够将 IPv4 和 IPv6 区分开来呢?
# 如果是 IPv4 的 tcp 包 ,就这样写
$ tcpdump 'ip proto tcp'# 而如果是 IPv6 的 tcp 包 ,就这样写
$ tcpdump 'ip6 proto tcp'