一、说明
在分析了wireshark使用方法后,其表达式书写基本没什么问题,但在linux上使用的更多是tcpdump。
tcpdump自大学就开始在用了,但一直没搞懂其表达式的书写规律,基本每次使用都得查、每次用后都会忘。
二、安装
yum install tcpdump -y
三、使用
tcpdump命令用法如下,可概括为“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 spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
3.1 选项
选项也没什么说的,看上边的写法也大概能猜出选项的意思,如果不能那就“man tcpdump”看一下具体的意思。提一下最常用的三个参数
-i----用于指定要捕获数据包的网卡。如eth1。
-r----可以从指定的文件中读入数据包。
-w----将捕获的数据包存入到文件。一般保存成.pcap方便使用wireshark打开。
3.2 表达式
tcpdump使用pcap-filter语法,详情可以查看"man pcap-filter",下边是对man手册的一些总结。当然另外还要说明,tcpdump有一些高级的用法,不一定都符合下边的规律。
与wireshark表达式相较而言,虽然tcpdump也不叫难,但总体还是wireshark表达式更简单明了一些。
3.2.1 基本表达式
一条基本的表达式写法如下:
[proto] [dir] [type] [value]
proto----protocol,流量协议。可以为ether(数据链路层), ip, ip6, arp, rarp, decnet, tcp 及 udp。另外也可以是fddi, tr, wlan但这三个都是数据链路层在不同数据链路层协议的叫法,与ether相互之间等价。tcpdump不支持应用层协议,只能借助端口实现某种应用层协议的过滤。
dir----direction,流量方向。可以为src, dst, src or dst 及 src and dst。另外也可以是ra, ta, addr1, addr2, addr3 及 addr4但这几个只适用于wlan数据链路层。
type----过滤项的值的类型。可以为host(ip或可解析的域名/主机名), net(网段) , port(端口或/etc/services可解析的服务) 及 portrange(端口范围)。
# 示例一 # 过滤ip协议(proto)----目的(dir)----ip(type-host)----为192.168.220.128(value)的数据包 tcpdump ip dst host 192.168.220.128 # 当然我们前边用了中括号,意味着在没有歧义情下况某些字段是可以省略的,如这里proto字段可省略,等价于 # tcpdump dst host 192.168.220.128 # 示例二 # 过滤ip协议(proto)----目的(dir)----网段(type-net)----为192.168.220(value)的数据包 tcpdump ip dst net 192.168.220 # 示例三 # 过滤tcp协议(proto)----目的(dir)----端口(type-port)----为3306(value)的数据包 tcpdump tcp dst port 3306 # port支持/etc/services可解析的服务,3306对应mysql,所以等价于 # tcpdump tcp dst port mysql # 示例四 # 过滤tcp协议(proto)----目的(dir)----端口范围(type-portrange)----为3306-3308(value)的数据包 tcpdump tcp dst portrange 3306-3308
3.2.2 复合表达式
非----!或not。最高优先级。
与----&&或and。次优先级。
或----||或or。最低优先级。
改变运算优先级----大括号。
# 过滤ip协议(proto)----目的(dir)----ip(type-host)----为192.168.220.128(value)且 # tcp协议(proto)----目的(dir)----端口(type-port)----为3306(value)的数据包 tcpdump ip dst host 192.168.220.128 and tcp dst port 3306 # 过滤tcp协议(proto)----目的(dir)----端口(type-port)----为3306或3308(value)的数据包 tcpdump tcp dst port 3306 or tcp dst port 3308 # 另外也支持以下单引号写法 # tcpdump tcp dst port '(3306 or 3308)'