tcpdump使用命令行对接口的数据包进行过滤抓包,其丰富的特性体现在灵活的表达方式上。不带任何选项的tcpdump默认会抓取第一个网络接口,直到tcpdump进程终止才会停止抓包。例如:shell>tcpdump-nn-ieth0icmp下面是tcpdump的详细用法。1.1tcpdump选项它的命令格式是:tcpdump[-DenNqvX][-ccount][-Ffile][-iinterface][-rfile][-ssnaplen][-wfile][expression]抓包选项:-c:指定获取的包数。注意,最终还是需要获取这么多包。例如,指定“-c10”将获取10个包,但可能已经处理了100个包,但只有10个包是符合条件的包。-iinterface:指定tcpdump需要监控的接口。如果不指定该选项,则从系统接口列表中查找配置的编号最小的接口(不包括loopback接口,使用tcpdump-ilo抓取loopback接口):一旦找到第一个满足条件的接口,搜索到此结束。所有网络接口都可以使用“any”关键字来表示。-n:地址显式为数字,否则为主机名,即-n选项不进行主机名解析。-nn:除了-n的作用外,端口也显示为一个值,否则显示端口服务名。-N:不打印出主机的域名部分。例如,tcpdump将打印“nic”而不是“nic.ddn.mil”。-P:指定要捕获的数据包是传入数据包还是传出数据包。可以给出的值有“in”、“out”和“inout”,默认是“inout”。-slen:设置tcpdump的抓包长度为len,如果不设置,默认为65535字节。当抓取的数据包较大时,如果长度设置不够,可能会出现截包的情况。如果发生数据包截断,“[|proto]”标记将出现在输出行中(proto实际上将显示为协议名称)。但是capturelen越长,数据包处理时间越长,会减少tcpdump可以缓存的数据包数量:这会导致数据包丢失,所以在我们能抓到的前提下packetswewant,capture长度越短越好。输出选项:-e:每行输出都会包含数据链路层报头信息,如源MAC和目的MAC。-q:快速打印输出。即打印的协议相关信息很少,所以输出行比较短。-X:输出包头数据,会同时以十六进制和ASCII输出。-XX:输出包的包头数据会同时以十六进制和ASCII输出,更详细。-v:分析和打印时产生详细的输出。-vv:产生比-v更详细的输出。-vvv:产生比-vv更详细的输出。其他功能选项:-D:列出可用于抓包的接口。将列出接口的数字编号和接口名称,两者都可以在“-i”之后使用。-F:从文件中读取抓包表达式。如果使用此选项,则命令行上给出的任何其他表达式都将无效。-w:将抓包数据输出到文件而不是标准输出。可以同时使用“-Gtime”选项,使输出文件每隔秒自动切换到另一个文件。可以通过“-r”选项加载这些文件进行分析和打印。-r:从给定的数据包文件中读取数据。使用“-”从标准输入读取。为您推荐:值得收藏!Linux系统常用命令速查手册所以常用的选项有这几个:tcpdump-Dtcpdump-cnum-iint-nn-XX-vvv1.2tcpdumpexpression表达式用来过滤输出哪些类型的数据包,如果没有给出表达式,将输出所有数据包,否则只输出表达式为真的数据包。出现在表达式中的Shell元字符建议用单引号括起来。tcpdump的表达式由一个或多个“单元”组成,每个单元一般包含ID修饰符和一个ID(数字或名称)。修饰符一共有三个:(1).type:指定ID的类型。可以给的值有host/net/port/portrange。例如“主机foo”、“网络128.3”、“端口20”、“端口范围6000-6008”。默认类型是主机。(2).dir:指定ID的方向。可以给的值包括src/dst/src或者dst/src和dst,默认是src或者dst。例如,“srcfoo”表示源主机为foo的数据包,“dstnet128.3”表示目标网络为128.3的数据包,“srcordstport22”表示源或目标端口为22的数据包。(3).proto:通过给定的协议限制匹配的数据包类型。常用的协议有tcp/udp/arp/ip/ether/icmp等,如果没有给出协议类型,将匹配所有可能的类型。例如“tcp端口21”、“udp端口??范围7000-7009”。因此,一个基本的表达单元格式是“protodirtypeID”。除了由修饰符和ID组成的表达式单元外,还有关键字表达式单元:gateway、broadcast、less、greater和算术表达式。可以使用运算符“and/&&/or/||/not/!”连接表达式单元,形成复杂的条件表达式。例如“hostfooandnotportftpandnotportftp-data”,表示过滤后的数据包必须满足“packageswithhostfooandportsotherthanftp(port21)andftp-data(port20)",commonports与名称的对应关系可以在Linux系统中的/etc/service文件中找到。另外,同样的修饰符可以省略,例如“tcpdstportftporftp-dataordomain”与“tcpdstportftportcpdstportftp-dataortcpdstportdomain”意思相同,即表示数据包的协议是tcp,目标端口是ftp或ftp-data或域(端口53)。使用方括号“()”改变表达式的优先级,但需要注意的是,方括号会被shell解释,所以需要时应使用反斜杠“\”转义为“\(\)”,也需要用引号引起来。1.3tcpdump示例注意tcpdump只能抓取流经本机的数据包。(1).默认情况下启动tcpdump。默认情况下,直接启动tcpdump将监视在第一个网络接口(不是lo端口)上流通的所有数据包。这样抓取的结果就会很多,滚动起来也很快。(2).监听指定网口的数据包tcpdump-ieth1如果没有指定网卡,默认的tcpdump只会监听第一个网口,比如eth0。(3).监控指定主机的数据包,比如所有进出longshuai的数据包tcpdumphostlongshuai(4)。打印helios<-->hot或helios<-->acetcpdumphostheliosand\(hotorace\)(5)之间通信的数据包。打印ace和任何其他主机之间通信的IP数据包,但不包括helios和heliostcpdumpiphostaceandnothelios(6)之间的数据包。拦截主机hostnametcpdumpsrchosthostname(7)发送的所有数据。监听所有发往Host主机名的数据包tcpdumpdsthosthostname(8)。监听指定主机和端口的数据包tcpdumptcpport22andhosthostname(9)。监听本地udp端口123(123是ntp的服务端口)tcpdumpudpport123(10)。监控指定网络的数据包,比如本机和192.168网段通信的数据包,“-c10”表示只抓10个包tcpdump-c10net192.168(11)。打印所有通过网关snup的ftp数据包(注意表达式用单引号括起来,可以防止shell误解析括号)shell>tcpdump'gatewaysnupand(portftporftp-data)'(12)。抓取ping包[root@server2~]#tcpdump-c5-nn-ieth0icmptcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),capturesize65535bytes12:11:23.273638IP192.168.100.70>190.168chorequest:IC,id16422,seq10,length6412:11:23.273666IP192.168.100.62>192.168.100.70:ICMPechoreply,id16422,seq10,length6412:11:24.356915IP192.168.100.70>192.168.100.62:ICMPechorequest,id16422,seq11,length6412:11:24.356936IP192.168.100.62>192.168.100.70:ICMPechoreply,id16422,seq11,length6412:11:25.440887IP192.168.100.70>192.168.100.62:ICMPechorequest,id16422,seq12,length64packetscapturedpacketsreceivedbyfilterpacketsdroppedbykernel如果要从主机192.168.100.70抓取本机的ping,使用and运算符[root@server2~]#tcpdump-c5-nn-ieth0icmpandsrc192.168.100.62tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),capturesize65535bytes12:09:29.957132IP192.168.100.70>192.168.100.62:ICMPechorequest,ID16166,SEQ1,长度6412:09:31.041035IP192.168.100.70>192.168.100.62:ICMMPECHOREQUEST,ID16166,SSEQ2,LENCEQ2,LENGTENG6412:09:32.124562P.192.192.192.192.192.192.192.192.192.192.192.19.19.19.ipt:33.208514IP192.168.100.70>192.168.100.62:ICMPechorequest,id16166,seq4,length6412:09:34.292222IP192.168.100.70>192.168.100.62:ICMPechorequest,id16166,seq5,length64packetscapturedpacketsreceivedbyfilterpacketsdroppedbykernel注意不能直接写icmpsrc192.168.100.70,因为icmp协议不支持直接申请主机类型。(13).抓取到本机22端口包[root@server2~]#tcpdump-c10-nn-ieth0tcpdstport22tcpdump:verboseoutputsuppressed,use-vor-vvforfullprotocoldecodelisteningoneth0,link-typeEN10MB(Ethernet),capturesize65535bytes12:06.5917.581742.1.5788>192.168.100.62.22:Flags[.],ack535528834,win2053,length012:06:57.629125IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack193,win2058IP:6419:6415.168.100.1.5788>192.168.100.62.22:Flags[.],ack385,win2051,length012:06:57.738977IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack577,win2050,length57.794305IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack769,win2050,length012:06:57.848720IP192.168.100.1.5788>192.168.100.62.22:Flags1,2046.22:Flack19.0[.]06:57.904057IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack1153,win2048,length012:06:57.958477IP192.168.100.1.5788>192.168.100.62g.24,ack230.24,flags[27],Fack230.62gs[27]。length012:06:58.014338IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack1537,win2053,length012:06:58.069361IP192.168.100.1.5788>192.168.100.62.22:Flags[.],ack1729,win2052,length0packetscapturedpacketsreceivedbyfilterpacketsdroppedbykernel(14).解#root[根]根目录tcpdump-c2-q-XX-vvv-nn-ieth0tcpdstport22tcpdump:listeningoneth0,link-typeEN10MB(以太网),capturesize65535bytes12:15:54.788812IP(tos0x0,ttl64,id19303,offset0,flags[DF],protoTCP(6),length40)192.168.100.1.5788>192.168.100.62.22:tcp00x0000:000c29089234005056c0000808004500..)..4.PV.....E.0x0010:00284b6740004006a5d8c0a86401c0a8.(Kg@.@.....d...0x0020:643e169c001624265fd61fec2b625010d>....$&_...+bP.0x0030:080378440000000000000000..xD......12:15:54.842641IP(tos0x0,ttl64,id19304,offset0,flags[PDF6),长度40)192.168.100.1.5788>192.168.100.62.22:TCP00X0000:000C29089234005056C000000808004500.......0x0020:643e169c001624265fd61fec2d625010d>....$&_...-bP.0x0030:080176460000000000000000..vF.....packetscapturedpacketsreceivedbyfilterpacketsdroppedbykernel一般情况下,tcpdump对于基本的抓包方法还是比较简单的,只要掌握几个有限的选项(-nn-XX-vvv-i-c-q),然后组合表达式即可.
