Tcpdump介绍
Tcpdumph会打印输出一个满足条件的网络接口上数据包内容。 它也可以用-w标志运行,这样它将数据信息保存到一个文件中供以后分析,或使用-r标志,从保存的文件中读取数据。它也可以用-V标志运行,使其读取已保存的数据包文件列表。 在任何情况下,只有匹配表达式的数据包才会被tcpdump处理。
如果Tcpdump没有指定-c选项,它将不断捕获数据包,直到它被一个SIGINT信号(例如,通过输入中断字符,通常为control+c)或一个SIGTERM信号(通常由kill (1)命令)中断。如果使用-c标志运行,它将捕获数据包,直到数据包数量到-c为止。
在支持SIGINFO信号的平台上,比如大多数BSD(包括Mac OS X)和Digital / Tru64 UNIX,它会在接收到SIGINFO信号(例如,通过输入“status”字符 ,通常是control-T,尽管在一些平台上,比如Mac OS X,“status”字符默认没有设置,所以你必须设置stty(1)才能使用它),并继续捕获数据包。
Tcpdump命令格式
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
[ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ -P in|out|inout ]
[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E [email protected] algo:secret,... ]
[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
[ expression ]
虽然上面这么多参数看着都让人头疼,其实总结出来很简单:tcpdump option filter,其中option表示选项,而filter则表示过滤条件,你要对什么进行过滤,filter可以是单个条件(tcp、src、host xxx),也可以将这些单一的参数进行组合,比如:dst port 3306 and src port 58895
Tcpdump选项
-i 选项:表示tcpdump监听端口,如果不指定,那么会搜索所有的网络接口
~ ]# tcpdump -i ens33 # 在ens33这个网络接口监听
~ ]# tcpdump -i ens33 # linux 2.2以上支持 -i ens33,可以监听所有端口
-n 选项:不要把ip转换为主机名
~ ]#tcpdump -i ens33 -n
-w -选项,-w为把内容write到某个地方, -表示标准输出 也就是输出到标准输出中,下面是一个超级有用的命令,把包的数据,用字符展示出来。
~ ]# tcpdump -i ens33 -w - | strings
~ ]# tcpdump -w test.cap # 把抓包结果写入test.cap中,方便wireshark分析
-C num选项:如果test.cap 超过num大小,则新开一个文件, -C fileSize , 单位是MB
~ ]# tcpdump -C 1 -w test.cap
-r 选项: 从某个文件读取
~ ]# tcpdump -n -r test.cap
-X 选项:以十六进制以及ASCII的形式打印数据内容。
~ ]# tcpdump -X
~ ]# tcpdump -x # 除了打印出header外,还打印packet里面的数据(十六进制的形式)
~ ]# tcpdump -xx # 以十六进制的形式打印header, data内容
- A 选项,把每一个packet都用以ASCII的形式打印出来
~ ]# tcpdump -i ens33 -A host www.itshouce.com.cn
-c # 表示收到 # 个packet就退出
~ ]# tcpdump -i ens33 -A -c 3 172.18.14.55 # 接收三个包就退出
-D 选项:看目前机器上有哪些网络接口
~ ]# tcpdump -D
1.nflog (Linux netfilter log (NFLOG) interface)
2.nfqueue (Linux netfilter queue (NFQUEUE) interface)
3.usbmon1 (USB bus number 1)
4.usbmon2 (USB bus number 2)
5.ens33
6.ens34
7.ens33 (Pseudo-device that captures on all interfaces)
8.lo
-e 选项:把连接层的头打印出来
~ ]# tcpdump -i ens33 -e
16:49:14.658811 78:e3:b5:82:39:1b (oui Unknown) > 00:0c:29:66:59:95 (oui Unknown), ethertype IPv4 (0x0800), length 60: 172.18.14.200.59324 > node1.ssh: Flags [.], ack 40028648, win 2, length 0
-j 选项,修改时间格式
~ ]# tcpdump -i ens33 -j timestamp type # 可以修改输出的时间格式,
~ ]# tcpdump -J
# 显示支持的时间格式 : List the supported time stamp types for the interface and exit. If the time stamp type cannot be set for the interface, no time stamp types are listed。
-l 选项:把stdout bufferd住,当你既想在屏幕上看结果,又想把结果输出到文件中时,比较有用
~ ]# tcpdump -l
# 可以配合tee命令,在屏幕上显示dump内容,并把内容输出到dump.log中,如下
~ ]# tcpdump -l |tee dump.log # or下面这种写法
~ ]# tcpdump -l > dump.log &tail -f dump.log
-q 选项: 就是quiect output, 静默输出,尽量少的打印一些信息
~ ]# tcpdump -q
-S 选项:打印真实的,绝对的tcp seq no
~ ]# tcpdump -i ens33 -S
-s 选型:指定包大小,默认抓取包长度是65535,
~ ]# tcpdump # capture sieze 65535l
~ ]# tcpdump -s 256 # 我们设置为256 该参数目的:减少抓包文件的大小
-t 选项:不要打时间戳,
~ ]# tcpdump -i ens33 -t
-tt 选项:打出timstamp,从1970-1-1 以来的秒数,以及微秒数。
~ ]# tcpdump -i ens33 -tt
-v 选项:verbose,即打印详细信息。
~ ]# tcpdump -i ens33 -v # 打印出详细结果,如ttl值
~ ]# tcpdump -i ens33 -vv # 打印出更加详细的结果 如window, checksum等
Tcpdump过滤项
下面所有测试中都有 -i ens33的选项,表示抓取ens33网络接口上的包,只是为了让测试方便。你可以指定所有端口:-i any。
# 抓取arp协议的包,然后host为192.168.199.* 测试时需要在另一个session,做一个ifconfig指令。arp可以换为tcp,udp等。
~ ]# tcpudmp -i ens33 -n arp host 192.168.199
22:39:58.991043 ARP, Request who-has 192.168.199.125 tell 192.168.199.1, length 28
22:39:58.991059 ARP, Reply 192.168.199.125 is-at a4:5e:60:dc:d0:d9, length 28
# 抓取访问destination 80端口的包,然后我们做一个curl www.baidu.com的操作。
~ ]# tcpdump -i ens33 -n dst port 80
22:53:06.041382 IP 192.168.199.125.63161 > 119.75.219.45.80: Flags [F.], seq 0, ack 1, win 65535, length 0
# 抓取源上端口是80的包
~ ]# tcpdump -i ens33 -n src port 80
22:57:48.343422 IP 112.80.248.73.80 > 192.168.199.125.63275: Flags [.], seq 38478:39918, ack 78, win 193, length 1440
# 抓取源或者目标端口都是80的包
~ ]# tcpdump -i ens33 -n port 80
22:58:51.165333 IP 112.80.248.74.80 > 192.168.199.125.63298: Flags [F.], seq 100439, ack 79, win 193, length 0
# 表示抓取destination prot 在1到80之间的端口的数据
~ ]# tcpdump -i ens33 -n dst portrange 1-80
# 抓取源的端口是20-80的包
~ ]# tcpdump -i ens33 -n src portrange 20-80
# 抓取端口是20-80的包,不考虑源
~ ]# tcpdump -i ens33 -n portrange 20-80
# 抓取destination为www.baidu.com的包
~ ]# tcpdump -i ens33 dst www.baidu.com
# 在另外的session中ping www.baidu.com ,以及 在浏览器中访问www.baidu.com
# 抓取destination为192.168.14.55的包
~ ]# tcpdump -i ens33 dst 192.168.14.55
# 抓取destination为192.168.1.[0-255]的包
~ ]# tcpdump -i ens33 dst 192.168.1 # 也可以指定范围
# 抓取source为192.168.*.*的包, 使用-n 则只是为了显示ip,而不是主机名,
~ ]# tcpdump -i ens33 -n src 192.168
22:30:50.490355 IP 192.168.199.125.61086 > *.*.*.*.341: Flags [.], ack 56, win 8185, options [nop,nop,TS val 1239157627 ecr 1580310986], length 0
# 抓取192.168的包(不管是source还是destination )
~ ]# tcpdump -i ens33 -n host 192.168
22:38:07.580567 IP *.*.*.*.34186 > 192.168.199.125.61086: Flags [P.], seq 787907565:787907668, ack 871423065, win 126, options [nop,nop,TS val 1580748123 ecr 1239593243], length 103
# 抓取包长度小于800的包
~ ]# tcpudmp -i ens33 -n less 800
21:09:17.687673 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385
# 抓取包长度大于800的包
~ ]# tcpdump -i ens33 -n greater 800
21:13:21.801351 IP 192.168.199.125.64826 > *.*.*.*.80: Flags [P.], seq 2155:3267, ack 44930, win 8192, length 1112
# 只抓取tcp包
~ ]# tcpdump -i ens33 -n tcp
1:21:18.777815 IP 192.168.199.125.50249 > *.*.*.*.443: Flags [.], ack 75, win 4093, options [nop,nop,TS val 1269008649 ecr 44997038], length 0
# 只抓取udp包
~ ]# tcpdump -i ens33 -n udp
21:22:48.434449 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385
# 只抓取icmp的包,internet控制包
~ ]# tcpdump -i ens33 -n icmp
21:25:42.550374 IP 192.168.199.1 > 192.168.199.125: ICMP *.*.*.* unreachable - need to frag (mtu 1480), length 556