代码改变世界

常用 tcpdump 抓包方式

2019-01-24 15:29  云物互联  阅读(570)  评论(0编辑  收藏  举报

目录

tcpdump 指令

tcpdump(dump the traffic on a network)是 Linux 强大网络数据采集分析工具,可以将网络中传输的数据包(涵盖整个 TCP/IP 协议族的数据包)完全截获下来提供分析。它支持针对网络层、协议、主机、网络接口或端口的过滤,并提供 and、or、no t等逻辑原语来帮助你筛选出关注的信息。

基本上 tcpdump 的输出格式为:

系统时间 源主机.端口 > 目标主机.端口 数据包参数

官方网站:tcpdump

关键字

关于类型

  • host - 主机:host 210.27.48.2 指明 210.27.48.2 是一台主机
  • net - 网络(网段):net 10.0 指明 10.0 是一个网络地址
  • port - 端口:port 23 指明端口号是 23

NOTE:缺省类型是 host。

关于传输方向

  • src - 源:src 210.27.48.2 指明 IP 数据包中的源 IP 地址是 210.27.48.2
  • dst - 目标:dst net 10.0 指明 IP 数据包中的目的网络地址是 10.0
  • dst or src
  • dst and src

NOTE:缺省方向是 src or dst

关于协议

  • ip
  • arp
  • rarp
  • tcp
  • udp
  • fddi

NOTE: 缺省是所有协议的包

关于逻辑条件

  • and
  • or
  • not

NOT:不同的关键字之间结合使用需要逻辑运算符

其他

  • gateway
  • broadcast
  • less
  • greater

常用指令选项

Help:

[root@localhost ~]# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips  26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
		[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
		[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
		[ -Q|-P in|out|inout ]
		[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
		[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
		[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
		[ -Z user ] [ expression ]
  • -i:指定监听的 interface
  • -n:不启用主机名解析,显示 IP 地址,默认显示为 hostname
  • -nn:不启用主机名解析与端口名称转换,显示端口号,默认显示端口号对应的服务名
  • -c:指定抓取数据宝的数量
  • -D:显示操作系统当前所有可以使用 tcpdump 抓包的 interface 设备名
  • -b:在数据链路层上选择协议,包括 ip、arp、rarp、ipx 等
  • -N:不显示主机名中的域名部分。e.g. hostname nic.ddn.mil 只输出nic
  • -t:不打印时间戳
  • -tttt:输出 date 默认格式的时间戳
  • -q:只输出少量的协议信息
  • -v:输出稍微详细的信息,例如输出 IP 数据包中的 ttl 和服务类型信息
  • -vv:输出详细的报文信息
  • -vvv:输出更加详细的报文信息
  • -w:直接将抓取的数据包信息写入文件
  • -P:指定要抓取的包是流入还是流出包,可以指定 in、out、inout 参数,默认为 inout
  • -s len:设置抓取的数据包长度为 len,默认为 65535Byte,如果要抓取的数据包长度大于 len,可能会发生包截断。
  • -S 将 TCP 的序列号以绝对值形式输出,而不是相对值

常规操作示例

在这里插入图片描述

NOTE: 测试环境 IP 172.18.22.200,hostname localhost.localdomain.ssh

过滤主机

抓取经过指定 interface 的,并且 DST_IP 或 SRC_IP 是 172.18.22.200 的数据包。

tcpdump -i ens160 host 172.18.22.200
  • 筛选 SRC_IP,抓取经过 interface 且从 172.18.22.200 发出数据包
tcpdump -i ens160 src host 172.18.22.200
  • 筛选 DST_IP,抓取经过 interface 且发送到 172.18.22.200 的数据包
tcpdump -i ens160 dst host 172.18.22.200

应用场景:你希望查看发送到 host 172.18.22.208 的数据包有没有经过当前主机的 ens160 网卡

[root@localhost ~]# tcpdump -i ens160 -nnt -c 1 dst host 172.18.22.208 and icmp
...
IP 172.18.128.204 > 172.18.22.208: ICMP echo request, id 27729, seq 138, length 64

过滤端口

抓取经过指定 interface 的,并且 DST_PORT 或 SRC_PORT 是 22 的数据包。

tcpdump -i ens160 port 22
  • 筛选 SRC_PORT
tcpdump -i ens160 src port 22
  • 筛选 DST_PORT
tcpdump -i ens160 dst port 22

应用场景:你希望查看发送到 host 172.18.22.208 的 22 号端口的数据包有没有经过当前主机的 ens160 网卡

[root@localhost ~]# tcpdump -i ens160 -nnt -c 1 dst host 172.18.22.208 and port 22
...
IP 172.18.128.204.60812 > 172.18.22.208.22: Flags [S], seq 908466914, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 949822094 ecr 0,sackOK,eol], length 0

过滤网络(网段)

抓取经过指定 interface 的,并且 DST_NET 或 SRC_NET 是 172.18.22 的数据包。

tcpdump -i ens160 net 172.18.22
  • 筛选 SRC_NET
tcpdump -i ens160 src net 172.18.22
  • 筛选 DST_NET
tcpdump -i ens160 dst net 172.18.22

过滤协议

tcpdump -i ens160 icmp
tcpdump -i ens160 ip
tcpdump -i ens160 tcp
tcpdump -i ens160 udp
tcpdump -i ens160 arp

复杂的逻辑表达式过滤条件

抓取经过 interface ens160,发送到 host 172.18.22.208 或 172.18.22.200 的 TCP 协议 22 号端口的数据包。

[root@localhost ~]# tcpdump -i ens160 -nntvv -c 10 '((tcp) and (port 22) and ((dst host 172.18.22.208) or (dst host 172.18.22.200)))'
...
IP (tos 0x10, ttl 61, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.128.204.59180 > 172.18.22.200.22: Flags [.], cksum 0x89d7 (correct), seq 3833060046, ack 3808611483, win 4092, options [nop,nop,TS val 950233961 ecr 87616963], length 0
IP (tos 0x10, ttl 61, id 0, offset 0, flags [DF], proto TCP (6), length 52)
    172.18.128.204.59180 > 172.18.22.200.22: Flags [.], cksum 0x88b1 (correct), seq 0, ack 293, win 4086, options [nop,nop,TS val 950233965 ecr 87616967], length 0

抓取经过 interface ens160,DST_MAC 或 SRC_MAC 地址是 00:50:56:bf:c2:c5 的 ICMP 数据包。

[root@localhost ~]# tcpdump -i ens160 '((icmp) and ((ether host 00:50:56:bf:c2:c5)))'
...
15:19:50.522900 IP localhost.localdomain > 172.18.22.41: ICMP redirect 172.18.41.24 to host localhost.localdomain, length 68

抓取经过 interface ens160,目标网络是 172.18 但目标主机又不是 172.18.22.204 的 TCP 且非 22 号端口的数据包。

[root@localhost ~]# tcpdump -i ens160 -c 10 -nnt '((tcp) and (not port 22) and ((dst net 172.18) and (not dst host 172.18.22.204)))'
...
IP 172.18.22.74.47580 > 172.18.22.237.8080: Flags [S], seq 2124823039, win 29200, options [mss 1460,sackOK,TS val 274062379 ecr 0,nop,wscale 7], length 0
IP 172.18.22.237.8080 > 172.18.22.74.47580: Flags [R.], seq 0, ack 2124823040, win 0, length 0

抓取流入 interface ens160,host 为 172.18.22.208 且协议为 ICMP 的数据包。
172.18.128.204 > 172.18.22.200(curr) > 172.18.22.208

[root@localhost ~]# tcpdump -i ens160 -nnt -P in host 172.18.22.208 and icmp
...
IP 172.18.128.204 > 172.18.22.208: ICMP echo request, id 42579, seq 2314, length 64

抓取流出 interface ens160,host 为 172.18.22.208 且协议为 ICMP 的数据包。
172.18.22.208 > 172.18.128.200(curr) > 172.18.128.204

[root@localhost ~]# tcpdump -i ens160 -nnt -P out host 172.18.22.208 and icmp
...
IP 172.18.22.208 > 172.18.128.204: ICMP echo reply, id 42579, seq 2436, length 64

参考资料

https://www.cnblogs.com/chenpingzhao/p/9108570.html
https://www.cnblogs.com/f-ck-need-u/p/7064286.html
https://blog.csdn.net/minxihou/article/details/80243484