ethereal的capture filter和display filter语法不相同,capture filter的语法可以参照tcpdump的语法。
Capture Filter
expression
用来 选择 要 转储 的 数据报. 如果 没有 指定 expression , 就 转储 网络的 全部 报文. 否则, 只转储 相对 expression 为 `true' 的 数据报.
expression 一个或多个 原语 (primitive) 组成. 原语 通常 由 一个 标识 (id, 名称或数字), 和 标识 前面的 一个或多个 修饰子(qualifier) 组成. 修饰子 有 三种 不同的类型:
type
类型修饰子 指出 标识名称 或 标识数字 代表 什么 类型的东西. 可以使用的 类型 有 host, net 和 port. 例如, `host foo', `net 128.3', `port 20'. 如果 不指定 类型修饰子, 就使用 缺省的 host .
dir
方向修饰子 指出 相对于 标识 的 传输方向 (数据是 传入还是传出 标识). 可以使用的 方向 有 src, dst, src or dst 和 src and dst. 例如, `src foo', `dst net 128.3', `src or dst port ftp-data'. 如果 不指定 方向修饰子, 就使用 缺省的 src or dst . 对于 `null' 链路层 (就是说 象 slip 之类的 点到点 协议), 用 inbound 和 outbound 修饰子 指定 所需的 传输方向.
proto
协议修饰子 要求 匹配 指定的协议. 可以使用的 协议 有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp. 例如, `ether src foo', `arp net 128.3', `tcp port 21'. 如果 不指定协议修饰子, 就使用 所有 符合 类型 的 协议. 例如, `src foo' 指 `(ip 或 arp 或 rarp) src foo' (注意后者不符合语法), `net bar' 指 `(ip 或 arp 或 rarp) net bar', `port 53' 指 `(tcp 或 udp) port 53'.
[`fddi' 实际上 是 `ether' 的 别名; 分析器 把 它们 视为 ``用在 指定 网络接口 上的 数据链路层.'' FDDI 报头 包含 类似于 以太协议的 源目地址, 而且 通常 包含 类似于 以太协议 的 报文类型, 因此 你 可以过滤 FDDI 域, 就象 分析 以太协议 一样. FDDI 报头 也 包含 其他 域, 但是你 不能 在 过滤器 表达式 里 显式描述.]
作为 上述 的 补充, 有一些 特殊的 `原语' 关键字, 它们 不同于 上面的模式: gateway, broadcast, less, greater 和 数学表达式. 这些 在 后面 有 叙述.
更复杂的 过滤器表达式 可以 通过 and, or 和 not 连接 原语 来 组建. 例如, `host foo and not port ftp and not port ftp-data'. 为了少敲点键, 可以忽略 相同的 修饰子. 例如, `tcp dst port ftp or ftp-data or domain' 实际上 就是 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.
Display Filter
1. 操作符:
eq, == Equal
ne, != Not Equal
gt, > Greater Than
lt, = Greater than or Equal to
le, 100 包的数据长度大于100的包
ip.src == 192.168.214.12 源地址是192.168.214.12
ip.dst == www.juexiang.com 目标地址是www.juexiang.com的包
ip.addr == 129.111.0.0/16 地址范围在129.111.*.*子网的包,类似于capture filter的host
http.request.method == "HEAD" 在HTTP包中查找request命令含HEAD的包
http.request.method == "x48EAD" 和上面的一样,只是使用x48来表示‘H’
4. 数组操作
[i:j] i = 起点, j = 长度 [i-j] i = 起点, j = 末点, 包含. [i] i = 起点, 长度1 [:j] 起点等于 0, 长度= j [i:] 起点 = i, 至最后还是直接举例吧:eth.src[0:3] == 00:00:83 以太网地址的前3位http.content_type[0:4] == "text" content_type的前四位frame[-4:4] == 0.1.2.3 起点为负表示终点-4 长度4位,就是末四位啦,怎么样够灵活吧~5.逻辑操作
and, && Logical AND
or, || Logical OR
not, ! Logical NOT
这个我就不多举例啦,应该都理解的J
6.位操作
bitwise_and, & Bitwise AND
举例:
tcp.flags & 0x02 过滤所有的TCP SYN包
更多的关于filter的解释还是看帮助吧:ethereal-filter.html
至于Capture的Filter我就不多说啦,可以到linux下面去man tcpdumpJ
需要说明的是,Ethereal是基于图形界面的,所以如果你是通过SSH或者Telnet使用Unix工作站,你可能会感觉麻烦。而如果你打算使用Tcpdump,只要你打开一下tcpdump的手册页,你肯定就会望而却步了;更糟糕的是,Tcpdump的手册页只是提供了最基本的帮助。我常用的一个方法是,在远程终端运行tcpdump,加以最少的参数。比如: tcpdump -i eth0 -s 1500 -w a.dmp 这个语句机会可以在任何情况下使用。简单解释一下,-i eth0是在eth0接口上监听, -s 1500是一个很重要的参数,它指抓取的数据包的前1500个字节,否则你可能只能看到数据包的前68个字节,因为tcpdump的默认抓取长度是68, -w a.dmp是表示把抓取的数据写入a.dmp中。抓取介绍后,Ctl+C,你可以看到a.dmp已经生成。然后用sftp传到本机使用Ethereal解析。