目录
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