第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。
第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和 分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,
使用-c参数指定要监听的数据包数量,
使用-w参数指定将监听到的数据包写入文件中保存
A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1
B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用 括号时,一定要
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 对本机的udp 123 端口进行监视 123 为ntp的服务端口
# tcpdump udp port 123
F 系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname
G 下面的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname
H 我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0 gateway Gatewayname
I 如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
#tcpdump -i eth0 host hostname and port 80
J 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
:(在命令行中适用 括号时,一定要
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
L 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
如果我们只需要列出送到80端口的数据包,用dst port;如果我们只希望看到返回80端口的数据包,用src port。
#tcpdump –i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端口是80 一般是提供http的服务的主机
如果条件很多的话 要在条件之前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
如果在ethernet 使用混杂模式 系统的日志将会记录
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
jeffyan 回复于:2005-12-22 18:20:34
tcpdump 超级好东东 其实系统自己带的,好像很多人都不用它
jeffyan 回复于:2005-12-22 18:22:00
配合Ethereal 用,无敌了,曾经过滤出整个公司的邮箱密码
ocean390 回复于:2005-12-22 19:56:06
可是怎么能用ascii显示数据包的内容呢,一直没搞定这个问题
snowtty 回复于:2005-12-22 20:16:55
jeffyan 能不能讲讲你实现的办法呀,我一直都没有成功过,就是用tcpdump过滤出来的数据用Ethereal 来分析呀
neatcat 回复于:2005-12-23 14:39:02
不错,不错,好东西。
bulletming 回复于:2005-12-23 16:47:48
Ethereal分析tcpdump保存的文件,好像不是很方便,有些请求回来的字符找不到,不知道是我哪里有问题么?
lijietz 回复于:2005-12-24 18:54:16
多谢。顶了先。:)
zenith518 回复于:2005-12-25 10:50:04
其实LZ 只说明了过滤语句的用法,没有将很重要另外一个参数说明,也就是说,如果这个参数不设置正确,会导致包数据的丢失!
它就是-s 参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失!
只要使用-s 0就可以按包长,截取数据!
jeffyan 回复于:2005-12-25 18:49:42
引用:原帖由 snowtty 于 2005-12-22 20:16 发表
jeffyan 能不能讲讲你实现的办法呀,我一直都没有成功过,就是用tcpdump过滤出来的数据用Ethereal 来分析呀
成功的阿
我一直都这样用的
jeffyan 回复于:2005-12-25 18:50:22
引用:原帖由 zenith518 于 2005-12-25 10:50 发表
其实LZ 只说明了过滤语句的用法,没有将很重要另外一个参数说明,也就是说,如果这个参数不设置正确,会导致包数据的丢失!
它就是-s 参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长 ...
要考虑这个参数
jeffyan 回复于:2005-12-25 18:55:12
引用:原帖由 ocean390 于 2005-12-22 19:56 发表
可是怎么能用ascii显示数据包的内容呢,一直没搞定这个问题
Ethereal 能直接显示的
bulletming 回复于:2005-12-25 21:06:38
我昨天也发现了那个参数,但是没有试,谢谢zenith518 兄弟还有楼主!
to zenith518:谢谢你!真希望与你做朋友!
passion 回复于:2005-12-25 21:21:40
很不错, 我虽然经常用它,还是从这篇文章里面学了不少东西
zenith518 回复于:2005-12-25 22:22:11
各位有兴趣,我可以多说一点。
LZ所说的这个格式有一个业界标准,称作bpf (Berkeley Packet Filter)包过滤语言。现在有很多抓包工具支持这个标准。包扩ethereal的capture filter, 注意不是displayfilter, 因为ethereal的display filter 使用了近似于C/C++表达式的另一套自己的表达方式。
其实,如果各位使用过libpcap的,就知道,所有的libpcap都需要snaplen 这个参数设定才能抓到整个的包数据。那如果不熟悉C/C++怎么办?,没关系那也可以结合tcpdump -xls 0 命令行加管道导向到Awk的程序来自己解析IP数据包并分析应用层的数据。如果用tcpdump+Perl的话,更可以经过简单的包数据重构,方便地组成NetPacket模块能自动识别的包数据,让现成的NetPacket模块自动解析和分析底层的IP和TCP/UDP层数据包。而你则只要懂得gawk/nawk或Perl就可以简单的自己编程来解析非标的应用层的数据了。注意,这里我并没有使用perl 的libpcap兼容模块,而是直接用tcpdump替代了。这样对Perl模块的要求降得比较低了,如果遇到非标的协议,就是不会C/C++, 没装抓包的perl模块,也可以通过自己编程来解析数剧包了!
killua 回复于:2005-12-26 10:10:03
楼上的,pf一下
bulletming 回复于:2005-12-26 11:57:15
我还发现一个问题就是在ethereal的最下边的显示实际包ascii字节的窗口,都不能正常显示汉字,不知道大家是否已解决此问题?
zenith518 回复于:2005-12-26 12:41:24
现在的抓包工具,都不能正确显示汉字,而在实际工作中,也可以通过其他方法弥补,这个不足。如果真需要这么做,那就需要自己解包了。如果想查看HTTP协议中的东西,在客户端IE中装一个HTTP协议查看工具插件就可以了,这样即可以看协议头,又可以看内容。要么在服务器端装支持相应编码的代理,然后dump数据。
bulletming 回复于:2005-12-26 16:19:08
to zenith518:
还好的是可以通过hex value来查包中的汉字。我是先在linux上边tcpdump出完整的package data,然后呢,将文件down到windows上来用ethereal来做查看的。
我不是很理解你所说的 '要么在服务器端装支持相应编码的代理,然后dump数据。
你说的编码的代理,我觉得这个与整个网页的charset是有关系的。可能是不同的charset,gb2312,unicode或是gbk之类的。很难理解你说的编码的代理是什么东东?
我想ethereal就是没有去分析每个包应该用什么来charset来做显示,所以都以ascii来显示了。所以汉字就显示不出来。
要想ethereal知道使用什么样的charset显示,那么就需要联系其他包里的charset设置来做显示,看来ethereal目前还没这么做,就只是简单的显示ascii。
你的回答非常好,讲出了思路,比较开阔。另外,perl确实是个好东东。
wonderliang 回复于:2005-12-26 16:45:44
支持一下
zenith518 回复于:2005-12-26 21:19:16
如果是HTTP协议,那么查看数据包的方法就很多了,
1. 首先可以用tcpdump -Xls 0 ,(注意X 是upcase) 来同时看ASCII和HexDump,这个和solaris的snoop的命令行可以达到类似的效果。可以避免数据包当来当去的麻烦!
2. 还可以使用自己编写的Proxy(市面上有很多OpenSource的冬冬,稍做修改就可以用了,应尽量找跨平台的冬冬为好),挡在真正的服务器前面,在做转发的同时,截获客户端和服务器之间的对话。并同时按正确的charset(从HTTP头上应该可以获取到正确的charset的定义)打出请求和回应数据的Log,就可以了。
lazy_bug 回复于:2005-12-27 09:16:29
太经典的贴只.大开眼界,要好好学习!!研究.
jeffyan 回复于:2005-12-27 11:21:20
引用:原帖由 zenith518 于 2005-12-26 12:41 发表
现在的抓包工具,都不能正确显示汉字,而在实际工作中,也可以通过其他方法弥补,这个不足。如果真需要这么做,那就需要自己解包了。如果想查看HTTP协议中的东西,在客户端IE中装一个HTTP协议查看工具插件就可以了 ...
好像没有抓包和分析工具能正确显示汉字的
如果要测试 就只要用英文来测。
jeffyan 回复于:2005-12-27 11:24:23
ethereal 能支持很多应用层的协议,好像网站上说有一千多种,这样我们就不担心了,ethereal会自动识别的。
大家还可以分析msn messenger和qq的传输协议,呵呵,我就是看中了他能自动判断应用层的协议
welcome008 回复于:2005-12-27 11:45:33
不知道楼主同意不同意我把这个帖子放在俺的blog里,怕以后找不到了。
jeffyan 回复于:2005-12-27 12:28:54
引用:原帖由 welcome008 于 2005-12-27 11:45 发表
不知道楼主同意不同意我把这个帖子放在俺的blog里,怕以后找不到了。
知识是共享的,科技才能发展
可观 回复于:2005-12-27 15:29:44
好呀,学习一下!
bulletming 回复于:2005-12-28 02:15:20
抱着试试看的想法!我发现通过tcpdump加上-X的参数之后,直接倒成一个ascii的文件,然后你选择适合的工具来查看该文件就可以了。这样子的话,看汉字就没有问题了,直接按汉字搜索就可以了。
记事本看gb2312是没有问题的,当然ULTRAEDIT看LINUX上那些回车符就更加的方便。
不知大家是否同意我的观点!?
再次感谢ZENITH518!其实这个工作通过PERL可以很随意的较完美的来做!只是偷懒,想尽量的简单!
我需要再看看TCPDUMP的帮助,里边讲得很不错!另外,明天再看能否截获到MSN出去的字符,如果客户端加了密,就什么都不行了。
jeffyan 回复于:2005-12-28 17:51:08
引用:原帖由 bulletming 于 2005-12-28 02:15 发表
抱着试试看的想法!我发现通过tcpdump加上-X的参数之后,直接倒成一个ascii的文件,然后你选择适合的工具来查看该文件就可以了。这样子的话,看汉字就没有问题了,直接按汉字搜索就可以了。
记事本看gb2312是没有 ...
这种想法很不错 要支持
jianghao0726 回复于:2005-12-29 17:49:31
好东西,收藏
mirnshi 回复于:2005-12-29 18:03:26
谈到详细,还是man最详细了。lz好多开关项都没有谈及到呀,如-n -vv -e 等等,还有好多呢。这篇也就算是个入门
showrun 回复于:2005-12-30 10:33:51
-l 可以重定向。
例如“tcpdump -l 〉dat & tail -f dat”,再例如tcpdump -l |grep "sldfj"
过滤源主机物理地址为XXX的报头
如 tcpdump ether src 00:0c:76:32:80:14 and dst ...
showrun 回复于:2005-12-30 10:38:44
-n 不要转换地址(端口号,等)为名字。
如在不加-n时 tcpdump tcp port 80
10:48:07.039534 IP 222.36.42.67.http > 211.94.162.45.1299: P 955852503:955852797(294) ack 2262906593 win 6672
在加-n的情况下 tcpdump tcp port 80 -n
10:49:30.406379 IP 211.94.163.93.1125 > 66.249.89.104.80: F 2182359613:2182359613(0) ack 3130821434 win 64947
不同是在不加-n时端口号为80等已知协议端口都会自动转换为http等协议名称
showrun 回复于:2005-12-30 10:53:06
-e 命令是可以提供链路层的信息,如mac地址等。
-v -vv -vvv,是verbose(啰嗦)模式,一个比一个啰嗦。具体有什么差别,我也不是特别清楚。
还请,tcpdump达人不吝赐教啊
zenith518 回复于:2005-12-30 22:20:04
如果要看HTTP协议,可以在Windows的IE客户端安装HTTPWatch,就可以看到和服务器对话的所有应用层的东西,包括HTTP头消息,内容中的汉字也会正确显示。如果想发现,服务器对浏览器的重定向动作,也可以用这个冬冬,用起来很舒服的。
zenith518 回复于:2005-12-30 23:30:50
引用:原帖由 bulletming 于 2005-12-28 02:15 发表
抱着试试看的想法!我发现通过tcpdump加上-X的参数之后,直接倒成一个ascii的文件,然后你选择适合的工具来查看该文件就可以了。这样子的话,看汉字就没有问题了,直接按汉字搜索就可以了。
记事本看gb2312是没有 ...
这样是不行的,因为 -X之后,tcpdump只是将十六进制数值转换成ASCII数字在左边dump出来,如果该值能显示ASCII字符,就在右边显示,如果遇到不能显示的值(包括汉字),它就显示为".",所以要显示的话还是要自己编程解析出应用层,获取HTTP头,并按头中的charset指示对HTTP传输内容进行汉字编码的显示。
如果要sniffer MSN,有一个软件专门可以看,不过看别人聊天隐私好像也不太好吧。
http://www.effetech.com/ :)
[ 本帖最后由 zenith518 于 2005-12-30 23:35 编辑 ]
bulletming 回复于:2005-12-31 10:27:55
引用:原帖由 zenith518 于 2005-12-30 23:30 发表
这样是不行的,因为 -X之后,tcpdump只是将十六进制数值转换成ASCII数字在左边dump出来,如果该值能显示ASCII字符,就在右边显示,如果遇到不能显示的值(包括汉字),它就显示为".",所以要显示的话还 ...
hi,zenith518:
我试过了还是可以的呀!
从我以前一点点经验来看的话,我觉得ascii编码是非常完整的,不会轻易的truncate bit的,可以接受任何字符集一种字符集,以前我曾建了一个db,我选择的是最简单的ascii(当时很幼稚),当时呢,我客户端提交的以gb2312的方式提交的所有字符他都是可以接受的,然后呢,从数据库取出来之后呢,只要客户端ie选择合适的charset方式就可以显示了。我觉得字符的解析主要靠ie来完成的。但后来还是改了,因为使用一个java的Jasperreport作webprint,然后从db里边取出来都是乱码,后来只好转换整个db的charset:em16:
我在linux用vi去看tcpdump -X导出的数据,都可以很正常地看到的,并没有显示".",这个主要我觉得与你客户端telnet的工具有关。只要一个汉字它本身对应的两个bytes中的bit没有变,选择合适的对应的支持该charset的工具就能够查看的。tcpdump并没有对任何本身数据做更改。
我说那个是有局限的,
如果你过滤出来的ip packet中gb2312和unicode两种编码(来自或者送给不同网站编码可能多种),我想记事本不会正常显示的,ie的一个页面也也只能显示一种编码,这时候就需要想说你去根据其他包的charset来显示当前的包里的数据了。
如果ethereal软件最下边的窗口能够选择正确的charset来显示package byte,那就比较的完美了。
不过,我这边要求很简单,我就是监测到某一个网站的所有进出包,这样子可以了。
sinboy2002 回复于:2006-01-01 23:26:16
不错文章,
顶楼主
jeffyan 回复于:2006-01-02 11:59:10
引用:原帖由 zenith518 于 2005-12-30 22:20 发表
如果要看HTTP协议,可以在Windows的IE客户端安装HTTPWatch,就可以看到和服务器对话的所有应用层的东西,包括HTTP头消息,内容中的汉字也会正确显示。如果想发现,服务器对浏览器的重定向动作,也可以用这个冬冬, ...
用了,感觉还是没有Ethereal的全面具体
可能因人而异吧
guliny 回复于:2006-01-06 13:13:22
ok,good!
macrodba 回复于:2006-01-06 13:50:18
good .
sdemon915 回复于:2006-01-06 19:08:03
好文章!
wanzff 回复于:2006-01-07 02:05:19
强支持
loveKDE 回复于:2006-01-09 10:06:40
谢谢了
jeffyan 回复于:2006-01-23 17:12:50
想不到 这么多兄弟支持阿
macrodba 回复于:2006-01-25 16:50:34
支持一下了
bili 回复于:2006-02-16 14:00:50
我机器上运行TCPDUMP为什么反应很慢呢?
boyhyc 回复于:2006-02-16 14:34:47
好东西当然支持了,可惜就是我还不是太会用这两个命令
希望给几个例子操作以下
boyhyc 回复于:2006-02-16 15:11:56
引用:原帖由 jeffyan 于 2005-12-22 18:22 发表
配合Ethereal 用,无敌了,曾经过滤出整个公司的邮箱密码
想请教一下用tcpdump配合ethereal分析出来的信息中怎样分析出哪些是密码??:em14::em14:
soul_of_moon 回复于:2006-02-17 14:06:23
回LZ是原创吗?
ecapslock 回复于:2006-02-20 16:09:13
这也叫超级详细?
platinum 回复于:2006-02-20 19:20:53
呵呵,其实把 man tcpdump 的东西全翻译一遍就行了
movq 回复于:2006-02-23 21:40:26
支持,正好学习一下
jeffyan 回复于:2006-02-26 10:56:46
引用:原帖由 ecapslock 于 2006-2-20 16:09 发表
这也叫超级详细?
这还不详细??
jeffyan 回复于:2006-02-26 10:58:08
引用:原帖由 platinum 于 2006-2-20 19:20 发表
呵呵,其实把 man tcpdump 的东西全翻译一遍就行了
国人不缺说话的人,缺做实事的人,翻译其实也是一种技巧,不是那么容易的
platinum 回复于:2006-02-27 13:33:10
引用:原帖由 jeffyan 于 2006-2-26 10:58 发表
这还不够详细?!
本不想多说什么,但实事求是的说,-s -n -vvv -l -e -X 这些都是很基本也很重要的参数,但你根本没提到,怎么能说详细呢?
我还是宁愿自己去看英文的 man tcpdump,那里讲的更细致一些,更详细一些
如果你真的仔细研读过,就不会这么反问“这还不够详细”并挖苦别人“国人不缺说话的人,缺做实事的人”了 :wink:
要么不做,要做就做好,别人觉得你做的不好还不允许别人发表一下自己的建议或意见吗?未免太霸道了点吧?
朋友,学问不是这样做的。。。
zdl333 回复于:2006-02-28 09:30:43
简单精辟,好文章。
lsxlsx 回复于:2006-02-28 16:57:41
道理是越辨越明
werich 回复于:2006-03-02 09:49:27
UP
fnyjz 回复于:2006-03-03 14:11:14
首先谢谢楼主能够分享这么好的一个东东. 但是我对使用Ethereal过滤和分析出有价值的信息很感兴趣.不知哪为达人能奉献一下.
fzm2326 回复于:2006-03-17 13:23:32
不错,不错,好东西。
zenith518 回复于:2006-05-09 22:55:06
前一阶段空的时候,研究了一下Perl的中文字符集转换,发现目前的中文系统的默认内码是GBK的,但只有perl5.8以上对中文字符集的支持比较全面在不同字符集之间转换比较方便,但发现目前很多系统默认安装还只是Perl5.6.1,因此写了一个中文内码转换的冬冬,可以独立于系统字符集运行(已在英文Win2k和英文Linux中测试过),从UCS2/UTF8转到GBK,抓包时可以和我写的TCPDUMP重构模块结合使用,如果遇到UCS2/unicode中文内容可以直接转换成GBK,在SecureCRT或其他对系统字符集支持较好的终端软件中直接看到GBK中文内容。
模块已经在我的博客中发布!
eejx 回复于:2006-07-29 23:45:54
我现在想查看tcpdump文件里面的内容,在perl中用tcpdumplog读取tcpdump -w保存的文件,之后查看内容,发现我要的部分也都是乱码了,不知道应该怎样解码。要如何转换才能够看到真正的内容呢,可以确定的是我要查看的内容只是英文和一些字符的组合,类似xml结构的。谢谢了
|