Tcpdump命令手册

来源:互联网 发布:暨南大学网络教学 编辑:程序博客网 时间:2024/06/06 13:17


tcpdump是非常强大的网络安全分析工具,可以将网络上截获的数据包保存到文件以备分析。可以定义过滤规则,只截获感兴趣的数据包,以减少输出文件大小和数据包分析时的装载和处理时间。

这篇文章只涉及tcpdump的基本用法,请记住tcpdump比本文描述的强大的多。

一.   tcpdump简明用法

Usage: tcpdump [-adeflnNOpqRStuvxX] [ -c count ] [ -Cfile_size ]
     [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen]
     [ -T type ] [ -U user ] [ -w file ] [ -Ealgo:secret ] [ expression ]

日常用法:tcpdump –i eth1 –pXls0 srcxxx.xxx.xxx.xx and port xxx

-c 捕获指定数量的报文
-F使用文件作为过滤表达式的源
-i 使用可选网络接口捕获报文
-p 禁止在杂凑模式下捕获、
-r读取捕获文件而非网络接口
-w保存原始报文到文件中

tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd   将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w   直接将包写入文件中,并不分析和打印出来;
   -T      将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议;)

二.   针对网络接口、端口和协议的数据包截取

指定通讯协议,ip icmp arp rarp和tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。

假定你要截取网络接口eth1,端口号6881的tcp数据包。数据文件保存为test.pcap:
tcpdump -w test.pcap -i eth1 tcp port 6881

有些版本的tcpdump允许指定端口范围,下述指令为针对一定端口范围截取数据。
tcpdump tcp portrange 20-24
很简单吧?如果要同时截取udp端口号33210和33220的数据包呢?
tcpdump -w test.pcap -i eth1 tcp port 6881 or udp \(33210 or 33220 \)
'\'是转义字符,逻辑符号or是加(+)的意思。其他表达式是截取端口号6881的tcp包加上端口号33210和33220的UDP包。 tcpdump过滤表达式的and运算符是交集的意思,因此截取端口号33210和33220的UDP包使用 or 而不是 and。and运算符的用法在下文描述。
事后分析:怎样从已保存的文件中读取数据包呢?
tcpdump -nnr test.pcap
选项 -nn 不把网络IP和端口号转换成名字,r(read)读取包。
可以添加 -tttt 选项使时间戳格式更加可读。
tcpdump -ttttnnr test.pcap

三.   怎样针对IP截取数据?

需向tcpdump指明IP类型,目的IP还是源IP?比如要嗅探的目的IP为10.168.28.22,tcp端口号22。
tcpdump -w test.pcap dst 10.168.28.22 and tcp port 22
目的IP和端口的交集(intersection),使用and运算符。
嗅探数据包大小缺省为96 bytes,可以指定 -s 改变缺省值。
tcpdump -w test.pcap -s 1550 dst 10.168.28.22 and tcpport 22
注意,上述指令没有指定 -w 把截取的数据包保存到文件而是直接输出到屏幕。

四.   不知道端口号使用tcpdump

互联网的数据流量太大,可以使用lsof搜索指定端口。(
Toidentify and monitor who is running what applications, which the application islistening to what port, established what connections, we can use lsof. lsof (List Open Files) are use for listingall current opened files. Besides the file name, it includes info such as whoopen it, what command use to open it, what type of file is it etc.
To list all Internet or network related opened files.
lsof –i
output:
COMMAND    PID  USER  FD   TYPE DEVICE SIZE NODE NAME

ktorrent  5220 mysurface   14u IPv4  13129       TCP *:6881 (LISTEN)

ktorrent  5220 mysurface   15u IPv6  13152       UDP *:6881

ktorrent  5220 mysurface   16u IPv4  41606       TCP 192.168.1.101:43234->122.49.147.27:32006(SYN_SENT)

ktorrent  5220 mysurface   17u IPv4  41597       TCP 192.168.1.101:59485->host-63-239-252-1.tetonwireless.com:6881(SYN_SENT)

ktorrent  5220 mysurface   18u IPv4  36757       TCP192.168.1.101:42724->203-36-217-77.dsl.dodo.com.au:25423 (ESTABLISHED)

...

You might facing some latency while listing them, thereason is, lsof cleverly replace your IP with DNS, so it need times to resolveDNS. To ask it stop to act smart and display with only numerical IP addresses,specified -n.

lsof -i -n

You may want to list open files with root permission,which returns you more entries.

sudo lsof -i -n

lsof list both IPv6 and IPv4 related files by default.You specified -i4 if you want entries with IPv4 only, same thing to IPv6,specified -i6.

sudo lsof -i4 -n

Okay, If you just want to list files which triggers bya specific user only, you can do this:

sudo lsof -i -n -a -u toydi

-a indicate AND logic, the entire line simply means, Iwant to list Internet related open files and these files must be trigger bytoydi
)

 

 

五.   tcpdump详细用法

1.      第一种是关于类型的关键字,主要包括host,net,port, 例如 host210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.

2.      第二种是确定传输方向的关键字,主要包括src ,dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src210.27.48.2 ,指明ip包中源地址是210.27.48.2, dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。

3.      第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网??上的特定的网络协议,实际上它是"ether" 的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。

4.      除了这三种类型的关键字之外,其他重要的关键字如下:gateway,broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要。

5.      下面举几个例子来说明

1)     普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump –i eth1 -p
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp50
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参数指定将监听到的数据包写入文件中保存

2)     想要截获所有210.27.48.1的主机收到的和发出的所有的数据包:
#tcpdump host 210.27.48.1

3)     想要截获主机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 \)

4)     如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

5)     如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
#tcpdump tcp port 23 host 210.27.48.1

6)     对本机的udp123端口进行监视 123 为ntp的服务端口
# tcpdump udp port 123

7)     系统将只对名为hostname的主机的通信数据包进行监视。主机名可以是本地主机,也可以是网络上的任何一台计算机。下面的命令可以读取主机hostname发送的所有数据:
#tcpdump -i eth0 src host hostname

8)     下面的命令可以监视所有送到主机hostname的数据包:
#tcpdump -i eth0 dst host hostname

9)     我们还可以监视通过指定网关的数据包:
#tcpdump -i eth0 gateway Gatewayname

10)   如果你还想监视编址到指定端口的TCP或UDP数据包,那么执行以下命令:
#tcpdump -i eth0 host hostname and port 80

tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

除了过滤语句,还有一个很重要的参数,也就是说,如果这个参数不设置正确,会导致包数据的丢失!它就是-s参数,snaplen, 也就是数据包的截取长度,仔细看man就会明白的!默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失!

只要使用-s0就可以按包长,截取数据!(snaplen描述数据包所需捕获的最大字节长度。如果该值小于所捕获的数据包大小,只有开始snaplen字节的内容被捕获并作为数据包数据提供。一个65535的值应该是足够的,在大多数网络情况下,捕获数据包可用的所有数据。)

六.   Tcpdump输出结果分析

下面我们介绍几种典型的tcpdump命令的输出信息

(1) 数据链路层头信息

使用命令#tcpdump --e host ice
ice
是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
H219
是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;
上一条命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1aip 60: h219.33357 > ice.

telnet 0:0(0) ack 22535 win 8760 (DF)
分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包,8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
(2) ARP
包的TCPDUMP输出信息

使用命令#tcpdump arp
得到的输出结果是:
  22:32:42.802509eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
  22:32:42.802902eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
  分析:22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。
(3) TCP
包的输出信息

用TCPDUMP捕获的TCP包的一般输出信息是:
  src >dst: flags data-seqno ack window urgent options
  src>dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN),P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号,window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options
是选项.

(4) UDP包的输出信息

 用TCPDUMP捕获的UDP包的一般输出信息是:
  route.port1 > ice.port2: udp lenth
UDP
十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth。

七.   案例分析:利用Tcpdump分析网络安全

  作为IP网络的系统管理员,经常会遇到一些网络连接方面的故障,在排查这些接故障时,除了凭借经验外,使用包分析软件往往会起到事半功倍的效果。

  常用的包分析软件非常多,常见的如tcpdump,sniffer,windump,ettercap等。下面看看用TcpDump分析详细例子:

(1)网络邮件服务器(mail)在排障

  我们先来看看故障现象,在一局域网中新安装了后台为qmail的邮件服务器server,邮件服务器收发邮件等基本功能正常,但在使用中发现一个普遍的怪现象:pc机器上发邮件时连接邮件服务器后要等待很久的时间才能开始实际的发送工作。我们来看,从检测来看,网络连接没有问题,邮件服务器server和下面的pc性能都没有问题,问题可能出在哪里呢?为了进行准确的定位,我们在pc机client上发送邮件,同时在邮件服务器server上使用tcpdump对这个client的数据包进行捕获分析,如下:

server#tcpdump host client
tcpdump: listening on hme0
23:41:30.040578 client.1065 > server.smtp: S 1087965815:1087965815(0)win 64240 (DF)
23:41:30.040613 server.smtp > client.1065: S99285900:99285900(0) ack 1087965816 win 10136 (DF)
23:41:30.040960 client.1065 > server.smtp: . ack 1 win64240 (DF)

顺利的完成,到目前为止正常,我们再往下看:

23:41:30.048862 server.33152 > client.113: S 99370916:99370916(0)win 8760 (DF)
23:41:33.411006 server.33152 > client.113: S99370916:99370916(0) win 8760 (DF)
23:41:40.161052 server.33152 > client.113: S99370916:99370916(0) win 8760 (DF)
23:41:56.061130 server.33152 > client.113: R99370917:99370917(0) win 8760 (DF)
23:41:56.070108 server.smtp > client.1065: P 1:109(108)ack 1 win 10136 (DF)

看出问题了,问题在:我们看到server端试图连接client的113identd端口,要求认证,然而没有收到client端的回应,server端重复尝试了3次,费时26秒后,才放弃认证请求,主动发送了reset标志的数据包,开始push后面的数据,而正是在这个过程中所花费的26秒时间,造成了发送邮件时漫长的等待情况。问题找到了,就可以修改了,我们通过修改服务器端的qmail配置,使它不再进行113端口的认证,再次抓包,看到邮件server不再进行113端口的认证尝试,而是在三次检测后直接push数据,问题得到完美的解决。

(2)网络安全中的ARP协议的故障

  先看故障现象,局域网中的一台采用solaris操作系统的服务器A-SERVER网络连接不正常,从任意主机上都无法ping通该服务器。排查:首先检查系统,系统本身工作正常,无特殊进程运行,cpu,内存利用率正常,无挂接任何形式的防火墙,网线正常。此时我们借助tcpdump来进行故障定位,首先我们将从B-CLIENT主机上执行ping命令,发送icmp数据包给A-SERVER,如下:

[root@redhat log]# ping A-SERVER
PING A-SERVER from B-CLIENT : 56(84) bytes of data.
此时在A-SERVER启动tcpdump,对来自主机B-CLIENT的数据包进行捕获。
A-SERVER# tcpdump host B-CLIENT
tcpdump: listening on hme0
16:32:32.611251 arp who-has A-SERVER tell B-CLIENT
16:32:33.611425 arp who-has A-SERVER tell B-CLIENT
16:32:34.611623 arp who-has A-SERVER tell B-CLIENT

  我们看到,没有收到预料中的ICMP报文,反而捕获到了B-CLIENT发送的arp广播包,由于主机B-CLIENT无法利用arp得到服务器A-SERVER的地址,因此反复询问A-SERVER的MAC地址,由此看来,高层的出问题的可能性不大,很可能在链路层有些问题,先来查查主机A-SERVER的arp表:

A-SERVER# arp -a
Net to Media Table
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
hme0 netgate 255.255.255.255 00:90:6d:f2:24:00
hme0 A-SERVER 255.255.255.255 S 00:03:ba:08:b2:83
hme0 BASE-ADDRESS.MCAST.NET 240.0.0.0 SM 01:00:5e:00:00:00

  请注意A-SERVER的Flags位置,我们看到了只有S标志。我们知道,solaris在arp实现中,arp的flags需要设置P标志,才能响应ARPrequests。

手工增加p位
A-SERVER# arp -s A-SERVER 00:03:ba:08:b2:83 pub
此时再调用arp -a看看
A-SERVER# arp -a
Net to Media Table
Device IP Address Mask Flags Phys Addr
------ -------------------- --------------- ----- ---------------
hme0 netgate 255.255.255.255 00:90:6d:f2:24:00
hme0 A-SERVER 255.255.255.255 SP 00:03:ba:08:b2:83
hme0 BASE-ADDRESS.MCAST.NET 240.0.0.0 SM 01:00:5e:00:00:00

  我们看到本机已经有了PS标志,此时再测试系统的网络连接恢复正常,问题得到解决。

(3)netflow软件的问题

  先看故障现象,在新装的网管工作站上安装cisco netflow软件对路由设备流量等进行分析,路由器按照要求配置完毕,本地工作上软件安装正常,无报错信息,但是启动netflow collector却收不到任何路由器上发出的流量信息,导致该软件失效。 排查现象,反复检查路由和软件,配置无误。采用逐步分析的方法,首先先要定位出有问题的设备,是路由器根本没有发送流量信息还是本地系统接收出现了问题?突然想到在路由器上我们定义了接收的client端由udp端口9998接收数据,可以通过监视这个端口来看路由器是否确实发送了udp数据,如果系统能够接收到来自路由的数据包,那么路由方面的问题可能行不大,反之亦然。

在网管工作站上使用tcpdump来看看:

nms#tcpdump port 9995
tcpdump: listening on hme0
18:15:34.373435 routea > nms.9995: udp 1464
18:15:34.373829 routea.50111 > nms.9995: udp 1464
18:15:34.374100 routea.50111 > nms.9995: udp 1464

  马上我们就看到数据包确实从路由器上发过来了,问题出在路由器的可能性基本排除,重新核查系统,果然,网管工作站上安装了防火墙,udp端口9998是被屏蔽的,调整工作站上的防火墙配置,netflow工作恢复正常,故障得以排除。