转载

使用tshark监视和检查网络流量

大多数人恐怕已经听说过Wireshark,这是一款人气非常旺、功能非常强的网络协议分析工具。但是大家可能不知道的是,还有一个控制台版本的Wireshark,名叫tshark。tshark的两个主要优点就是,它可以用在脚本中,也可以通过SSH连接用在远程计算机上。主要缺点就是,它没有图形用户界面(GUI),如果你要搜索大量的网络数据,要是有GUI,确实方便得很。

你可以从官方网站获得tshark、自行编译,也可以从你的Linux发行版获得它(它作为预先编译的程序包)。第二种方法更快捷、更简单。想把tshark安装到Debian 7系统上,你就要以根用户身份,运行下列命令:

# apt-get install tshark

Reading package lists... Done

Building dependency tree

Reading state information... Done

The following extra packages will be installed:

libc-ares2 libcap2-bin libpam-cap libsmi2ldbl

libwireshark-data libwireshark2

libwiretap2 libwsutil2 wireshark-common

Suggested packages:

libcap-dev snmp-mibs-downloader wireshark-doc

The following NEW packages will be installed:

libc-ares2 libcap2-bin libpam-cap libsmi2ldbl

libwireshark-data libwireshark2

libwiretap2 libwsutil2 tshark wireshark-common

0 upgraded, 10 newly installed, 0 to remove and 0 not upgraded.

Need to get 15.6 MB of archives.

After this operation, 65.7 MB of additional disk space will be used.

Do you want to continue [Y/n]? Y

...

想查明tshark是否已正确安装,并查明其版本,请执行这个命令:

$ tshark -v

TShark 1.8.2

...

注意:本文假设你已经很熟悉网络数据、TCP/IP和数据包捕获,还可能熟悉Wireshark,并假设你想了解关于tshark的更多信息。

tshark简介

凡是Wireshark具有的功能,tshark都有,前提条件是它不需要GUI。它还可以用来替代tcpdump,tcpdump过去是网络数据捕获方面的行业标准。除了捕获方面外(两种工具在这方面功能相当),tshark的功能比tcpdump来得强大;因此,如果你只想学用一种工具,tshark应该是你的选择。

正如你设想的那样,tshark有好多命令行选项。请参阅其参考手册页,即可了解完整列表。

使用tshark捕获网络流量

你应该运行的头一个命令是sudo tshark –D,即可列出可用网络接口:

$ sudo tshark -D

1. eth0

2. nflog (Linux netfilter log (NFLOG) interface)

3. any (Pseudo-device that captures on all interfaces)

4. lo

如果你以普通用户的身份运行tshark,极有可能会得到下列输出结果,因为普通用户无权直接访问网络接口设备:

$ tshark -D

tshark: There are no interfaces on which a capture can be done

想捕获数据,最简单的办法就是运行不带任何参数的tshark,这会在屏幕上显示所有数据。只要按Ctrl-C组合键,就可以停止数据捕获。

在忙碌的网络上,输出结果会飞快地滚动显示,所以一点也没有帮助。比较旧的计算机可能跟不上忙碌的网络,所以tshark和tcpdump之类的程序过去常常丢失网络数据包。由于现代计算机功能相当强大,这不再是个问题。

使用文件,保存和阅读网络数据

最有用的一个命令行参数是-w,后面跟以文件名。这个参数让你可以将网络数据保存到文件中,以便以后处理它。下面这个tshark命令可捕获500个网络数据包(-c 500),并将它们保存到名为LJ.pcap的文件(-w LJ.pcap)。

$ tshark -c 500 -w LJ.pcap

第二有用的参数是-r。后面跟以有效的文件名时,它让你可以阅读和处理之前捕获的含有网络数据的文件。

捕获过滤器

捕获过滤器是数据捕获过程中所应用的过滤器;因此,它们让tshark丢弃不符合过滤器标准的网络流量,避免生成庞大的捕获文件。这可以使用-f命令行参数(后面跟以双引号里面的过滤器)来实现。

捕获过滤器中使用的最重要的与TCP相关的字段名有:tcp.port(用于过滤源头或目的地TCP端口)、tcp.srcport(用于检查TCP源头端口)以及tcp.dstport(用于检查目的地端口)。

通常来说,数据捕获后应用过滤器被认为比在捕获过程中进行过滤来得更实用、功能更广泛,因为大多数时候,你并不事先知道想要检查什么。然而,如果你确实知道要做什么,使用捕获过滤器就能为你节省时间和磁盘空间,这也是使用捕获过滤器的主要原因。

切记:过滤器字符串始终应该使用小写字母。

显示过滤器

显示过滤器是数据包捕获后所应用的过滤器;因此,它们只是“隐藏”网络流量,而不实际删除。你总是可以去除显示过滤器的影响,找回你的所有数据。

显示过滤器支持比较运算符和逻辑运算符。http.response.code == 404 && ip.addr == 192.168.10.1显示过滤器显示了来自192.168.10.1 IP地址或前往192.168.10.1 IP地址的流量,该流量里面还有404 (Not Found) HTTP响应代码。!bootp && !ip过滤器将BOOTP和IP流量排除在输出结果之外。eth.addr == 01:23:45:67:89:ab && tcp.port == 25过滤器显示了前往或来自拥有01:23:45:67:89:ab MAC地址的网络设备的流量,使用TCP端口25用于入站或出站连接。

定义规则时,要切记:ip.addr != 192.168.1.5表达式并不意味着没有一个ip.addr字段含有192.168.1.5 IP地址。它意味着,其中一个ip.addr字段不应该含有192.168.1.5 IP地址!因此,另一个ip.addr字段值可能相当于192.168.1.5!你可以看成是“有一个不是192.168.1.5的ip.addr字段”。正确的表达方式是,键入!(ip.addr == 192.168.1.5)。这是显示过滤器方面的一个常见误解。

还要牢记:如果你想跟踪局域网上的某一个机器,MAC地址确实很有用,因为如果该机器使用DHCP,其IP地址就会变化,但是MAC地址变化的话比较困难。

如果使用得当,显示过滤器是极其有用的工具,不过你仍得自行解读结果,找到问题,并考虑可能的解决办法。建议访问显示过滤器参考网站:http://www.wireshark.org/docs/dfref/t/tcp.html,即可关注与TCP有关的流量。想查看与UDP流量有关的所有可用字段名,请访问http://www.wireshark.org/docs/dfref/u/udp.html。

导出数据

设想一下:你想提取帧数、帧相对时间、源头IP地址、目的地IP地址、数据包协议,以及来自之前捕获的网络流量的网络数据包的长度。下面这个tshark命令就能为你做到这一切:

$ tshark -r login.tcpdump -T fields -e frame.number -e

↪frame.time_relative -e ip.src -e ip.dst -e

↪frame.protocols -e frame.len -E header=y -E

↪quote=n -E occurrence=f

-E header=y选项指令tshark先输出报头行。-E quote=n规定tshark不包括引号里面的数据,而-E occurrence=f指令tshark使用有多个occurrence的字段的头一个occurrence。

以明文格式输出意味着,你很容易以UNIX方式来处理它。下面这个命令使用来自ip.src字段的输出,显示了十个最常见的IP地址:

$ tshark -r ~/netData.pcap -T fields -e ip.src | sort

↪| sed '/^/s*$/d' | uniq -c | sort -rn

↪| awk {'print $2 " " $1'} | head

正文到此结束
Loading...