总结一句命令:
Tcpdump 与Wireshark组合抓包分析
Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具,我们一般采用Tcpdump抓包命令的方式实现抓包,然后用Wireshark来进行分析。用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。
tcpdump tcp -w ./target.cap -i eth0 -t -s 0 -c 100 anddst port ! 22 and src net 192.168.1.0/24
Ø tcp: ip icmp arp rarp 和tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
Ø -w ./target.cap : 保存成cap文件,路径为./(root目录下),文件名为target,方便用Wireshark分析。
Ø -i eth0 : 只抓经过接口eth0的包
Ø -t : 不显示时间戳
Ø -s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
Ø -c 100 : 只抓取100个数据包
Ø dst port ! 22 : 不抓取目标端口是22的数据包
Ø src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
1.1 Tcpdump命令说明
1.1.1 Tcpdump简介
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息
1.1.2 命令使用
tcpdump采用命令行方式,它的命令格式为:
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ][ -M secret ]
[ -r file ] [ -s snaplen ] [-T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddralgo:secret,... ]
[ -y datalinktype ] [ -Z user]
[ expression ]
1.1.2.1 tcpdump的简单选项介绍
-A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages).
-c count
tcpdump将在接受到count个数据包后退出.
-C file-size (nt: 此选项用于配合-w file 选项使用)
该选项使得tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k,1024k字节为1M计算所得, 即1M=1024 * 1024 =1,048,576)
-i interface
指定tcpdump 需要监听的接口. 如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口).一但找到第一个符合条件的接口, 搜寻马上结束.
-n 不对地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换.
-q 快速打印输出. 即打印很少的协议相关信息, 从而输出行都比较简短.
-r file
从文件file 中读取包数据. 如果file 字段为 '-' 符号, 则tcpdump 会从标准输入中读取包数据.
-s snaplen
设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节,需要注意的是, 采用长的抓取长度, 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量, 从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下,抓取长度越小越好.把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包.
-t 在每行输出中不打印时间戳
-w 把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印.
-W filecount
此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序.
-x 当分析和打印时,tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必须要注意的是, 如果高层协议数据没有snaplen 这么长,并且数据链路层(比如,Ethernet层)有填充数据, 则这些填充数据也会被打印.
-xx tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据,其中包括数据链路层的头部.
1.1.2.2 tcpdump条件表达式
该表达式用于决定哪些数据包将被打印. 如果不给定条件表达式, 网络上所有被捕获的包都会被打印,否则只有满足条件表达式的数据包被打印。表达式由一个或多个'表达元'组成。一个表达元通常由一个或多个修饰符后跟一个名字或数字表示的id组成.有三种不同类型的修饰符:type, dir以及 proto.
type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字. 可选的对象类型有: host, net, port 以及portrange(nt: host 表明id表示主机, net 表明id是网络, port 表明id是端口,而portrange表明id 是一个端口范围). 例如:
'host foo', 表示主机 foo
'net 128.3', 表示网络 128.3
'port 8080', 表示端口 8080
'portrange 6000-6008表示端口范围 6000-6008
如果不指定type 修饰符, id默认的修饰符为host.
dir 修饰符描述id 所对应的传输方向, 即发往id 还是从id 接收(nt: 而id 到底指什么需要看其前面的type 修饰符).可取的方向为: src, dst, src 或 dst, src并且dst.
例如:
src foo, 表示符合条件的数据包中, 源主机是foo
dst net 128.3, 表示目的网络是128.3
src or dst port ftp-data表示源或目的端口为 ftp-data
如果不指定dir修饰符, id 默认的修饰符为src 或 dst.
proto 修饰符描述id 所属的协议.可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp,decnet, tcp以及 udp.
例如,
`ether src foo', 表示从以太网地址foo 来的数据包
`arp net 128.3', 表示 发往或来自128.3网络的arp协议数据包
`tcp port 21', 表示发送或接收端口为21的tcp协议数据包
`udp portrange 7000-7009'表示发送或接收端口范围为7000-7009的udp协议数据包
如果不指定proto 修饰符, 则默认为与相应type匹配的修饰符.
对于修饰符后跟id 的格式,可理解为, type id 是对包最基本的过滤条件: 即对包相关的主机, 网络, 端口的限制;dir 表示对包的传送方向的限制; proto表示对包相关的协议限制
表达元之间还可以通过关键字and,or 以及 not 进行连接, 从而可组成比较复杂的条件表达式.
比如,`host foo and not port ftp and not port ftp-data'表示数据包的主机为foo,并且端口不是ftp(端口21) 和ftp-data(端口20, 常用端口和名字的对应可在linux 系统中的/etc/service 文件中找到)).
为了表示方便, 同样的修饰符可以被省略, 如'tcp dst port ftp or ftp-data or domain' 与以下的表达式含义相同'tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.
借助括号以及相应操作符,可把表达元组合在一起使用(由于括号是shell的特殊字符, 所以在shell脚本或终端中使用时必须对括号进行转义, 即'(' 与')'需要分别表达成'\(' 与 '\)').
有效的操作符有:
否定操作 (`!' 或 `not')
与操作(`&&'或 `and')
或操作(`||' 或 `or')
否定操作符的优先级别最高. 与操作和或操作优先级别相同, 并且二者的结合顺序是从左到右. 要注意的是, 表达'与操作'时,需要显式写出'and'操作符, 而不只是把前后表达元并列放置.
1.1.3 实用命令实例
1.1.3.1 默认启动
tcpdump
普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
1.1.3.2 监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。
1.1.3.3 监视指定主机的数据包
打印所有进入或离开sundown的数据包.
tcpdump host sundown
也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump host 210.27.48.1
打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host helios and \( hot or ace \)
截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and \ (210.27.48.2 or210.27.48.3 \)
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host ace and not helios
如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截获主机hostname发送的所有数据
tcpdump -i eth0 src host hostname
监视所有送到主机hostname的数据包
tcpdump -i eth0 dst host hostname
1.1.3.4 监视指定主机和端口的数据包
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 host 210.27.48.1
对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump udp port 123
1.1.3.5 监视指定网络的数据包
打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt:ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)
tcpdump net ucb-ether
打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)
tcpdump 'gateway snup and (port ftp or ftp-data)'
打印所有源地址或目标地址是本地主机的IP数据包
(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络.(nt: 此句翻译曲折,需补充).localnet 实际使用时要真正替换成本地网络的名字)
tcpdump ip and not net localnet
1.2 Wireshark使用说明
1.2.1 Wireshark简介
Wireshark 是网络包分析工具。网络包分析工具的主要作用是尝试捕获网络包, 并尝试显示包的尽可能详细的情况