tcpdump是Unix下一个强大的网络数据包捕获工具,它允许用户截取和显示通过网络连接发送或接收到计算机的TCP/IP和其他数据包,可用于大多数类型的数据包。Unix系统:包括Linux、Solaris、BSD、MacOSX、HP-UX、AIX等;在这些系统中,tcpdump使用libpcap来抓取数据(tcpdump在Windows下的版本叫做WinDump,需要WinPcap驱动,相当于Linux平台下的libpcap)。用途tcpdump能够分析网络行为、性能以及生成或接收网络流量的应用程序。支持对网络层、协议、主机、网络或端口进行过滤,提供and、or、not等逻辑语句,帮助过滤掉无用信息。通过tcpdump,可以详细分析网络状况,比如丢包和重传,详细报告Text,handshake和wave,tcp分组情况等等,是排查网络问题的利器。Libpcap注意,tcpdump只是一个命令行工具,其核心抓包功能由libpcap提供。基本工作原理是不同操作系统实现的底层封装。捕获机制可能不同,但形式相似。数据包的常规传输路径是网卡、设备驱动层、数据链路层、IP层、传输层,最后到达应用程序。抓包机制是在数据链路层增加一个旁路过程,对发送和接收的数据包进行过滤/缓冲等相关处理,最后直接传递给应用程序。值得注意的是,抓包机制并不影响操作系统对数据包的网络栈处理。对于用户程序来说,抓包机制提供了一个统一的接口,使得用户程序只需调用几个函数就可以获取到想要的数据包。这样,特定操作系统的捕获机制对用户是透明的,从而使用户程序具有更好的可移植性。包过滤机制是根据用户的要求对捕获到的数据包进行过滤,最后只将满足过滤条件的数据包传递给用户程序。tcpdump中使用的libpcap也是采用这种链路层绕过处理的形式来实现抓包功能。)等待。由于tcpdump和wireshark使用的几个抓包工具libpcap/WinPcap/Npcap(具体谁,取决于使用的平台)的文件格式是一样的,所以用tcpdump保存的pcap文件也可以用wireshark打开,直接在服务器上使用它用tcpdump查看不是很直观,所以一般使用tcpdump将抓包文件保存到本地,然后在本地使用wireshark查看。用法tcpdump[-AdDeflLnNOpqRStuUvxX][-ccount][-Cfile_size][-Ffile][-iinterface][-mmodule][-Msecret][-rfile][-ssnaplen][-Ttype][-w文件][-W文件数][-Espi@ipaddralgo:secret,...][-ydatalinktype][-Zuser][expression]OPTIONS:-A以ASCII码显示每个数据包(不会显示数据包中的链路层头信息)。抓取包含的网页数据有数据包时,方便查看数据(nt:Handyforcapturewebpages)。-ccounttcpdump会在收到count个数据包后退出。-Cfile-size(nt:该选项与-wfile选项配合使用)该选项使tcpdump在将原始数据包直接保存到文件之前检查文件大小是否超过file-size。如果超过,则关闭该文件并创建另一个文件继续使用原来的数据包记录。新建的文件名与-w选项指定的文件名相同,只是文件名后多了一个数字。该数字将从1开始,并随着新创建文件的数量增加。file-size的单位是百万字节(nt:这里指的是1,000,000字节,不是1,048,576字节,后者是以1024字节为1k,1024k字节为1M计算的,即1M=1024*1024=1,048,576)-d以易于阅读的形式在标准输出上打印出格式化的数据包匹配代码,然后tcpdump停止。(nt|rt:humanreadable,easytoread,通常指用ascii码打印一些信息.compiled,edited.packet-matchingcode,packet-matchingcode,意义不明,需要补充)-dd打印出数据包-C语言匹配代码。-ddd以十进制形式打印出数据包匹配代码匹配代码前面有一个额外的'count'前缀)。-D打印系统上tcpdump可以捕获数据包的所有网络接口。每个接口都会打印编号、相应的接口名称,可能还有网络接口描述。可以在tcpdump的-i标志选项(nt:用名称或数字替换标志)中使用网络接口名称和编号来指定在其上捕获数据包的网络接口。该选项不支持接口列表命令(nt:例如,Windows系统,或缺少ifconfig-a的UNIX系统);接口编号在Windows2000及更高版本的系统上很有用,在这些系统中接口名称很复杂且难以使用。如果编译tcpdump的libpcap库太旧,将不支持-D选项,因为它缺少pcap_findalldevs()函数。-e将在打印输出信息的每一行中包含数据包的数据链路层报头-Espi@ipaddralgo:secret,...IPsecESP数据包可以通过spi@ipaddralgo:secret(nt|rt:IPsecEncapulatingSecurityPayload,IPsec封装安全载荷,IPsec可以理解为,一套IPPacket加密协议,ESP是整个IP数据包或者上层协议部分的加密数据,前者的工作模式称为隧道模式;后者的工作模式称为传输模式。工作原理,待补充)。需要注意的是,终端启动tcpdump时,可以为IPv4ESP包设置key(secret)。可用于加密的算法包括des-cbc、3des-cbc、blowfish-cbc、rc3-cbc、cast128-cbc或无(无)。默认是des-cbc(nt:des,DataEncryptionStandard,数据加密标准,加密算法未知,待补充)。secret是用于ESP的密钥,以ASCII字符串表示。如果它以0x开头,则密钥将以十六进制读取。此选项中ESP的定义遵循RFC2406,而不是RFC1827。而且,该选项仅用于调试,不建议使用真实密钥(secret)来使用该选项,因为它不安全:命令行输入的secret可以被其他人通过命令查看,例如附言。除了上面的语法格式(nt:指的是spi@ipaddralgo:secret),还可以加上一个tcpdump使用的语法输入文件名(nt:replacespi@ipaddralgo:secret,...语法文件名)。这个文件在收到第一个ESP 包的时候会打开这个文件,所以这个时候最好取消一些授予tcpdump的权限(nt:可以理解为经过这个防御之后,当文件被恶意写入的时候,不会造成太大的伤害)。-f显示外部IPv4地址(nt:foreignIPv4addresses,可以理解为,non-localipaddress)时,用数字代替名字。(该选项用于处理Sun的NIS服务器的缺陷(nt:NIS,NetworkInformationService,tcpdump显示她提供的名称服务将用于国外地址的名称):此NIS服务器将经常陷入查询非本地地址名称时的无限查询循环)。由于对foreign(国外)IPv4地址的测试需要使用localnetworkInterface(nt:tcpdump抓包时使用的接口)及其IPv4地址和netmask。如果这个地址或者网络掩码不可用,或者这个接口根本没有设置对应的网络地址和网络掩码(nt:linux下面的'any'网络接口不需要设置地址和掩码,但是这个'any'接口可以从系统中的所有接口接收数据包),该选项不能正常工作。-Ffile使用文件file作为过滤表达式键入输入,此时命令行上的输入将被忽略。-iinterface指定tcpdump需要监控的接口。如果未指定,tcpdump将从系统接口列表中搜索最小编号配置的接口(不包括环回接口)。一旦找到第一个符合条件的接口,搜索将立即结束。在使用2.2或更高版本的Linux操作系统上,虚拟网络接口'any'可以用于接收所有网络接口上的数据包(nt:这将包括那些发往该网络接口的数据包,以及那些不发往该网络接口的数据包网络接口)。需要注意的是,如果真实网络接口不能工作在“混杂”模式(promiscuous),你就无法在“any”虚拟网络接口上抓取它的数据包。如果指定了-D标志,tcpdump将打印系统中的接口编号,此编号可用作此处的接口参数。-lLinebufferthestandardoutput(nt:使标准输出设备在遇到换行符时立即打印出这一行的内容)。当您需要观察抓包打印并同时保存抓包记录时非常有用。例如,这可以通过以下命令的组合来实现:``tcpdump-l|teedat''或``tcpdump-l>dat&tail-fdat''。(nt:前者使用tee将tcpdump输出同时放到dat文件和标准输出,后者通过重定向操作'>'将tcpdump的输出放入dat文件,将dat文件的内容放入通过tail进入标准输出)-L列出指定网络接口支持数据链路层类型后退出。(nt:Specifytheinterfacethrough-itospecify)-mmodule通过module指定的文件加载SMIMIB模块(nt:SMI,StructureofManagementInformation,管理信息结构MIB,ManagementInformationBase,管理信息库。它可以理解为两者都是用来抓SNMP(SimpleNetworkManagementProtocol)协议包的,SNMP的具体工作原理不详,有待补充)。这个选项可以多次使用,以便为tcpdump加载不同的MIB模块。-Msecret如果TCP数据包(TCP段)有TCP-MD5选项(在RFC2385中描述),则为其摘要验证指定一个公钥秘密。-n错误的地址(比例如,主机地址、端口号)执行数字到命名的转换。-N不打印host的域名部分。例如,如果设置了此选项,tcpdump将打印“nic”而不是“nic.ddn”。密尔'。-O不要启用在进行数据包匹配时使用的优??化代码。当您怀疑某些错误是由优化代码引起时,此选项很有用。-p通常,将网络接口设置为非“混杂”模式。但必须注意的是,这个网络接口在特殊情况下仍然会以“混杂”模式工作;因此,设置或不设置'-p'不能用作以下选项的同义词:'etherhost{local-hw-add}'或'etherbroadcast'(nt:前者表示仅匹配以太网地址为host,后者表示匹配以太网地址为广播地址的数据包)。-q快速(也许“安静”更好?)打印输出。即打印很少的协议相关信息,所以输出行比较短。-R设置tcpdump按照RFC1825而不是RFC1829来分析ESP/AH数据包(nt:AH、认证头、ESP、安全负载封装,两者都用于IP包的安全传输机制)。如果设置了此选项,tcpdump将不会打印出“norelay”字段(nt:中继预防字段)。另外,由于ESP/AH规范中没有规定ESP/AH数据包中必须有协议版本号字段,所以tcpdump无法从接收到的ESP/AH数据包中推导出协议版本号。-rfile从文件file中读取包数据。如果文件字段是'-'符号,tcpdump将从标准输入中读取包数据。-S打印TCP数据包序号时,使用绝对序号而不是相对序号。(nt:relativesequencenumber可以理解为,相对于第一个TCP包的sequencenumber的差距,比如receiver接收到的第一个包的绝对sequencenumber是232323,对于第二个和第三个包稍后收到,tcpdump会打印其序列号1和2,分别表示与第一个数据包的间隔为1和2。而此时如果设置了-S选项,对于后面收到的第二个,第三个数据包将打印出它的绝对序号:232324,232325).-ssnaplen设置tcpdump的抓包长度为snaplen,不设置则默认为68字节(支持networkinterfacetap(nt:NIT,上面有介绍,可以搜索'networkinterfacetap'关键字找到)的SunOS系列操作系统中默认最小值为96)。68字节为对于IP、ICMP(nt:InternetControlMessageProtocol,互联网控制消息协议)、TCP和UDP协议来说已经足够了,但是对于nameservice(nt:可以理解为dns、nis等服务)、NFS服务相关的数据包就会截断。如果有truncatedpacket,tcpdump对应的打印输出行会出现''[|proto]''(proto实际上会显示为truncatedpacket需要注意的是,使用longcapturelength(nt:snaplen是比较大)会增加数据包的处理时间,并且会减少tcpdump可以缓存的数据包数量,从而导致丢包Lost。因此,在能够抓到我们想要的数据包的前提下,抓包长度越小越好。设置snaplen为0表示tcpdump自动选择合适的长度抓包。typeisadvisableprotocol:aodv(Ad-hocOn-demandDistanceVectorprotocol,按需距离矢量路由协议,在Adhoc(点对点模式)网络中),cnfp(CiscoNetFlow协议),rpc(RemoteProcedure)Call),rtp(Real-TimeApplicationsprotocol),rtcp(Real-TimeApplicationscon-trolprotocol),snmp(SimpleNetworkManagementProtocol),tftp(TrivialFileTransferProtocol,碎片文件协议),vat(VisualAudioTool,一种可用于网络视频会议的应用层协议),以及wb(分布式白板,一种可用于网络会议的应用层协议).-t在每一行不在输出中打印时间戳-tt不格式化每一行的时间输出(nt:这种格式可能一眼看不出它的意思,比如打印时间戳为1261798315)-ttt输出tcpdump时,每两行打印之间会延迟一段时间(以毫秒为单位)-tttt在每行打印的时间戳之前添加日期打印-u打印出未加密的NFS句柄(nt:handle可以理解为文件句柄在NFS中使用,它将包括文件夹和文件夹中的文件)-U使tcpdump在使用-w选项时同步写入其文件和数据包保存。(nt:即,当每个数据包被保存时,会及时写入文件,而不是当文件的输出缓冲区已满时才真正写入文件)-U标志在旧版本上不起作用libcap库(nt:tcpdump依赖的数据包捕获库),因为缺少pcap_cump_flush()函数。-v分析和打印时,产生详细的输出。例如,IP数据包的生命周期、标识、总长度和一些选项。这还将启用一些额外的数据包完整性检查,例如IP或ICMP数据包标头中的校验和。-vv产生比-v更详细的输出。例如,将打印NFS回复数据包中的附加字段,并完全解码SMB数据包。-vvv产生比-v-vv更详细的输出更详细的输出。例如telnet使用的SB和SE选项会被打印,如果telnet同时使用图形界面,则相应的图形选项会以16进制打印(nt:telnet的SB和SE选项的含义是未知,需要补充)。-w将数据包数据直接写入文件,不分析打印出来。这些数据包数据可以通过-r选项重新读取、分析和打印。数据超过这里设置的限制,之前的文件会依次被替换,相当于一个文件有filecount个文件的Bufferpool。同时,这个选项会导致每个文件名的开头出现足够多的0,可以方便这些文件被正确排序。-x在分析打印时,tcpdump会打印每个数据包的包头数据,并以十六进制打印出每个数据包的数据(但不包括连接层的包头)。打印数据的总大小不会超过整个数据包的大小snaplen中的最小值。必须注意的是,如果高层协议数据没有snaplen那么长,而且数据链路层(比如以太网层)有padding数据,这些padding数据也会被打印出来。(nt:soforlinklayersthatpad,无法理解和翻译,需要添加)-xxtcpdump将打印每个数据包的头部数据,并以十六进制打印出每个数据包的数据,包括数据链路层头部.-X在分析打印的时候,tcpdump会打印出每个数据包的包头数据,并且会以十六进制和ASCII码的形式打印出每个数据包的数据(不包括连接层的包头)。这对于分析一些新协议的数据包非常方便。-XX在分析打印时,tcpdump会打印出每个数据包的包头数据,同时以十六进制和ASCII码的形式打印出每个数据包的数据,其中包括数据链路层的包头。这对于分析一些新协议的数据包非常方便。-ydatalinktype设置tcpdump只抓取数据链路层协议类型为datalinktype的数据包-Zuser使tcpdump放弃超级权限(如果以root用户启动tcpdump,tcpdump将拥有超级用户权限),并设置用户ID当前tcpdump的为user,组ID设置为用户先所属组的ID(这里的nt:tcpdump可以理解为tcpdump运行后对应的进程)这个选项也可以设置为默认开启编译时。(nt:此时user的值未知,需要添加)直接启动tcpdump会监听所有流经第一个网口的数据包tcpdump监听指定网卡的数据包tcpdump-ieth1如果是不指定网卡,默认tcpdump只会监听第一个网络接口,一般是eth0,以下例子不指定网络接口监听指定主机的数据包tcpdumphostsundown也可以指定ip,比如拦截210.27.48.1的主机接收和发送的所有数据包tcpdumphost210.27.48.1监听指定主机和端口的数据包tcpdumptcpport23host210.27.48.1这里虽然and没有写,但是默认是and逻辑抓包pcap文件保存到本地tcpdump[options]-w/path/to/file.pcapcapturespecifiedprotocoltcpdumpicmp/tcp/udpfiltersrc/DSTtcpdumpsrc1.1.1.1tcpdumpdst1.0.0.1#src和dst可以组合特定的属性,比如porttcpdumpsrcport1025tcpdumpdstport443如果你只想看一个方向或另一个方向的流量,你可以使用src和dst。组合过滤tcpdumpfilter_exp1和filter_exp2或filter_exp3tcpdump支持三种组合表达式形式:AND-andor&&OR-oror||除了不或!参考libpcap源码分析基于linux平台的tcpdump-WikiPediatcpdump-manpageAtcpdumpTutorialwithExamples—50WaystoIsolateTraffic
