在分析了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 ]
选项也没什么说的,看上边的写法也大概能猜出选项的意思,如果不能那就“man tcpdump”看一下具体的意思。提一下最常用的三个参数
-A----以可打印字符形式打印包的所有内容。在想查看应用层(如http)内容这个选项很有用。
-i----用于指定要捕获数据包的网卡。如eth1。
-r----可以从指定的文件中读入数据包。
-w----将捕获的数据包存入到文件。一般保存成.pcap方便使用wireshark打开。
tcpdump使用pcap-filter语法,详情可以查看"man pcap-filter",下边是对man手册的一些总结。当然另外还要说明,tcpdump有一些高级的用法,不一定都符合下边的规律。
与wireshark表达式相较而言,虽然tcpdump也不叫难,但总体还是wireshark表达式更简单明了一些。
一条基本的表达式写法如下:
[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
非----!或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)'