48、tcpdump简单使用
1、说明
tcpdump - dump traffic on a network
tcpdum option
tcpdump [-adeflnNOpqStvx] [-c 数量][-F 文件名][-i 网络界面][-r 文件名][-s snaplen][-T 类型][-w 文件名][表达式]
TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
系统时间 来源主机.端口 > 目标主机.端口 数据包参数
07:40:51.668134 IP 192.168.161.160 > 10.6.12.8: ICMP echo request, id 12587, seq 5, length 64
07:40:51.671144 IP 10.6.12.8 > 192.168.161.160: ICMP echo reply, id 12587, seq 5, length 64
用tcpdump过滤出来的数据用Ethereal 来分析。
2、option
-a | 将网络位址和广播地址转变成名字; |
-b | 在数据链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的 |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出; |
-dd | 将匹配信息包的代码以c语言程序段的格式给出; |
-ddd | 将匹配信息包的代码以十进制的形式给出; |
-e | 在输出行列印出资料连结层的头部信息; |
-f | 将外部的Internet位址以数位的形式打印出来; |
-l | 使标准输出变为缓冲行形式; 进行重定向 |
-n | 不把网络位址转换成名字; |
-nn | 不进行端口名称的转换。 |
-N | 不打印出默认的域名。 |
-s | 指定数据包的长度 |
-t | 在输出的每一行不打印时间戳; |
-tt | 打印原始的、未格式化过的时间。 |
-tttt | 完整的时间格式 |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; |
-vv | 输出详细的报文信息; |
-c | 在收到指定的包的数目后,tcpdump就会停止; |
-F | 从指定的文件中读取表达式,忽略其他的表达式; |
-X | print packet format in hex and ASCII. |
-i | 指定监听的网络界面; |
-r | 从指定的档中读取包(这些包一般通过-w选项产生); |
-w | 直接将包写入档中,并不分析和打印出来; |
src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等子选项。他们用来分辨数据包的来源和去向。host指定主机相关无论它是源还是目的,net指定网络相关的,ether是物理地址,而gateway则用于网关。 | |
ip icmp arp rarp和tcp udp icmp这些选项要放到第一个参数位置,用来过滤数据报的类型。 | |
-T | 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远端过程) |
3、表达式
1)表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件。
在表达式中一般有如下几种类型的关键字,一种是关于类型的关键字,主要包括host,net,port;第二种是确定传输方向的关键字,主要包括src,dst,dst or src, dst and src;第三种是协议的关键字,主要包括ip ,arp,rarp,tcp,udp等类型。
还有其他关键字,gateway, broadcast,less,greater,还有三种逻辑运算,非'not ' '! ';与'and','&&';或'or' ,'||';
2)src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,"." (没有标记),S是SYN标志, F (FIN), P(PUSH) , R (RST) ; data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针。
4、示例
1)tcpdump //监听所有数据包
2)tcpdump -b arp
3)tcpdump -i eth0 //只显示通过eth0接口上的所有报头
4)src host 192.168.0.1 //指定源主机IP地址是192.168.0.1
5)dst net 192.168.0.0/24 //指定目标是网络192.168.0.0
6)tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24
7)tcpdump ether src 00:50:04:BA:9B
8)tcpdump src host 192.168.0.1 and dst port not telnet //过滤源主机192.168.0.1和目的端口不是telnet的报头
9)tcpdump ip//只过滤数据-链路层上的IP报头。
10)tcpdump udp and src host 192.168.0.1 //只过滤源主机192.168.0.1的所有udp报头。
11)tcpdump tcp port 23 host 210.27.48.1
12)tcpdump -w test.out -i eth0 tcp port 6881
13)tcpdump -w test.out -i eth0 tcp port 6881 or udp \( 33210 or 33220 \)
14)tcpdump -w test.out dst 10.168.28.22 and tcp port 22
15)tcpdump tcp portrange 20-24
16)tcpdump -s 1500 //-s 0就可以按包长,截取数据
17)tcpdump -l > dat & tail -f dat”,例如tcpdump -l |grep "sldfj"
18)tcpdump ip host 210.27.48.1 and !210.27.48.2
5、其他
1)在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。
2)显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。
参考
【1】 http://baike.baidu.com/view/76504.htm
【2】 http://gosman.blogbus.com/logs/5504841.html
【3】 后面的讨论不错
http://www.chinaunix.net/jh/29/674578.html
【4】 http://jessy.blog.51cto.com/476840/131993
【5】 http://linux.vbird.org/linux_server/0140networkcommand.php#tcpdump