tcpdump中文手册
- 格式:doc
- 大小:88.00 KB
- 文档页数:14
tcpdump使用手册【原创版】目录1.tcpdump 简介2.tcpdump 的基本语法3.tcpdump 的高级特性4.tcpdump 的实际应用5.结论正文1.tcpdump 简介tcpdump 是一个网络协议分析器,它可以用于捕获、分析和解码网络数据包。
它广泛应用于网络故障排除、网络安全监控和网络协议分析等领域。
tcpdump 通过将网络接口放入促销模式,可以截获所有通过该接口的数据包,然后使用强大的过滤引擎和分析工具对数据包进行处理。
2.tcpdump 的基本语法tcpdump 的基本语法包括以下几个部分:- 捕获网络接口:tcpdump 可以通过`-i`选项指定要捕获的网络接口,如`-i eth0`。
- 设置过滤规则:tcpdump 可以通过`-nn`选项打开 ASN.1 和IPsec 解码,通过`-vvv`选项打开详细的调试输出。
- 设置数据包解码方式:tcpdump 可以通过`-X`选项指定解码方式,如`-Xutf8`表示使用 UTF-8 编码解码。
- 设置数据包输出方式:tcpdump 可以通过`-w`选项将数据包输出到文件,通过`-n`选项防止 DNS 解析。
3.tcpdump 的高级特性除了基本的语法和功能,tcpdump 还具有以下高级特性:- 强大的过滤引擎:tcpdump 可以使用正则表达式和布尔运算符进行数据包过滤,可以精确地筛选出需要的数据包。
- 丰富的分析工具:tcpdump 提供了多种分析工具,如`sum`可以统计数据包的数量,`wireshark`可以将数据包转换为 Wireshark 格式。
- 高级的解码功能:tcpdump 可以解码多种协议,如 TCP、UDP、ICMP 等,可以显示详细的协议数据。
4.tcpdump 的实际应用tcpdump 在实际应用中可以用于以下场景:- 网络故障排除:通过捕获网络数据包,可以分析网络故障的原因,如丢包、延迟等。
- 网络安全监控:通过过滤和分析网络数据包,可以检测网络中的恶意行为,如入侵、攻击等。
原文地址=========以下是本文档完整版本地址:/posts/14645.html(nt: 出现这一提示是为了避免一些网络蜘蛛把文章分成几个页面给查看带来不悦)中文版本=========TCPDUMP(8)TCPDUMP(8)名字tcpdump - 显示网络负载用法概览tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ][ -C file_size ] [ -F file ][ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ][ -W filecount ][ -E spi@ipaddr algo:secret,... ][ -y datalinktype ] [ -Z user ][ expression ]描述Tcpdump 将显示相应网络接口上,满足特定条件数据包的相关信息, 特定条件可通过布尔条件表达式来表达. 可以在启动tcpdump 时加入-w 选项, 这会使她把收到的包数据存入文件中, 以备后续分析(nt: 文件名字由此选项中的file 参数指定). 而-r 选项将会使tcpdump 直接从之前保存的包数据文件(nt: 通过-w 选项产生的文件)中读入数据包, 而不是从相应网络接口上获取数据包. 不管通过哪种方式读入数据包, tcpdump只会处理那些布尔条件表达式得到满足的数据包.如果启动时不带-c 选项, tcpdump会不停抓取数据包, 不过此过程中可被以下两个信号打断: SIGINT信号(例如, 当我们敲入中断控制符(nt: 按下ctrl键, 同时按下c键可产生此字符)), SIGTERM信号(一般可通过kill 命令产生(nt: kill(1) 表示可通过在终端中敲入man 1 kill 命令来查询到kill 的用法));如果启动时带上-c选项, tcpdump只会抓取指定数目的数据包, 并且此过程也可被以上两个信号中断.当tcpdump 完成了数据包的抓取, 她会报告如下几种数据包的数目:''captured''类型的数据包("被抓取的数据包", 其数目表示tcpdump已经收到并进行了处理的数据包个数);''received by filter''类型数据包("匹配过滤条件的数据包", 其数目的含义随操作系统不同, 以及操作系统配置方式的不同而不同:比如, 如果在tcpdump启动命令行中指定一个过滤条件, 我们将会得到''received by filter''类型的包数目(nt | rt: 如果不指定过滤条件, 其含义未知, 需补充).在一些操作系统中, 此数目既包括与过滤条件匹配的数据包,也包括不匹配的, 并且与tcpdump是否对此包进行过读取和处理无关;在另一些操作系统中, 此数目仍然与是否对此包进行过读取和处理无关, 但只包含与过滤条件匹配的数据包;除此以外, 在其他一些操作系统中, 此数目却只包含匹配过滤条件并且被tcpdump处理过的数据包).''dropped by kernel''类型数据包("被内核丢弃的数据包", 其数目含义如下: 如果操作系统不反馈此信息, 此数目将是0;如果操作系统反馈此信息, 此数目表示tcpdump 所在的操作系统对包的丢弃的数目, 而这些包或许是因为无缓冲空间, 或许是因为包的抓取机制而被丢弃了).对于支持SIGINFO 信号的系统, 比如BSD系列的操作系统(包括Mac OS X 和Digital/Tru64 UNIX(nt: 一个64位,采用改进型卡内基-梅龙大学的Mach V2.5内核, 并装配了BSD 4.3,4.4的常用应用程序的操作系统),tcpdump 会在收到SIGINFO 信号时候, 显示出此'capture'类数据包的数目,并继续抓取数据包(通常, 可以通过键盘输入ctrl键盘加大写T键产生一个终端的'status'的字符, 从而发送此信号. 不过, 在一些系统上, 如Mac OS X, 此字符默认不能被ctrl加T来触发, 不过可通过stty命令来打开此功能).从网络接口上读取数据包也许需要特定的权限:在支持NIT 或者BPF 的SunOS 3.x 或者4.x操作系统中:(nt: NIT, Network Interface Tap, 网络接口分接头. BPF, BSD Packet Filter, BSD 分组过滤器.可理解为, 此二者分别提供了一种给应用输送指定数据包的机制, 不过BPF 可过滤网络接口上进入和发出的数据包,而NIT只能过滤进入的数据包)tcpdump需要对/dev/nit 和/dev/bpf* 文件有读的权限在支持DLPI 的Solaris 操作系统上: (nt: DLPI, Data Link Provider Interface, 可理解为, 对数据链路层向上层所提供功能的一个统一的描述. Solaris 为Sun Microsystems公司组装的一种UNIX 操作系统) 此时, tcpdump 必须具有虚拟网络接口(nt: pseudo device, 虚拟网络接口, 可以理解成linux 系统下的any 网络接口, 即通过此接口可抓到系统中所有接口上的数据包), 比如, /dev/le. 不过在有的Solaris 版本中, 拥有读写这个虚拟接口的权限还不足以使tcpdump 工作在混杂模式(nt: promiscuous mode),从而也就不能真正使用上这个虚拟网络接口(nt: 可理解为, tcpdump能工作在混杂模式是能从虚拟网络接口接收数据包的另一个必要条件,而单拥有对此接口的读写权限还不够).在支持DLPI 的HP-UX 操作系统上: (nt: HP-UX, Hewlett Packard UniX, 惠普公司开发的一种UNIX 操作系统, 源于UNIX System V 操作系统, 而后者又源自于BSD UNIX 系统. DLPI, 上文已有其说明)tcpdump 必须以root 身份来运行, 或者tcpdump 可执行程序文件被设置了setuid标志.(nt: 一个程序文件如果被设置了setuid标志, 运行时该程序会拥有root权限)在支持网络侦听的IRIX 操作系统上: (nt: IRIX, Silicon Graphics公司(美国硅图公司)开发的一种UNIX 操作系统, 源于UNIX System V 操作系统.) tcpdump 必须以root 身份来运行, 或者tcpdump 可执行程序文件被设置了setuid标志.在LINUX 操作系统上: tcpdump 必须以root 身份来运行, 或者tcpdump 可执行程序文件被设置了setuid标志(不过, 在以下情况下可不要求root 权限:所使用的发布版本中的内核支持CAP_NET_RAW(nt: 网络包直接抓取) 功能,并且执行该功能的权限已被赋予当前的用户, 此外, 在用户登录时, 必须在其初始化进程中(initial process,中打开此功能(nt: 具体初始化进程, 需补充). 在这种情况下, 用户所拥有的CAP_NET_RAW 权限可用于网络抓包, 而如果想要列举出系统中的网络接口则需要拥有CAP_NET_ADMIN 权限, 比如此时使用tcpdump 的-D选项就需要此权限)在ULTRIX 和Digital UNIX/Tru64 UNIX系统上:(nt: ULTRIX, Digital Equipment Corporation's (DEC)公司开发的UNIX操作系统. UNIX/Tru64, 上文已描述) 任何用户都可以使用tcpdump进行网络抓包. 不过, 如果没有通过pfconfig 命令打开网络接口的混杂接收模式, 任何用户(包括超级用户)都不能在接口上进行混杂模式抓包. 同样如果没有通过pfconfig 命令打开网络接口的全复制模式(nt: copy-all-mode, 可理解为, 此模式下可接收广播和单播数据包), 任何用户(包括超级用户)都不能在接口上接收或发送单播数据包. 从而, 要在系统上对关键数据包的抓取必须把网络接口的混杂模式和全复制模式打开.在BSD(包括Mac OS X) 操作系统上:如果系统中没有备份BPF 设备(nt: cloning, 再生, 可理解为备份), 则tcpdump 需要有对/dev/bpf* 的读取权限,如果系统中有这样一个备份BPF 设备, 则需要对/dev/bpf 有读取权限.在带devfs 文件系统的BSD 系列操作系统中(包括Mac OS X), 则拥有对BPF 设备的读取权限只是进行网络抓包的一个前提, 还有其他条件必须被满足, 即在系统启动时配置devfs 中相应文件或文件夹的所有者和权限. 系统可能不会提供直接的配置方法, 这时我们必须另找方法来完成此配置.不过, 从数据包文件(nt:通过选项-w 产生的文件)中读取数据包不需要这些特殊权限.选项-A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: 即Handy for capturing web pages).-c counttcpdump将在接受到count个数据包后退出.-C file-size (nt: 此选项用于配合-w file 选项使用)该选项使得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: human readable, 容易阅读的,通常是指以ascii码来打印一些信息. compiled, 编排过的. packet-matching code, 包匹配码,含义未知, 需补充)-dd 以C语言的形式打印出包匹配码.-ddd 以十进制数的形式打印出包匹配码(会在包匹配码之前有一个附加的'count'前缀).-D 打印系统中所有tcpdump可以在其上进行抓包的网络接口. 每一个接口会打印出数字编号, 相应的接口名字, 以及可能的一个网络接口描述. 其中网络接口名字和数字编号可以用在tcpdump 的-i flag 选项(nt: 把名字或数字代替flag), 来指定要在其上抓包的网络接口.此选项在不支持接口列表命令的系统上很有用(nt: 比如, Windows 系统, 或缺乏ifconfig -a 的UNIX系统); 接口的数字编号在windows 2000 或其后的系统中很有用, 因为这些系统上的接口名字比较复杂, 而不易使用.如果tcpdump编译时所依赖的libpcap库太老,-D 选项不会被支持, 因为其中缺乏pcap_findalldevs()函数.-e 每行的打印输出中将包括数据包的数据链路层头部信息-E spi@ipaddr algo:secret,...可通过spi@ipaddr algo:secret 来解密IPsec ESP包(nt | rt:IPsec Encapsulating Security Payload, IPsec 封装安全负载, IPsec可理解为, 一整套对ip数据包的加密协议, ESP 为整个IP 数据包或其中上层协议部分被加密后的数据,前者的工作模式称为隧道模式; 后者的工作模式称为传输模式. 工作原理, 另需补充).需要注意的是, 在终端启动tcpdump 时, 可以为IPv4 ESP packets 设置密钥(secret). 可用于加密的算法包括des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, 或者没有(none).默认的是des-cbc(nt: des, Data Encryption Standard, 数据加密标准, 加密算法未知, 另需补充). secret 为用于ESP 的密钥, 使用ASCII 字符串方式表达. 如果以0x 开头, 该密钥将以16进制方式读入.该选项中ESP 的定义遵循RFC2406, 而不是RFC1827. 并且, 此选项只是用来调试的, 不推荐以真实密钥(secret)来使用该选项, 因为这样不安全: 在命令行中输入的secret 可以被其他人通过ps 等命令查看到. 除了以上的语法格式(nt: 指spi@ipaddr algo:secret), 还可以在后面添加一个语法输入文件名字供tcpdump 使用(nt:即把spi@ipaddr algo:secret,... 中...换成一个语法文件名). 此文件在接受到第一个ESP包时会打开此文件, 所以最好此时把赋予tcpdump 的一些特权取消(nt: 可理解为, 这样防范之后, 当该文件为恶意编写时,不至于造成过大损害).-f 显示外部的IPv4 地址时(nt: foreign IPv4 addresses, 可理解为, 非本机ip地址), 采用数字方式而不是名字. (此选项是用来对付Sun公司的NIS服务器的缺陷(nt: NIS, 网络信息服务, tcpdump 显示外部地址的名字时会用到她提供的名称服务): 此NIS服务器在查询非本地地址名字时,常常会陷入无尽的查询循环).由于对外部(foreign)IPv4地址的测试需要用到本地网络接口(nt: tcpdump 抓包时用到的接口)及其IPv4 地址和网络掩码. 如果此地址或网络掩码不可用, 或者此接口根本就没有设置相应网络地址和网络掩码(nt: linux 下的'any' 网络接口就不需要设置地址和掩码, 不过此'any'接口可以收到系统中所有接口的数据包), 该选项不能正常工作.-F file使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.-i interface指定tcpdump 需要监听的接口. 如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback 接口).一但找到第一个符合条件的接口, 搜寻马上结束.在采用2.2版本或之后版本内核的Linux 操作系统上, 'any' 这个虚拟网络接口可被用来接收所有网络接口上的数据包(nt: 这会包括目的是该网络接口的, 也包括目的不是该网络接口的). 需要注意的是如果真实网络接口不能工作在'混杂'模式(promiscuous)下, 则无法在'any'这个虚拟的网络接口上抓取其数据包.如果-D 标志被指定, tcpdump会打印系统中的接口编号,而该编号就可用于此处的interface 参数.-l 对标准输出进行行缓冲(nt: 使标准输出设备遇到一个换行符就马上把这行的内容打印出来).在需要同时观察抓包打印以及保存抓包记录的时候很有用. 比如, 可通过以下命令组合来达到此目的: ``tcpdump -l | tee dat'' 或者``tcpdump -l > dat & tail -f dat''. (nt: 前者使用tee来把tcpdump 的输出同时放到文件dat和标准输出中, 而后者通过重定向操作'>', 把tcpdump的输出放到dat 文件中, 同时通过tail把dat文件中的内容放到标准输出中)-L 列出指定网络接口所支持的数据链路层的类型后退出.(nt: 指定接口通过-i 来指定)-m module通过module 指定的file 装载SMI MIB 模块(nt: SMI,Structure of Management Information, 管理信息结构MIB, Management Information Base, 管理信息库. 可理解为, 这两者用于SNMP(Simple Network Management Protoco) 协议数据包的抓取. 具体SNMP 的工作原理未知, 另需补充).此选项可多次使用, 从而为tcpdump 装载不同的MIB 模块.-M secret如果TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥secret.-n 不对地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换.-N 不打印出host 的域名部分. 比如, 如果设置了此选现, tcpdump 将会打印'nic' 而不是''.-O 不启用进行包匹配时所用的优化代码. 当怀疑某些bug是由优化代码引起的, 此选项将很有用.-p 一般情况下, 把网络接口设置为非'混杂'模式. 但必须注意, 在特殊情况下此网络接口还是会以'混杂'模式来工作;从而, '-p' 的设与不设,不能当做以下选现的代名词: 'ether host {local-hw-add}' 或'ether broadcast'(nt: 前者表示只匹配以太网地址为host 的包, 后者表示匹配以太网地址为广播地址的数据包).-q 快速(也许用'安静'更好?)打印输出. 即打印很少的协议相关信息, 从而输出行都比较简短.-R 设定tcpdump 对ESP/AH 数据包的解析按照RFC1825而不是RFC1829(nt: AH, 认证头, ESP,安全负载封装,这两者会用在IP包的安全传输机制中). 如果此选项被设置, tcpdump 将不会打印出'禁止中继'域(nt: relay prevention field). 另外,由于ESP/AH规范中没有规定ESP/AH数据包必须拥有协议版本号域, 所以tcpdump不能从收到的ESP/AH数据包中推导出协议版本号.-r file从文件file 中读取包数据. 如果file 字段为'-' 符号, 则tcpdump 会从标准输入中读取包数据.-S 打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.(nt: 相对顺序号可理解为, 相对第一个TCP 包顺序号的差距,比如, 接受方收到第一个数据包的绝对顺序号为232323, 对于后来接收到的第2个,第3个数据包, tcpdump会打印其序列号为1, 2分别表示与第一个数据包的差距为1 和2. 而如果此时-S 选项被设置, 对于后来接收到的第2个, 第3个数据包会打印出其绝对顺序号: 232324, 232325).-s snaplen设置tcpdump的数据包抓取长度为snaplen, 如果不设置默认将会是68字节(而支持网络接口分接头(nt: NIT, 上文已有描述,可搜索'网络接口分接头'关键字找到那里)的SunOS系列操作系统中默认的也是最小值是96). 68字节对于IP, ICMP(nt: Internet Control Message Protocol,因特网控制报文协议), TCP 以及UDP 协议的报文已足够, 但对于名称服务(nt: 可理解为dns, nis等服务), NFS服务相关的数据包会产生包截短. 如果产生包截短这种情况, tcpdump的相应打印输出行中会出现''[|proto]''的标志(proto 实际会显示为被截短的数据包的相关协议层次). 需要注意的是, 采用长的抓取长度(nt: snaplen比较大), 会增加包的处理时间, 并且会减少tcpdump 可缓存的数据包的数量,从而会导致数据包的丢失. 所以, 在能抓取我们想要的包的前提下, 抓取长度越小越好. 把snaplen 设置为0 意味着让tcpdump自动选择合适的长度来抓取数据包.-T type强制tcpdump按type指定的协议所描述的包结构来分析收到的数据包. 目前已知的type 可取的协议为:aodv (Ad-hoc On-demand Distance Vector protocol, 按需距离向量路由协议, 在Ad hoc(点对点模式)网络中使用),cnfp (Cisco NetFlow protocol), rpc(Remote Procedure Call), rtp (Real-Time Applications protocol),rtcp (Real-Time Applications con-trol protocol), snmp (Simple Network Management Protocol),tftp (Trivial File Transfer Protocol, 碎文件协议), vat (Visual Audio Tool, 可用于在internet 上进行电视电话会议的应用层协议), 以及wb (distributed White Board, 可用于网络会议的应用层协议).-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 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面, 其相应的图形选项将会以16进制的方式打印出来(nt: telnet 的SB,SE选项含义未知, 另需补充).-w 把包数据直接写入文件而不进行分析和打印输出. 这些包数据可在随后通过-r 选项来重新读入并进行分析和打印.-W filecount此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序.-x 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部).总共打印的数据大小不会超过整个数据包的大小与snaplen 中的最小值. 必须要注意的是, 如果高层协议数据没有snaplen 这么长,并且数据链路层(比如, Ethernet层)有填充数据, 则这些填充数据也会被打印.(nt: so for link layers that pad, 未能衔接理解和翻译, 需补充)-xx tcpdump 会打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部.-X 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便.-XX 当分析和打印时, tcpdump 会打印每个包的头部数据, 同时会以16进制和ASCII码形式打印出每个包的数据, 其中包括数据链路层的头部.这对于分析一些新协议的数据包很方便.-y datalinktype设置tcpdump 只捕获数据链路层协议类型是datalinktype的数据包-Z user使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID(nt: tcpdump 此处可理解为tcpdump 运行之后对应的进程) 此选项也可在编译的时候被设置为默认打开.(nt: 此时user 的取值未知, 需补充)条件表达式该表达式用于决定哪些数据包将被打印. 如果不给定条件表达式, 网络上所有被捕获的包都会被打印,否则, 只有满足条件表达式的数据包被打印.(nt: all packets, 可理解为, 所有被指定接口捕获的数据包).表达式由一个或多个'表达元'组成(nt: primitive, 表达元, 可理解为组成表达式的基本元素). 一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的id组成(nt: 即, 'qualifiers id').有三种不同类型的修饰符:type, dir以及proto.type 修饰符指定id 所代表的对象类型, id可以是名字也可以是数字. 可选的对象类型有: host, net, port 以及portrange(nt: host 表明id表示主机, net 表明id是网络, port 表明id是端口, 而portrange 表明id 是一个端口范围). 如, 'host foo', 'net 128.3', 'port 20', 'portrange 6000-6008'(nt: 分别表示主机foo, 网络128.3, 端口20, 端口范围6000-6008). 如果不指定type 修饰符, id默认的修饰符为host.dir 修饰符描述id 所对应的传输方向, 即发往id 还是从id 接收(nt: 而id 到底指什么需要看其前面的type 修饰符).可取的方向为: src, dst, src 或dst, src并且dst.(nt:分别表示, id是传输源, id是传输目的, id是传输源或者传输目的, id是传输源并且是传输目的). 例如, 'src foo', 'dst net 128.3', 'src or dst port ftp-data'.(nt: 分别表示符合条件的数据包中, 源主机是foo, 目的网络是128.3, 源或目的端口为ftp-data).如果不指定dir修饰符, id 默认的修饰符为src 或dst.对于链路层的协议,比如SLIP(nt: Serial Line InternetProtocol, 串联线路网际网络协议), 以及linux下指定'any' 设备, 并指定'cooked'(nt | rt: cooked 含义未知, 需补充) 抓取类型, 或其他设备类型,可以用'inbound' 和'outbount' 修饰符来指定想要的传输方向.proto 修饰符描述id 所属的协议. 可选的协议有: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp以及upd. (nt | rt: ether, fddi, tr, 具体含义未知, 需补充. 可理解为物理以太网传输协议, 光纤分布数据网传输协议, 以及用于路由跟踪的协议. wlan, 无线局域网协议; ip,ip6 即通常的TCP/IP协议栈中所使用的ipv4以及ipv6网络层协议; arp, rarp 即地址解析协议, 反向地址解析协议; decnet, Digital Equipment Corporation开发的, 最早用于PDP-11 机器互联的网络协议; tcp and udp, 即通常TCP/IP协议栈中的两个传输层协议).例如, `ether src foo', `arp net 128.3', `tcp port 21', `udp portrange 7000-7009'分别表示'从以太网地址foo 来的数据包','发往或来自128.3网络的arp协议数据包', '发送或接收端口为21的tcp协议数据包', '发送或接收端口范围为7000-7009的udp协议数据包'.如果不指定proto 修饰符, 则默认为与相应type匹配的修饰符. 例如, 'src foo' 含义是'(ip or arp orrarp) src foo' (nt: 即, 来自主机foo的ip/arp/rarp协议数据包, 默认type为host),`net bar' 含义是`(ip or arp or rarp) net bar'(nt: 即, 来自或发往bar网络的ip/arp/rarp协议数据包), `port 53' 含义是`(tcp or udp) port 53'(nt: 即, 发送或接收端口为53的tcp/udp协议数据包). (nt: 由于tcpdump 直接通过数据链路层的BSD 数据包过滤器或DLPI(datalink provider interface, 数据链层提供者接口) 来直接获得网络数据包,其可抓取的数据包可涵盖上层的各种协议, 包括arp, rarp, icmp(因特网控制报文协议),p, ip6, tcp, udp, sctp(流控制传输协议).对于修饰符后跟id 的格式,可理解为, type id 是对包最基本的过滤条件: 即对包相关的主机, 网络, 端口的限制;dir 表示对包的传送方向的限制; proto表示对包相关的协议限制)'fddi'(nt: Fiber Distributed Data Interface) 实际上与'ether' 含义一样: tcpdump 会把他们当作一种''指定网络接口上的数据链路层协议''. 如同ehter网(以太网), FDDI 的头部通常也会有源, 目的, 以及包类型,从而可以像ether网数据包一样对这些域进行过滤. 此外, FDDI 头部还有其他的域, 但不能被放到表达式中用来过滤同样, 'tr' 和'wlan' 也和'ether' 含义一致, 上一段对fddi 的描述同样适用于tr(Token Ring) 和wlan(802.11 wireless LAN)的头部. 对于802.11 协议数据包的头部, 目的域称为DA, 源域称为SA;而其中的BSSID, RA, TA 域(nt | rt: 具体含义需补充)不会被检测(nt: 不能被用于包过虑表达式中).除以上所描述的表达元('primitive'),还有其他形式的表达元, 并且与上述表达元格式不同. 比如: gateway, broadcast, less, greater 以及算术表达式(nt: 其中每一个都算一种新的表达元). 下面将会对这些表达元进行说明.表达元之间还可以通过关键字and, or 以及not 进行连接, 从而可组成比较复杂的条件表达式. 比如,`host foo and not port ftp and not port ftp-data'(nt: 其过滤条件可理解为, 数据包的主机为foo,并且端口不是ftp(端口21) 和ftp-data(端口20, 常用端口和名字的对应可在linux 系统中的/etc/service 文件中找到)).为了表示方便, 同样的修饰符可以被省略, 如'tcp dst port ftp or ftp-data or domain' 与以下的表达式含义相同'tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.(nt: 其过滤条件可理解为,包的协议为tcp, 目的端口为ftp 或ftp-data 或domain(端口53) ).可用的表达元有: (nt: True 在以下的描述中含义为: 相应条件表达式中只含有以下所列的一个特定表达元, 此时表达式为真, 即条件得到满足)dst host host如果IPv4/v6 数据包的目的域是host, 则与此对应的条件表达式为真. host 可以是一个ip地址, 也可以是一个主机名.src host host如果IPv4/v6 数据包的源域是host, 则与此对应的条件表达式为真. host 可以是一个ip地址, 也可以是一个主机名.host host如果IPv4/v6数据包的源或目的地址是host, 则与此对应的条件表达式为真.以上的几个host 表达式之前可以添加以下关键字:ip, arp, rarp, 以及ip6.比如:ip host host也可以表达为: ether proto \ip and host host(nt: 这种表达方式在下面有说明, 其中ip之前需要有\来转义, 因为ip 对tcpdump 来说已经是一个关键字了.)如果host 是一个拥有多个IP 的主机, 那么任何一个地址都会用于包的匹配(nt: 即发向host 的数据包的目的地址可以是这几个IP中的任何一个, 从host 接收的数据包的源地址也可以是这几个IP中的任何一个).ether dst ehost如果数据包(nt: 指tcpdump 可抓取的数据包, 包括ip 数据包, tcp数据包)的以太网目标地址是ehost,则与此对应的条件表达式为真. Ehost 可以是/etc/ethers 文件中的名字或一个数字地址(nt: 可通过man ethers 看到对/etc/ethers 文件的描述, 样例中用的是数字地址)ether src ehost果数据包的以太网源地址是ehost, 则与此对应的条件表达式为真.ether host ehost如果数据包的以太网源地址或目标地址是ehost, 则与此对应的条件表达式为真.gateway host如果数据包的网关地址是host, 则与此对应的条件表达式为真. 需要注意的是, 这里的网关地址是指以太网地址, 而不是IP 地址(nt | rt: I.e., 例如, 可理解为'注意'. the Ethernet source or destination address, 以太网源和目标地址, 可理解为, 指代上句中的'网关地址' ). host 必须是名字而不是数字, 并且必须在机器的'主机名-ip地址'以及'主机名-以太地址'两大映射关系中有其条目(前一映射关系可通过/etc/hosts文件, DNS 或NIS得到, 而后一映射关系可通过/etc/ethers 文件得到. nt: /etc/ethers并不一定存在, 可通过man ethers 看到其数据格式, 如何创建该文件, 未知,需补充).也就是说host 的含义是ether host ehost 而不是host host, 并且ehost必须是名字而不是数字.目前, 该选项在支持IPv6地址格式的配置环境中不起作用(nt:。
tcpdump命令tcpdump命令详解tcpdump命令可以对⽹络上的数据包进⾏截获和分析。
它⽀持针对⽹络层、协议、主机、⽹络或端⼝的过滤,并提供and、or、not等逻辑语句来帮助你去掉⽆⽤的信息。
tcpdump 命令格式说明:Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ][ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ][ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ][ -Q|-P in|out|inout ][ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ][ --immediate-mode ] [ -T type ] [ --version ] [ -V file ][ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ][ -Z user ] [ expression ]option:-a:试着把⽹络和⼴播地址转换成名称.-c:当收到 count 报⽂后退出.-d:把编译好的报⽂匹配代码 (packet-matching code) 翻译成可读形式, 传往标准输出, 然后退出.-dd:把报⽂匹配代码 (packet-matching code) 以 C 程序⽚断的形式输出.-ddd:把报⽂匹配代码 (packet-matching code) 以⼗进制数形式输出 (前⾯加上总数).-e:显⽰链路层报头-f:以数字形式显⽰ '外部的' 互联⽹地址, ⽽不是字符形式-F:把 file 的内容⽤作过滤表达式. 忽略命令⾏上的表达式-i:监听 interface. 如果不指定接⼝, tcpdump 在系统的接⼝清单中, 寻找号码最⼩, 已经配置好的接⼝ (loopback 除外).选中的时候会中断连接.-l:⾏缓冲标准输出. 可⽤于捕捉数据的同时查看数据. 例如, tcpdump -l | tee dat'' or ``tcpdump -l > dat & tail -f dat'-n:不要把地址转换成名字(指的是主机地址,端⼝号等)-N:不显⽰主机名字中的域名部分. 例如, 如果使⽤这个选项, tcpdump 只显⽰nic,⽽不是-O:禁⽌运⾏报⽂匹配代码的优化器. 这个选项只有当你怀疑优化器有bug时才有⽤.-p:禁⽌把接⼝置成 promiscuous(杂凑) 模式. 注意, 接⼝有可能因其他原因⽽处于 promiscuous 模式; 因此, '-p' 不能作为`ether host {local-hw-addr} 或 ether broadcast' 的简写.-r: <数据包⽂件>从 file中读⼊数据报 (⽂件是⽤ -w 选项创建的). 如果 file 是 ``-'', 就从标准输⼊读⼊.-s:<数据包⼤⼩> 设置每个数据包的⼤⼩-S:⽤绝对⽽⾮相对数值列出TCP关联数-T:<数据包类型> 强制将表达⽅式所指定的数据包转译成设置的数据包类型-t:禁⽌显⽰时戳标志-tt:显⽰未格式化的时戳标志-v:详细显⽰指令执⾏过程-vv:更详细显⽰指令执⾏过程-w: <数据包⽂件>把数据包数据写⼊指定的⽂件-x:⽤⼗六进制字码列出数据包资料expression 解析expression 是⽤来选择要转储的数据报,如果没有指定 expression , 就转储⽹络的全部报⽂,否则,只转储相对 expression 为 `true' 的数据报。
■ 北京 赵琳t c p d的常用参$ tcpdump - ieth0 -nn -s0-v p o r t80-i:选要捕获的接口,网卡或无线网卡,VLAN或其他特殊接口。
如果只有一个网络接口,指定。
-nn:单个域名,直接显示个n表示不解析域名和端口。
这样不仅方便查看和端口号,数据时非常高效,解析会降低抓取速度。
-s0:tcpdump截取前96截取所有的报文内容,使用-s要截取的报文字节数)是0的话,部内容。
过滤器个协议的proto,可省后面可以跟上协议号或协议名称,支持ICMP、PIM、AH、ESP、TCP。
协议名称所以在与proto 指令一起使用时,必须根据类型使用一个或两个义。
Linux需要使用两个反MacOS只需要一tcpdump -n或者$ tcpdump -n icmpICMP协议用来过滤通过某个端口关键字为port。
$ tcpdump port 38389端口的过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的/OR/||和非or or ||not or !理解 tcpdump 的输出截取数据只是第一步,二步就是理解这些数据。
下面就解释一下输出各部分的意义。
实例21:27:06.995846 IP (tos 0x0, ttloffset 0, flags [DF], proto TCP (6), length 64)192.168.1.106.56166 >124.1Flags [S],(correct),w i n65[m s s144,nop,nop,TSecr 0,sackOK,eol], length 021:27:07.030487 IP (tos 0x0, ttl0, flags(6), length 44)124.192.132.54.80 > 192.168.1.106.56166: Flags [S.],(correct),ack 992042667,capture-{1-24}.pcap,24小之前的文件就会被流量可以通过过滤器 ip6 来同时可以指-nn ip6从之前保存的文件中读数据报文:$ tcpdump -nr ipv6-test.pcap ip6 proto 17检测端口扫描子中,你会发现抓取到的报文的源和目且带有标志位它们与一系列看口进行匹之后,如果目标主机的端口没有打开,RESET。
Step0:打开tftp工具,如图1,配置Current Directory目录为tftp工具的工作目录,Server interface为tftp工具所在电脑IP,注意电脑多网卡情况,请事先确保此IP与设备是连通的(通过互ping)图1Step1: 将tcpdump工具放入tftp工作目录( Current Directory),如图2图2Step2: 利用SecureCRT或其它telnet工具, 登录设备,用户名与密码分别为root 、focus,如图3图3Step3: 输入”cd /tmp”进入/tmp目录图4Step4输入”tftp –gr tcpdump IP” (IP为tftp工具打开电脑的IP) 将tcpdump工具导入设备/tmp目录下,如图5图5Step5: 输入”chmod +x tcpdump”,将tcpdump工具变为可执行属性,如图6图6Step6: 输入”./tcpdump –i eth0 host IP –w IP.cap -v”, 其中IP为摄像机的IP地址,启动抓包过程,抓包过程持续时间不要太久,设备内存有限,否则易导致设备重启,建议在1min内,具体视抓包过程数据量大小来控制时间。
结束抓包,按键盘CTRL+C图7Step7:启动抓包后,即可对设备进行操作,以便tcpdump记录此过程收发包的情况,完后按键盘CTRL+C结束。
图8Step8: 输入”tftp –pr CameraIP.cap ServerIP”, 将抓取到的包导出摄像机,其中CameraIP填写摄像机的IP,ServerIP填写tftp工具所在电脑的IP。
图9Step9:导出的数据包会在tftp工具的工作目录,如图10.82.16.39.cap为数据包。
附:tcpdump工具过滤方法,供参考,详细过滤方法,可上网查阅相关资料(1)过滤端口./tcpdump -i eth0 host 10.82.16.39 and port 23 -w 10.82.16.39.cap –v./tcpdump -i eth0 host 10.82.16.39 and src port 23 -w 10.82.16.39.cap –v./tcpdump -i eth0 host 10.82.16.39 and dst port 23 -w 10.82.16.39.cap –v(2)过滤IP./tcpdump -i eth0 host 10.82.16.39 and src 10.82.16.30 -w 10.82.16.39.cap –v./tcpdump -i eth0 host 10.82.16.39 and dst 10.82.16.30 -w 10.82.16.39.cap -v (3)过滤协议./tcpdump -i eth0 host 10.82.16.39 and udp -w 10.82.16.39.cap –v./tcpdump -i eth0 host 10.82.16.39 and tcp -w 10.82.16.39.cap -v./tcpdump -i eth0 host 10.82.16.39 and icmp -w 10.82.16.39.cap -v。
TCPDUMP中文手册名称(NAME)tcpdump-转储网络上的数据流总览(SYNOPSIS)tcpdump[-adeflnNOpqStvx][-ccount][-Ffile][-iinterface][-rfile][-ssnaplen][-Ttype][-wfile][expression]描述(DESCRIPTION)Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限. 对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限. 对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.对于BSD:你必须有/dev/bpf*的读访问权限.选项(OPTIONS)-a试着把网络和广播地址转换成名称.-c当收到count报文后退出.-d把编译好的报文匹配模板(packet-matchingcode)翻译成可读形式,传往标准输出,然后退出.-dd把报文匹配模板(packet-matchingcode)以C程序片断的形式输出.-ddd把报文匹配模板(packet-matchingcode)以十进制数形式输出(前面加上总数).-e每行都显示链路层报头.-f用数字形式显示'外部的'互联网地址,而不是字符形式(这个选项用来绕开脑壳坏光的SUN黄页服务器的问题---一般说来它翻译外部网络数字地址的时候会长期挂起).-F把file的内容用作过滤表达式.忽略命令行上的表达式.-i监听interface.如果不指定接口,tcpdump在系统的接口清单中,寻找号码最小,已经配置好的接口(loopback除外).选中的时候会中断连接.-l行缓冲标准输出.可用于捕捉数据的同时查看数据.例如,``tcpdump-l|teedat''or``tcpdump-l>dat&tail-fdat''.-n别把地址转换成名字(就是说,主机地址,端口号等)-N不显示主机名字中的域名部分.例如,如果使用这个选项,tcpdump只显示``nic'',而不是``''.-O禁止运行报文匹配模板的优化器.只有当你怀疑优化器有bug时才有用.-p禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而处于promiscuous模式;因此,'-p'不能作为`etherhost{local-hw-addr}或etherbroadcast'的简写.-q快速输出.显示较少的协议信息,输出行会短一点点.-r从file中读入数据报(文件是用-w选项创建的).如果file是``-'',就读标准输入.-s从每个报文中截取snaplen字节的数据,而不是缺省的68(如果是SunOS的NIT,最小值是96).68个字节适用于IP,ICMP,TCP和UDP,但是有可能截掉名字服务器和NFS报文的协议信息(见下面).输出时如果指定``[|proto]'',tcpdump可以指出那些捕捉量过小的数据报,这里的proto是截断发生处的协议层名称.注意,采用更大的捕捉范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢失.你应该把snaplen设的尽量小,只要能够容纳你需要的协议信息就可以了.-T把通过"expression"挑选出来的报文解释成指定的type.目前已知的类型有:rpc(远程过程调用RemoteProcedureCall),rtp(实时应用协议Real-TimeApplicationsprotocol),rtcp(实时应用控制协议Real-TimeApplicationscontrolprotocol),vat(可视音频工具VisualAudioTool),和wb(分布式白板distributedWhiteBoard).-S显示绝对的,而不是相对的TCP序列号.-t禁止显示时戳标志.-tt显示未格式化的时戳标志.-v(稍微多一点)繁琐的输出.例如,显示IP数据报中的生存周期和服务类型.-vv更繁琐的输出.例如,显示NFS应答报文的附加域.-w把原始报文存进file,而不是分析和显示.它们可以以后用-r选项显示.如果file是``-'',就写往标准输出.-x以16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.expression用来选择要转储的数据报.如果没有指定expression,就转储网络的全部报文.否则,只转储相对expression为`true'的数据报.expression一个或多个原语(primitive)组成.原语通常由一个标识(id,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:type类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,`hostfoo',`net128.3',`port20'.如果不指定类型修饰子,就使用缺省的host.dir方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识).可以使用的方向有src,dst,srcordst和srcanddst.例如,`srcfoo',`dstnet128.3',`srcordstportftp-data'.如果不指定方向修饰子,就使用缺省的srcordst.对于`null'链路层(就是说象slip之类的点到点协议),用inbound和outbound修饰子指定所需的传输方向.proto协议修饰子要求匹配指定的协议.可以使用的协议有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp和udp.例如,`ethersrcfoo',`arpnet128.3',`tcpport21'.如果不指定协议修饰子,就使用所有符合类型的协议.例如,`srcfoo'指`(ip或arp或rarp)srcfoo'(注意后者不符合语法),`netbar'指`(ip或arp或rarp)netbar',`port53'指`(tcp或udp)port53'.[`fddi'实际上是`ether'的别名;分析器把它们视为``用在指定网络接口上的数据链路层.''FDDI 报头包含类似于以太协议的源目地址,而且通常包含类似于以太协议的报文类型,因此你可以过滤FDDI域,就象分析以太协议一样.FDDI报头也包含其他域,但是你不能在过滤器表达式里显式描述.]作为上述的补充,有一些特殊的`原语'关键字,它们不同于上面的模式:gateway,broadcast,less,greater和数学表达式.这些在后面有叙述.更复杂的过滤器表达式可以通过and,or和not连接原语来组建.例如,`hostfooandnotportftpandnotportftp-data'.为了少敲点键,可以忽略相同的修饰子.例如,`tcpdstportftporftp-dataordomain'实际上就是`tcpdstportftportcpdstportftp-dataortcpdstportdomain'.允许的原语有:dsthosthost如果报文中IP的目的地址域是host,则逻辑为真.host既可以是地址,也可以是主机名. srchosthost如果报文中IP的源地址域是host,则逻辑为真.hosthost如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:iphosthost它等价于:etherproto\ipandhosthost如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.etherdstehost如果报文的以太目的地址是ehost,则逻辑为真.Ehost既可以是名字(/etc/ethers里有),也可以是数字(有关数字格式另见ethers(3N)).ethersrcehost如果报文的以太源地址是ehost,则逻辑为真.etherhostehost如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.gatewayhost如果报文把host当做网关,则逻辑为真.也就是说,报文的以太源或目的地址是host,但是IP的源目地址都不是host.host必须是个主机名,而且必须存在/etc/hosts和/etc/ethers中.(一个等价的表达式是etherhostehostandnothosthost对于host/ehost,它既可以是名字,也可以是数字.)dstnetnet如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存在/etc/networks中),也可以是网络号.(详见networks(4)).srcnetnet如果报文的IP源地址属于网络号net,则逻辑为真.netnet如果报文的IP源地址或目的地址属于网络号net,则逻辑为真.netnetmaskmask如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.netnet/len如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len.本原语可以用src或dst修饰.dstportport如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一个数字,也可以是/etc/services中说明过的名字(参看tcp(4P)和udp(4P)).如果使用名字,则检查端口号和协议.如果使用数字,或者有二义的名字,则只检查端口号(例如,dstport513将显示tcp/login的数据和udp/who的数据,而portdomain将显示tcp/domain和udp/domain的数据).srcportport如果报文的源端口号是port,则逻辑为真.portport如果报文的源端口或目的端口是port,则逻辑为真.上述的任意一个端口表达式都可以用关键字tcp或udp做前缀,就象:tcpsrcportport它只匹配源端口是port的TCP报文.lesslength如果报文的长度小于等于length,则逻辑为真.它等同于:len<=length.greaterlength如果报文的长度大于等于length,则逻辑为真.它等同于:len>=length.ipprotoprotocol如果报文是IP数据报(参见ip(4P)),其内容的协议类型是protocol,则逻辑为真.Protocol可以是数字,也可以是下列名称中的一个:icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键字,所以必须用反斜杠(\)转义,在C-shell中应该是\\.etherbroadcast如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.ipbroadcast如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.ethermulticast如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可选的.这实际上是`ether[0]&1!=0'的简写.ipmulticast如果报文是IP多目传送报文,则逻辑为真.etherprotoprotocol如果报文协议属于以太类型的protocol,则逻辑为真.Protocol可以是数字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是关键字,所以必须用反斜杠(\)转义.[如果是FDDI(例如,`fddiprotocolarp'),协议标识来自802.2逻辑链路控制(LLC)报头,它通常位于FDDI报头的顶层.当根据协议标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头用的是SNAP格式.]decnetsrchost如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是``10.123'',或者是DECNET主机名.[只有配置成运行DECNET的Ultrix系统支持DECNET主机名.]decnetdsthost如果DECNET的目的地址是host,则逻辑为真.decnethosthost如果DECNET的源地址或目的地址是host,则逻辑为真.ip,arp,rarp,decnet是:etherprotop的简写形式,其中p为上述协议的一种.lat,moprc,mopdl是:etherprotop的简写形式,其中p为上述协议的一种.注意tcpdump目前不知道如何分析这些协议. tcp,udp,icmp是:ipprotop的简写形式,其中p为上述协议的一种.exprrelopexpr如果这个关系成立,则逻辑为真,其中relop是>,<,>=,<=,=,!=之一,expr是数学表达式,由常整数(标准C语法形式),普通的二进制运算符[+,-,*,/,&,|],一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数据,使用下面的语法:proto[expr:size]Proto是ether,fddi,ip,arp,rarp,tcp,udp,oricmp之一,同时也指出了下标操作的协议层.expr给出字节单位的偏移量,该偏移量相对于指定的协议层.Size是可选项,指出感兴趣的字节数;它可以是1,2,4,缺省为1字节.由关键字len给出的长度运算符指明报文的长度.例如,`ether[0]&1!=0'捕捉所有的多目传送报文.表达式`ip[0]&0xf!=5'捕捉所有带可选域的IP 报文.表达式`ip[6:2]&0x1fff=0'只捕捉未分片和片偏移为0的数据报.这种检查隐含在tcp和udp下标操作中.例如,tcp[0]一定是TCP报头的第一个字节,而不是其中某个IP片的第一个字节.原语可以用下述方法结合使用:园括弧括起来的原语和操作符(园括弧在Shell中有专用,所以必须转义).取反操作(`!'or`not').连结操作(`&&'or`and').或操作(`||'or`or').取反操作有最高优先级.或操作和连结操作有相同的优先级,运算时从左到右结合.注意连结操作需要显式的and算符,而不是并列放置.如果给出标识符,但没给关键字,那么暗指最近使用的关键字.例如,nothostvsandace作为nothostvsandhostace的简写形式,不应该和not(hostvsorace)混淆.表达式参数可以作为单个参数传给tcpdump,也可以作为复合参数,后者更方便一些.一般说来,如果表达式包含Shell元字符(metacharacter),传递单个括起来的参数要容易一些.复合参数在被解析前用空格联接一起.示例(EXAMPLES)显示所有进出sundown的报文:tcpdumphostsundown显示helios和主机hot,ace之间的报文传送:tcpdumphostheliosand\(hotorace\)显示ace和除了helios以外的所有主机的IP报文:tcpdumpiphostaceandnothelios显示本地的主机和Berkeley的主机之间的网络数据:tcpdumpnetucb-ether显示所有通过网关snup的ftp报文(注意这个表达式被单引号括起,防止shell解释园括弧):tcpdump'gatewaysnupand(portftporftp-data)'显示既不是来自本地主机,也不是传往本地主机的网络数据(如果你把网关通往某个其他网络,这个做法将不会把数据发往你的本地网络).tcpdumpipandnotnetlocalnet显示每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中有一个远程主机.tcpdump'tcp[13]&3!=0andnotsrcanddstnetlocalnet'显示经过网关snup中大于576字节的IP数据报:tcpdump'gatewaysnupandip[2:2]>576'显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播或多目传送形式传送的:tcpdump'ether[0]&1=0andip[16]>=224'显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):tcpdump'icmp[0]!=8andicmp[0]!=0"输出格式(OUTPUTformAT)tcpdump的输出格式取决于协议.下面的描述给出大多数格式的简要说明和范例.链路层报头(LinkLevelHeaders)如果给出'-e'选项就显示链路层报头.在以太网上,显示报文的源目地址,协议和报文长度.在FDDI网络上,'-e'选项导致tcpdump显示出`帧控制(framecontrol)'域,源目地址和报文长度.(`帧控制'域负责解释其余的报文.普通报文(比如说载有IP数据报)是`异步'报文,优先级介于0到7;例如,`async4'.这些被认为载有802.2逻辑链路控制(LLC)报文;如果它们不是ISO数据报或者所谓的SNAP报文,就显示出LLC报头.(注意:以下描述中假设你熟悉RFC-1144中说明的SLIP压缩算法.)在SLIP链路上,tcpdump显示出方向指示(``I''指inbound,``O''指outbound),报文类型和压缩信息.首先显示的是报文类型.有三种类型ip,utcp和ctcp.对于ip报文不再显示更多的链路信息.对于TCP报文,在类型后面显示连接标识.如果报文是压缩过的,就显示出编码的报头.特殊情形以*S+n和*SA+n的形式显示,这里的n是顺序号(或顺序号及其确认)发生的改变总和.如果不是特殊情形,就显示0或多少个改变.改变由U(urgentpointer),W(window),A(ack),S(sequencenumber)和I(packetID)指明,后跟一个变化量(+nor-n),或另一个值(=n).最后显示报文中的数据总和,以及压缩报头的长度.例如,下面一行显示了一个传出的压缩的TCP报文,有一个隐含的连接标识;确认(ack)的变化量是6,顺序号是49,报文ID是6;有三个字节的数据和六个字节的压缩报头:Octcp*A+6S+49I+63(6)ARP/RARP报文Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里是一个简单的例子,来自主机rtsg到主机csam的'rlogin'开始部分:arpwho-hascsamtellrtsgarpreplycsamis-atCSAM第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写).如果用tcpdump-n看上去要清楚一些:arpwho-has128.3.254.6tell128.3.254.68arpreply128.3.254.6is-at02:07:01:00:01:c4如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的:RTSGBroadcast080664:arpwho-hascsamtellrtsgCSAMRTSG080664:arpreplycsamis-atCSAM这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为16进制数0806(类型ETHER_ARP),报文全长64字节.TCP报文(注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协议,无论是本文还是tcpdump都对你用处不大)一般说来tcp协议的输出格式是:src>dst:flagsdata-seqnoackwindowurgentoptionsSrc和dst是源目IP地址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或单独的`.'(无标志),或者是它们的组合.Data-seqno说明了本报文中的数据在流序号中的位置(见下例).Ack是在这条连接上信源机希望下一个接收的字节的流序号(sequencenumber).Window是在这条连接上信源机接收缓冲区的字节大小.Urg表明报文内是`紧急(urgent)'数据.Options是tcp可选报头,用尖括号括起(例如,).Src,dst和flags肯定存在.其他域依据报文的tcp报头内容,只输出有必要的部分.下面是从主机rtsgrlogin到主机csam的开始部分.rtsg.1023>csam.login:S768512:768512(0)win4096csam.login>rtsg.1023:S947648:947648(0)ack768513win4096rtsg.1023>csam.login:.ack1win4096rtsg.1023>csam.login:P1:2(1)ack1win4096csam.login>rtsg.1023:.ack2win4096rtsg.1023>csam.login:P2:21(19)ack1win4096csam.login>rtsg.1023:P1:2(1)ack21win4077csam.login>rtsg.1023:P2:3(1)ack21win4077urg1csam.login>rtsg.1023:P3:4(1)ack21win4077urg1第一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了SYN标志.报文的流序号是768512,没有数据.(这个写成`first:last(nbytes)',意思是`从流序号first到last,不包括last,有nbytes字节的用户数据'.)此时没有捎带确认(piggy-backedack),有效的接收窗口是4096字节,有一个最大段大小(max-segment-size)的选项,请求设置mss为1024字节. Csam用类似的形式应答,只是增加了一个对rtsgSYN的捎带确认.然后Rtsg确认csam的SYN.`.'意味着没有设置标志.这个报文不包含数据,因此也就没有数据的流序号.注意这个确认流序号是一个小整数(1).当tcpdump第一次发现一个tcp会话时,它显示报文携带的流序号.在随后收到的报文里,它显示当前报文和最初那个报文的流序号之差.这意味着从第一个报文开始,以后的流序号可以理解成数据流中的相对位移asrelativebytepositionsintheconversation'sdatastream(withthefirstdatabyteeachdirectionbeing`1').`-S'选项能够改变这个特性,直接显示原始的流序号.在第六行,rtsg传给csam19个字节的数据(字节2到20).报文中设置了PUSH标志.第七行csam 表明它收到了rtsg的数据,字节序号是21,但不包括第21个字节.显然大多数数据在socket的缓冲区内,因为csam的接收窗口收到的数据小于19个字节.同时csam向rtsg发送了一个字节的数据.第八和第九行显示csam发送了两个字节的紧急数据到rtsg.如果捕捉区设置的过小,以至于tcpdump不能捕捉到完整的TCP报头,tcpdump会尽可能的翻译已捕获的部分,然后显示``[|tcp]'',表明无法翻译其余部分.如果报头包含一个伪造的选项(onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump显示``[badopt]''并且不再翻译其他选项部分(因为它不可能判断出从哪儿开始).如果报头长度表明存在选项,但是IP 数据报长度不够,不可能真的保存选项,tcpdump就显示``[badhdrlength]''.UDP报文UDP格式就象这个rwho报文显示的:actinide.who>broadcast.who:udp84就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广播地址的who 端口.报文包含84字节的用户数据.某些UDP服务能够识别出来(从源目端口号上),因而显示出更高层的协议信息.特别是域名服务请求(RFC-1034/1035)和NFS的RPC调用(RFC-1050).UDP域名服务请求(NameServerRequests)(注意:以下的描述中假设你熟悉RFC-1035说明的域名服务协议.如果你不熟悉这个协议,下面的内容就象是天书.)域名服务请求的格式是src>dst:idop?flagsqtypeqclassname(len)h2opolo.1538>helios.domain:3+A?.(37)主机h2opolo访问helios上的域名服务,询问和.关联的地址记录(qtype=A).查询号是`3'.`+'表明设置了递归请求标志.查询长度是37字节,不包括UDP和IP头.查询操作是普通的Query操作,因此op域可以忽略.如果op设置成其他什么东西,它应该显示在`3'和`+'之间.类似的,qclass是普通的C_IN类型,也被忽略了.其他类型的qclass应该在`A'后面显示. Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个查询包含回答,名字服务或管理机构部分,就把ancount,nscount,或arcount显示成`[na]',`[nn]'或`[nau]',这里的n代表相应的数量.如果在第二和第三字节中,任何一个回答位(AA,RA或rcode)或任何一个`必须为零'的位被置位,就显示`[b2&3=x]',这里的x是报头第二和第三字节的16进制数.UDP名字服务回答名字服务回答的格式是src>dst:idoprcodeflagsa/n/autypeclassdata(len)helios.domain>h2opolo.1538:33/3/7A128.32.137.3(273)helios.domain>h2opolo.1537:2NXDomain*0/1/0(97)第一个例子里,helios回答了h2opolo发出的标识为3的询问,一共是3个回答记录,3个名字服务记录和7个管理结构记录.第一个回答纪录的类型是A(地址),数据是internet地址128.32.137.3.回答的全长为273字节,不包括UDP和IP报头.作为A记录的class(C_IN)可以忽略op(询问)和rcode(NoError).在第二个例子里,helios对标识为2的询问作出域名不存在(NXDomain)的回答,没有回答记录,一个名字服务记录,而且没有管理结构.`*'表明设置了权威回答(authoritativeanswer).由于没有回答记录,这里就不显示type,class和data.其他标志字符可以显示为`-'(没有设置递归有效(RA))和`|'(设置消息截短(TC)).如果`问题'部分没有有效的内容,就显示`[nq]'.注意名字服务的询问和回答一般说来比较大,68字节的snaplen可能无法捕捉到足够的报文内容.如果你的确在研究名字服务的情况,可以使用-s选项增大捕捉缓冲区.`-s128'应该效果不错了.NFS请求和响应SunNFS(网络文件系统)的请求和响应显示格式是:src.xid>dst.nfs:lenopargssrc.nfs>dst.xid:replystatlenopresultssushi.6709>wrl.nfs:112readlinkfh21,24/10.73165wrl.nfs>sushi.6709:replyok40readlink"../var"sushi.201b>wrl.nfs:144lookupfh9,74/4096.6878"xcolors"wrl.nfs>sushi.201b:replyok128lookupfh9,74/4134.3150在第一行,主机sushi向wrl发送号码为6709的交易会话(注意源主机后面的数字是交易号,不是端口).这项请求长112字节,不包括UDP和IP报头.在文件句柄(fh)21,24/10.731657119上执行readlink(读取符号连接)操作.(如果运气不错,就象这种情况,文件句柄可以依次翻译成主次设备号,i节点号,和事件号(generationnumber).)Wrl回答`ok'和连接的内容.在第三行,sushi请求wrl在目录文件9,74/4096.6878中查找`xcolors'.注意数据的打印格式取决于操作类型.格式应该是可以自我说明的.给出-v(verbose)选项可以显示附加信息.例如:sushi.1372a>wrl.nfs:148readfh21,11/12.1958192bytes@24576wrl.nfs>sushi.1372a:replyok1472readREG100664ids417/0sz29388(-v同时使它显示IP报头的TTL,ID,和分片域,在这个例子里把它们省略了.)在第一行,sushi 请求wrl从文件21,11/12.195的偏移位置24576开始,读取8192字节.Wrl回答`ok';第二行显示的报文是应答的第一个分片,因此只有1472字节(其余数据在后续的分片中传过来,但由于这些分片里没有NFS甚至UDP报头,因此根据所使用的过滤器表达式,有可能不显示).-v选项还会显示一些文件属性(它们作为文件数据的附带部分传回来):文件类型(普通文件``REG''),存取模式(八进制数),uid和gid,以及文件大小.如果再给一个-v选项(-vv),还能显示更多的细节.注意NFS请求的数据量非常大,除非增加snaplen,否则很多细节无法显示.试一试`-s192'选项.NFS应答报文没有明确标明RPC操作.因此tcpdump保留有``近来的''请求记录,根据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析.KIPAppletalk(UDP上的DDP)AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所有的UDP 报头信息).文件/etc/s用来把appletalk网络和节点号翻译成名字.这个文件的行格式是numbername1.254ether16.1icsd-net1.254.110ace前两行给出了appletalk的网络名称.第三行给出某个主机的名字(主机和网络依据第三组数字区分-网络号一定是两组数字,主机号一定是三组数字.)号码和名字用空白符(空格或tab)隔开./etc/s文件可以包含空行或注释行(以`#'开始的行).Appletalk地址按这个格式显示net.host.port144.1.209.2>icsd-net.112.220office.2>icsd-net.112.220jssmag.149.235>icsd-net.2(如果不存在/etc/s,或者里面缺少有效项目,就以数字形式显示地址.)第一个例子里,网络144.1的209节点的NBP(DDP端口2)向网络icsd的112节点的220端口发送数据.第二行和上面一样,只是知道了源节点的全称(`office').第三行是从网络jssmag的149节点的235端口向icsd-net的NBP端口广播(注意广播地址(255)隐含在无主机号的网络名字中-所以在/etc/s中区分节点名和网络名是个好主意).Tcpdump可以翻译NBP(名字联结协议)和A TP(Appletalk交互协议)的报文内容.其他协议只转储协议名称(或号码,如果还没给这个协议注册名称)和报文大小.NBP报文的输出格式就象下面的例子:icsd-net.112.220>jssmag.2:nbp-lkup190:"=:LaserWriter@*"jssmag.209.2>icsd-net.112.220:nbp-reply190:"RM1140:LaserWriter@*"250techpit.2>icsd-net.112.220:nbp-reply190:"techpit:LaserWriter@*"186第一行是网络icsd的112主机在网络jssmag上的广播,对名字laserwriter做名字查询请求.名字查询请求的nbp标识号是190.第二行显示的是对这个请求的回答(注意它们有同样的标识号),主机jssmag.209表示在它的250端口注册了一个laserwriter的资源,名字是"RM1140".第三行是这个请求的其他回答,主机techpit的186端口有laserwriter注册的"techpit".ATP报文格式如下例所示:jssmag.209.165>helios.132:atp-req12266<0-7>0xae030001helios.132>jssmag.209.165:atp-resp12266:0(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:1(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:2(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:4(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:6(512)0xae040000helios.132>jssmag.209.165:atp-resp*12266:7(512)0xae040000jssmag.209.165>helios.132:atp-req12266<3,5>0xae030001helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000jssmag.209.165>helios.132:atp-rel12266<0-7>0xae030001jssmag.209.133>helios.132:atp-req*12267<0-7>0xae030002Jssmag.209向主机helios发起12266号交易,请求8个报文(`<0-7>').行尾的十六进制数是请求中`userdata'域的值.。
tcpdump的使用tcpdump采用命令行方式,它的命令格式为:tcpdump [ -a d e f l n N O p q S t v x][ -c 数量 ][ -F 文件名 ][ -i 网络接口 ][ -r 文件名][ -s snaplen ][ -T 类型 ][ -w 文件名 ][表达式 ]描述(DESCRIPTION)Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限.对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限.对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.对于BSD:你必须有/dev/bpf*的读访问权限.1. tcpdump的选项介绍2. tcpdump的表达式介绍表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。
如果没有给出任何条件,则网络上所有的信息包将会被截获。
在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明202.0.0.0是一个网络地址,port 23 指明端口号是23。
tcpdump常⽤参数说明tcpdump常⽤参数说明(⼀)、学习tcpdump的5个参数初次使⽤tcpdump时,使⽤tcpdump -h命令可以看到它有数⼗个参数。
根据我们在运维⼯作中的经验,掌握tcpdump以下5个参数即可满⾜⼤部分的⼯作需要了。
❶-i参数。
使⽤-i参数指定需要抓包的⽹卡。
如果未指定的话,tcpdump会根据搜索到的系统中状态为UP的最⼩数字的⽹卡确定,⼀般情况下是eth0。
使⽤-i参数通过指定需要抓包的⽹卡,可以有效的减少抓取到的数据包的数量,增加抓包的针对性,便于后续的分析⼯作。
❷-nnn参数。
使⽤-nnn参数禁⽤tcpdump展⽰时把IP、端⼝等转换为域名、端⼝对应的知名服务名称。
这样看起来更加清晰。
❸-s参数。
使⽤-s参数,指定抓包的包⼤⼩。
使⽤-s 0指定数据包⼤⼩为262144字节,可以使得抓到的数据包不被截断,完整反映数据包的内容。
❹-c参数。
使⽤-c参数,指定抓包的数量。
❺-w参数。
使⽤-w参数指定抓包⽂件保存到⽂件,以便后续使⽤Wireshark等⼯具进⾏分析。
(⼆)、学习tcpdump的过滤器 tcpdump提供了丰富的过滤器,以⽀持抓包时的精细化控制,达到减少⽆效信息⼲扰的效果。
我们常⽤的过滤器规则有下⾯⼏个:❶host a.b.c.d:指定仅抓取本机和某主机a.b.c.d的数据通信。
❷tcp port x:指定仅抓取TCP协议⽬的端⼝或者源端⼝为x的数据通信。
❸icmp:指定仅抓取ICMP协议的数据通信。
❹!:反向匹配,例如port ! 22,抓取⾮22端⼝的数据通信。
以上⼏种过滤器规则,可以使⽤and或者or进⾏组合,例如: host a.b.c.d and tcp port x:则只抓取本机和某主机a.b.c.d之间基于TCP的⽬的端⼝或者源端⼝为x的数据通信。
tcp port x or icmp:则抓取TCP协议⽬的端⼝或者源端⼝为x的数据通信或者ICMP协议的数据通信。
最全的tcpdump使⽤详解简介⽤简单的话来定义tcpdump,就是:dump the traffic on a network,根据使⽤者的定义对⽹络上的数据包进⾏截获的包分析⼯具。
tcpdump可以将⽹络中传送的数据包的“头”完全截获下来提供分析。
它⽀持针对⽹络层、协议、主机、⽹络或端⼝的过滤,并提供and、or、not等逻辑语句来帮助你去掉⽆⽤的信息。
实⽤命令实例默认启动tcpdump普通情况下,直接启动tcpdump将监视第⼀个⽹络接⼝上所有流过的数据包。
监视指定⽹络接⼝的数据包tcpdump -i eth1如果不指定⽹卡,默认tcpdump只会监视第⼀个⽹络接⼝,⼀般是eth0,下⾯的例⼦都没有指定⽹络接⼝。
监视指定主机的数据包打印所有进⼊或离开sundown的数据包.tcpdump host sundown也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包tcpdump host 210.27.48.1打印helios 与 hot 或者与 ace 之间通信的数据包tcpdump host helios and \( hot or ace \)截获主机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 \)打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.tcpdump ip host ace and not helios如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使⽤命令:tcpdump ip host 210.27.48.1 and ! 210.27.48.2截获主机hostname发送的所有数据tcpdump -i eth0 src host hostname监视所有送到主机hostname的数据包tcpdump -i eth0 dst host hostname监视指定主机和端⼝的数据包如果想要获取主机210.27.48.1接收或发出的telnet包,使⽤如下命令tcpdump tcp port 23 and host 210.27.48.1对本机的udp 123 端⼝进⾏监视 123 为ntp的服务端⼝tcpdump udp port 123监视指定⽹络的数据包打印本地主机与Berkeley⽹络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley⽹络'的⽹络地址,此表达式最原始的含义可表达为: 打印⽹络地址为ucb-ether的所有数据包)tcpdump net ucb-ether打印所有通过⽹关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防⽌shell对其中的括号进⾏错误解析)tcpdump 'gateway snup and (port ftp or ftp-data)'打印所有源地址或⽬标地址是本地主机的IP数据包(如果本地⽹络通过⽹关连到了另⼀⽹络, 则另⼀⽹络并不能算作本地⽹络.(nt: 此句翻译曲折,需补充).localnet 实际使⽤时要真正替换成本地⽹络的名字)tcpdump ip and not net localnet监视指定协议的数据包打印TCP会话中的的开始和结束数据包, 并且数据包的源或⽬的不是本地⽹络上的主机.(nt: localnet, 实际使⽤时要真正替换成本地⽹络的名字))tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'打印所有源或⽬的端⼝是80, ⽹络层协议为IPv4, 并且含有数据,⽽不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'(nt: 可理解为, ip[2:2]表⽰整个ip数据包的长度, (ip[0]&0xf)<<2)表⽰ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, ⽽此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表⽰tcp头的长度, 此域的单位也是32bit, 换算成⽐特数为 ((tcp[12]&0xf0) >> 4) << 2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表⽰: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 并且其中表达⽅式'ip[]'需换成'ip6[]'.)打印长度超过576字节, 并且⽹关地址是snup的IP数据包tcpdump 'gateway snup and ip[2:2] > 576'打印所有IP层⼴播或多播的数据包,但不是物理以太⽹层的⼴播或多播数据报tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'打印除'echo request'或者'echo reply'类型以外的ICMP数据包( ⽐如,需要打印所有⾮ping 程序产⽣的数据包时可⽤到此表达式 .(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包通常由ping程序产⽣))tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'tcpdump 与wiresharkWireshark(以前是ethereal)是Windows下⾮常简单易⽤的抓包⼯具。
tcpdump命令的使用方法(3)ARP/RARP 数据包tcpdump对Arp/rarp包的输出信息中会包含请求类型及该请求对应的参数. 显示格式简洁明了. 以下是从主机rtsg到主机csam的'rlogin'(远程登录)过程开始阶段的数据包样例:arp who-has csam tell rtsgarp reply csam is-at CSAM第一行表示:rtsg发送了一个arp数据包(nt:向全网段发送,arp数据包)以询问csam的以太网地址Csam(nt:可从下文看出来, 是Csam)以她自己的以太网地址做了回应(在这个例子中, 以太网地址以大写的名字标识, 而internet 地址(即ip地址)以全部的小写名字标识).如果使用tcpdump -n, 可以清晰看到以太网以及ip地址而不是名字标识:arp who-has 128.3.254.6 tell 128.3.254.68arp reply 128.3.254.6 is-at 02:07:01:00:01:c4如果我们使用tcpdump -e, 则可以清晰的看到第一个数据包是全网广播的, 而第二个数据包是点对点的:RTSG Broadcast 0806 64: arp who-has csam tell rtsgCSAM RTSG 0806 64: arp reply csam is-at CSAM第一个数据包表明:以arp包的源以太地址是RTSG, 目标地址是全以太网段, type域的值为16进制0806(表示ETHER_ARP(nt:arp包的类型标识)),包的总长度为64字节.TCP 数据包(注意:以下将会假定你对RFC-793所描述的TCP熟悉. 如果不熟, 以下描述以及tcpdump程序可能对你帮助不大.(nt:警告可忽略, 只需继续看, 不熟悉的地方可回头再看.).通常tcpdump对tcp数据包的显示格式如下:src > dst: flags data-seqno ack window urgent optionssrc 和dst 是源和目的IP地址以及相应的端口. flags 标志由S(SYN), F(FIN), P(PUSH, R(RST),W(ECN CWT(nt | rep:未知, 需补充))或者 E(ECN-Echo(nt | rep:未知, 需补充))组成,单独一个'.'表示没有flags标识. 数据段顺序号(Data-seqno)描述了此包中数据所对应序列号空间中的一个位置(nt:整个数据被分段, 每段有一个顺序号, 所有的顺序号构成一个序列号空间)(可参考以下例子). Ack 描述的是同一个连接,同一个方向,下一个本端应该接收的(对方应该发送的)数据片段的顺序号. Window是本端可用的数据接收缓冲区的大小(也是对方发送数据时需根据这个大小来组织数据).Urg(urgent) 表示数据包中有紧急的数据. options 描述了tcp的一些选项, 这些选项都用尖括号来表示(如src, dst 和flags 这三个域总是会被显示. 其他域的显示与否依赖于tcp协议头里的信息.这是一个从trsg到csam的一个rlogin应用登录的开始阶段.rtsg.1023 > csam.login: S 768512:768512(0) win 4096csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096rtsg.1023 > csam.login: . ack 1 win 4096rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096csam.login > rtsg.1023: . ack 2 win 4096rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1第一行表示有一个数据包从rtsg主机的tcp端口1023发送到了csam主机的tcp端口login上(nt:udp协议的端口和tcp协议的端口是分别的两个空间, 虽然取值范围一致). S表示设置了SYN标志.包的顺序号是768512, 并且没有包含数据.(表示格式为:'first:last(nbytes)', 其含义是'此包中数据的顺序号从first开始直到last结束,不包括last. 并且总共包含nbytes的用户数据'.) 没有捎带应答(nt:从下文来看,第二行才是有捎带应答的数据包), 可用的接受窗口的大小为4096bytes, 并且请求端(rtsg) 的最大可接受的数据段大小是1024字节(nt:这个信息作为请求发向应答端csam, 以便双方进一步的协商).Csam 向rtsg 回复了基本相同的SYN数据包, 其区别只是多了一个' piggy-backed ack'(nt:捎带回的ack应答, 针对rtsg的SYN数据包).rtsg 同样针对csam的SYN数据包回复了一ACK数据包作为应答. '.'的含义就是此包中没有标志被设置. 由于此应答包中不含有数据, 所以包中也没有数据段序列号. 提醒! 此ACK数据包的顺序号只是一个小整数1. 有如下解释:tcpdump对于一个tcp连接上的会话, 只打印会话两端的初始数据包的序列号,其后相应数据包只打印出与初始包序列号的差异.即初始序列号之后的序列号, 可被看作此会话上当前所传数据片段在整个要传输的数据中的'相对字节'位置(nt:双方的第一个位置都是1, 即'相对字节'的开始编号). '-S'将覆盖这个功能,使数据包的原始顺序号被打印出来.第六行的含义为:rtsg 向csam发送了19字节的数据(字节的编号为2到20,传送方向为rtsg到csam). 包中设置了PUSH标志. 在第7行,csam 喊到,她已经从rtsg中收到了21以下的字节, 但不包括21编号的字节. 这些字节存放在csam的socket的接收缓冲中, 相应地, csam的接收缓冲窗口大小会减少19字节(nt:可以从第5行和第7行win属性值的变化看出来). csam在第7行这个包中也向rtsg发送了一个字节. 在第8行和第9行, csam 继续向rtsg 分别发送了两个只包含一个字节的数据包, 并且这个数据包带PUSH标志.如果所抓到的tcp包(nt:即这里的snapshot)太小了,以至tcpdump无法完整得到其头部数据, 这时, tcpdump会尽量解析这个不完整的头,并把剩下不能解析的部分显示为'[|tcp]'. 如果头部含有虚假的属性信息(比如其长度属性其实比头部实际长度长或短), tcpdump会为该头部显示'[bad opt]'. 如果头部的长度告诉我们某些选项(nt | rt:从下文来看,指tcp包的头部中针对ip包的一些选项, 回头再翻)会在此包中, 而真正的IP(数据包的长度又不够容纳这些选项, tcpdump会显示'[bad hdr length]'.抓取带有特殊标志的的TCP包(如SYN-ACK标志, URG-ACK标志等).在TCP的头部中, 有8比特(bit)用作控制位区域, 其取值为:CWR | ECE | URG | ACK | PSH | RST | SYN | FIN(nt | rt:从表达方式上可推断:这8个位是用或的方式来组合的, 可回头再翻)现假设我们想要监控建立一个TCP连接整个过程中所产生的数据包. 可回忆如下:TCP使用3次握手协议来建立一个新的连接; 其与此三次握手。
tcpdump 命令使⽤tcpdump 命令使⽤tcpdump命令参数解析1.option 可选参数:能够控制tcpdump 命令,⽐如是否解析域名,将结果输出到⽂件,或者从⽂件读包数据,以及打印格式等。
2.protocol 协议过滤:能够根据不同的协议进⾏过滤,常⽤的已经上⾯了。
3.direction ⽅向过滤:能够根据数据的流向来进⾏过滤,也就是src 和dst ,也可以是两者。
4. type 类型过滤:能够根据不同的类型进⾏过滤。
tcpdump 输出结构这是直接不使⽤参数得到的其中⼀条输出1. 第⼀列:代表时间,分别是时分秒毫秒 22:21:43.500014。
2. 第⼆列:代表⽹络协议 IP 。
3. 第三列:代表发送的⽅的地址(IP+port ),其中10.21.11.47是IP ,⽽http 是端⼝,在tcpdump 中http 就代表80端⼝,所以也就是10.21.11.47.80,后⾯可以使⽤-nn 参数来关闭转换。
4. 第四列:代表数据流向,可以看出是10.21.11.47.http 发送数据到11.0.85.18.51352。
5. 第五列:代表接收⽅的地址,格式同第三列,可以看出这次商品是51352。
6. 第六列:代表分隔,冒号。
7. 第七列:代表数据包的相关内容。
包括Flags 标识符,seq 号,ack 号,win 窗⼝⼤⼩,数据长度length ,通信协议HTTP 等。
Flag 标识符[S]:代表SYN ,同步标记,⼀般是在建⽴连接时使⽤,也就是TCP 三次握⼿时使⽤。
[.]:代表没有Flags ,但是除了SYN 包外所有的数据包都有ACK ,所以这个标记也可以代表ACK 。
[P]:代表PUSH ,推送数据,发送⽅通过使⽤PUSH 位来通知接收⽅将所有收到的数据⽴即提交给服务器进程,⽽不需要等待额外数据(将缓存填满)⽽让数据在缓存中停留!这⾥所说的数据包括与此PUSH 包⼀起传输的数据以及之前就为该进程传输过来的数据(滞留在缓存中的数据)。
tcpdump - dump traffic on a networkSYNOPSIStcpdump [ -adeflnNOpqRStuvxX ] [ -c count ][ -C file_size ] [ -F file ][ -i interface ] [ -m module ] [ -r file ][ -s snaplen ] [ -T type ] [ -w file ][ -E algo:secret ] [ expression ]DESCRIPTIONTcpdump prints out the headers of packets on a network interface that match the boolean expression. It can also be run with the -w flag, which causes it to save the packet data to a file for later analysis, and/or with the -b flag, which causes it to read from a saved packet file rather than to read packets from a network interface. In all cases, only packets that match expression will be pro cessed by tcpdump.Tcpdump will, if not run with the -c flag, continue cap turing packets until it is interrupted by a SIGINT signal (generated, for example, by typing your interrupt charac ter, typically control-C) or a SIGTERM signal (typically generated with the kill(1) command); if run with the -c flag, it will capture packets until it is interrupted by a SIGINT or SIGTERM signal or the specified number of pack ets have been processed.When tcpdump finishes capturing packets, it will report counts of:packets ``received by filter'' (the meaning of this depends on the OS on which you're running tcpdump, and possibly on the way the OS was configured - if a filter was specified on the command line, on some OSes it counts packets regardless of whether they were matched by the filter expression, and on other OSes it counts only packets that were matched by the filter expression and were processed by tcp dump);packets ``dropped by kernel'' (this is the number of packets that were dropped, due to a lack of buffer space, by the packet capture mechanism in the OS on which tcpdump is running, if the OS reports that information to applications; if not, it will be reported as 0).On platforms that support the SIGINFO signal, such as most BSDs, it will report those counts when it receives a SIG INFO signal (generated, for example, by typing your ``sta tus'' character, typically control-T) and will continue you have special privileges:Under SunOS 3.x or 4.x with NIT or BPF:You must have read access to /dev/nit or /dev/bpf*.Under Solaris with DLPI:You must have read/write access to the network pseudo device, e.g. /dev/le. On at least some versions of Solaris, however, this is not suffi cient to allow tcpdump to capture in promiscuous mode; on those versions of Solaris, you must be root, or tcpdump must be installed setuid to root, in order to capture in promiscuous mode.Under HP-UX with DLPI:You must be root or tcpdump must be installed setuid to root.Under IRIX with snoop:You must be root or tcpdump must be installed setuid to root.Under Linux:You must be root or tcpdump must be installed setuid to root.Under Ultrix and Digital UNIX:Once the super-user has enabled promiscuous-mode operation using pfconfig(8), any user may captureoperation using pfconfig(8), any user may capture network traffic with tcpdump.Under BSD:You must have read access to /dev/bpf*.Reading a saved packet file doesn't require special privi leges.OPTIONS-a Attempt to convert network and broadcast addresses to names.-c Exit after receiving count packets.-C Before writing a raw packet to a savefile, check whether the file is currently larger than file_size and, if so, close the current savefile and open a new one. Savefiles after the first savefile will have the name specified with the -w flag, with a number after it, starting at 2 and continuing upward. The units of file_size are millions of bytes (1,000,000 bytes, not 1,048,576 bytes).-dd Dump packet-matching code as a C program fragment.-ddd Dump packet-matching code as decimal numbers (pre ceded with a count).-e Print the link-level header on each dump line.-E Use algo:secret for decrypting IPsec ESP packets. Algorithms may be des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc, or none. The default is des-cbc. The ability to decrypt packets is only pre sent if tcpdump was compiled with cryptography enabled. secret the ascii text for ESP secret key. We cannot take arbitrary binary value at this moment. The option assumes RFC2406 ESP, not RFC1827 ESP. The option is only for debugging pur poses, and the use of this option with truly `secret' key is discouraged. By presenting IPsec secret key onto command line you make it visible to others, via ps(1) and other occasions.-f Print `foreign' internet addresses numerically rather than symbolically (this option is intended to get around serious brain damage in Sun's yp server -- usually it hangs forever translating non- local internet numbers).-F Use file as input for the filter expression. An additional expression given on the command line is ignored.-i Listen on interface. If unspecified, tcpdump searches the system interface list for the lowest numbered, configured up interface (excluding loop back). Ties are broken by choosing the earliest match.On Linux systems with 2.2 or later kernels, an interface argument of ``any'' can be used to cap ture packets from all interfaces. Note that cap tures on the ``any'' device will not be done in promiscuous mode.-l Make stdout line buffered. Useful if you want to see the data while capturing it. E.g.,``tcpdump -l | tee dat'' or ``tcpdump -l > dat & tail -f dat''.-m Load SMI MIB module definitions from file module. This option can be used several times to load sev eral MIB modules into tcpdump.numbers, etc.) to names.-N Don't print domain name qualification of host names. E.g., if you give this flag then tcpdump will print ``nic'' instead of ``''.-O Do not run the packet-matching code optimizer. This is useful only if you suspect a bug in the optimizer.-p Don't put the interface into promiscuous mode.Note that the interface might be in promiscuous mode for some other reason; hence, `-p' cannot be used as an abbreviation for `ether host {local-hw- addr} or ether broadcast'.-q Quick (quiet?) output. Print less protocol infor mation so output lines are shorter.-R Assume ESP/AH packets to be based on old specifica tion (RFC1825 to RFC1829). If specified, tcpdump will not print replay prevention field. Since there is no protocol version field in ESP/AH speci fication, tcpdump cannot deduce the version of ESP/AH protocol.-r Read packets from file (which was created with the -w option). Standard input is used if file is ``-''.-S Print absolute, rather than relative, TCP sequence numbers.-s Snarf snaplen bytes of data from each packet rather than the default of 68 (with SunOS's NIT, the mini mum is actually 96). 68 bytes is adequate for IP, ICMP, TCP and UDP but may truncate protocol infor mation from name server and NFS packets (see below). Packets truncated because of a limited snapshot are indicated in the output with ``[|proto]'', where proto is the name of the proto col level at which the truncation has occurred. Note that taking larger snapshots both increases the amount of time it takes to process packets and, effectively, decreases the amount of packet buffer ing. This may cause packets to be lost. You should limit snaplen to the smallest number that will capture the protocol information you're inter ested in. Setting snaplen to 0 means use the required length to catch whole packets.-T Force packets selected by "expression" to be inter cedure Call), rtp (Real-Time Applications proto col), rtcp (Real-Time Applications control proto col), snmp (Simple Network Management Protocol), vat (Visual Audio Tool), and wb (distributed White Board).-t Don't print a timestamp on each dump line.-tt Print an unformatted timestamp on each dump line.-ttt Print a delta (in micro-seconds) between current and previous line on each dump line.-tttt Print a timestamp in default format proceeded by date on each dump line. -u Print undecoded NFS handles.-v (Slightly more) verbose output. For example, the time to live, identification, total length and options in an IP packet are printed. Also enables additional packet integrity checks such as verify ing the IP and ICMP header checksum.-vv Even more verbose output. For example, additional fields are printed from NFS reply packets, and SMB packets are fully decoded.-vvv Even more verbose output. For example, telnet SB ... SE options are printed in full. With -X telnet options are printed in hex as well.-w Write the raw packets to file rather than parsing and printing them out. They can later be printed with the -r option. Standard output is used if file is ``-''.-x Print each packet (minus its link level header) in hex. The smaller of the entire packet or snaplen bytes will be printed.-X When printing hex, print ascii too. Thus if -x is also set, the packet is printed in hex/ascii. This is very handy for analysing new protocols. Even if -x is not also set, some parts of some packets may be printed in hex/ascii.expressionselects which packets will be dumped. If no expression is given, all packets on the net will be dumped. Otherwise, only packets for which expression is `true' will be dumped.ber) preceded by one or more qualifiers. There are three different kinds of qualifier:type qualifiers say what kind of thing the id name or number refers to. Possible types are host, net and port. E.g., `host foo', `net 128.3', `port 20'. If there is no type qualifier, host is assumed.dir qualifiers specify a particular transfer direction to and/or from id. Possible directions are src, dst, src or dst and srcand dst. E.g., `src foo', `dst net 128.3', `src or dst port ftp-data'. If there is no dir qualifier, src or dst is assumed. For `null' link layers (i.e. point to point pro tocols such as slip) the inbound and outbound qualifiers can be used to specify a desired direction.proto qualifiers restrict the match to a particu lar protocol. Possible protos are: ether,fddi, tr, ip, ip6, arp, rarp, decnet, tcp and udp. E.g., `ether src foo', `arp net 128.3', `tcp port 21'. If there is no proto qualifier, all protocols consistent with the type are assumed. E.g., `src foo' means `(ip or arp or rarp) src foo' (except the latter is not legal syntax), `net bar' means `(ip or arp or rarp) net bar' and `port 53' means `(tcp or udp) port 53'.[`fddi' is actually an alias for `ether'; the parser treats them identically as meaning ``the data link level used on the specified network interface.'' FDDI headers contain Ethernet-like source and destination addresses, and often contain Ethernet-like packet types, so you can filter on these FDDI fields just as with the analogous Ether net fields. FDDI headers also contain other fields, but you cannot name them explicitly in a filter expression.Similarly, `tr' is an alias for `ether'; the previ ous paragraph's statements about FDDI headers also apply to Token Ring headers.]In addition to the above, there are some special `primitive' keywords that don't follow the pattern: gateway, broadcast, less, greater and arithmetic expressions. All of these are described below.tives. E.g., `host foo and not port ftp and not port ftp-data'. To save typing, identical quali fier lists can be omitted. E.g., `tcp dst port ftp or ftp-data or domain' is exactly the same as `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'.Allowable primitives are:dst host hostTrue if the IPv4/v6 destination field of the packet is host, which may be either an address or a name.src host hostTrue if the IPv4/v6 source field of the packet is host.host hostTrue if either the IPv4/v6 source or desti nation of the packet is host. Any of the above host expressions can be prepended with the keywords, ip, arp, rarp, or ip6 as in:ip host hostwhich is equivalent to:ether proto\ip and host hostIf host is a name with multiple IP addresses, each address will be checked for a match.ether dst ehostTrue if the ethernet destination address isehost. Ehost may be either a name from /etc/ethers or a number (see ethers(3N) for numeric format).ether src ehostTrue if the ethernet source address isehost.ether host ehostTrue if either the ethernet source or desti nation address is ehost.gateway hostTrue if the packet used host as a gateway.I.e., the ethernet source or destination address was host but neither the IP source nor the IP destination was host. Host must be a name and must be found both by the machine's host-name-to-IP-address resolution mechanisms (host name file, DNS, NIS, etc.) etc.). (An equivalent expression isether host ehost and not host hostwhich can be used with either names or num bers for host/ehost.) This syntax does not work in IPv6-enabled configuration at this moment.dst net netTrue if the IPv4/v6 destination address of the packet has a network number of net. Net may be either a name from /etc/networks or a network number (see networks(4) for details).src net netTrue if the IPv4/v6 source address of the packet has a network number of net.net netTrue if either the IPv4/v6 source or desti nation address of the packet has a network number of net.net net mask netmaskTrue if the IP address matches net with the specific netmask. May be qualified with src or dst. Note that this syntax is not valid for IPv6 net.net net/lenTrue if the IPv4/v6 address matches net with a netmask len bits wide. May be qualified with src or dst.dst port portTrue if the packet is ip/tcp, ip/udp, ip6/tcp or ip6/udp and has a destination port value of port. The port can be a num ber or a name used in /etc/services (seetcp(4P) and udp(4P)). If a name is used, both the port number and protocol are checked. If a number or ambiguous name is used, only the port number is checked (e.g.,dst port513 will print both tcp/login traf fic and udp/who traffic, and port domain will print both tcp/domain and udp/domain traffic).src port portTrue if the packet has a source port value of port.True if either the source or destination port of the packet is port. Any of the above port expressions can be prepended with the keywords, tcp or udp, as in:tcp src port portwhich matches only tcp packets whose source port is port.less lengthTrue if the packet has a length less than or equal to length. This is equivalent to:len<=length.greater lengthTrue if the packet has a length greater than or equal to length. This is equivalent to:len>=length.ip proto protocolTrue if the packet is an IP packet (seeip(4P)) of protocol type protocol. Protocol can be a number or one of the names icmp,icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, or tcp. Note that the identifiers tcp, udp, and icmp are also keywords and must be escaped via backslash (\), which is \\ in the C-shell. Note that this primitive does not chase the protocol header chain.ip6proto protocolTrue if the packet is an IPv6 packet of pro tocol type protocol. Note that this primi tive does not chase the protocol header chain.ip6protochain protocolTrue if the packet is IPv6 packet, and con tains protocol header with type protocol in its protocol header chain. For example,ip6protochain6matches any IPv6 packet with TCP protocol header in the protocol header chain. The packet may contain, for example, authentica tion header, routing header, or hop-by-hop option header, between IPv6 header and TCP header. The BPF code emitted by this primi tive is complex and cannot be optimized by BPF optimizer code in tcpdump, so this can be somewhat slow.ip protochain protocolEquivalent to ip6protochain protocol, but True if the packet is an ethernet broadcast packet. The ether keyword is optional.ip broadcastTrue if the packet is an IP broadcast packet. It checks for both the all-zeroes and all-ones broadcast conventions, and looks up the local subnet mask.ether multicastTrue if the packet is an ethernet multicast packet. The ether keyword is optional. This is shorthand for `ether[0]&1!=0'.ip multicastTrue if the packet is an IP multicast packet.ip6multicastTrue if the packet is an IPv6 multicast packet.ether proto protocolTrue if the packet is of ether type protocol. Protocol can be a number or one of the names ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui. Note these identifiers are also keywords and must be escaped via backslash (\).[In the case of FDDI (e.g., `fddi protocolarp') and Token Ring (e.g., `tr protocolarp'), for most of those protocols, the pro tocol identification comes from the 802.2 Logical Link Control (LLC) header, which is usually layered on top of the FDDI or Token Ring header.When filtering for most protocol identifiers on FDDI or Token Ring, tcpdump checks only the protocol ID field of an LLC header in so-called SNAP format with an Organizational Unit Identifier (OUI) of 0x000000, for encapsulated Ethernet; it doesn't check whether the packet is in SNAP format with an OUI of 0x000000.The exceptions are iso, for which it checks the DSAP (Destination Service Access Point) and SSAP (Source Service Access Point) fields of the LLC header, stp and netbeui, packet with an OUI of 0x080007 and the Appletalk etype.In the case of Ethernet, tcpdump checks the Ethernet type field for most of those proto cols; the exceptions are iso, sap, and netbeui, for which it checks for an 802.3 frame and then checks the LLC header as it doesfor FDDI and Token Ring, atalk, where it checks both for the Appletalk etype in an Ethernet frame and for a SNAP-format packet as it does for FDDI and Token Ring, aarp, where it checks for the Appletalk ARP etype in either an Ethernet frame or an 802.2 SNAP frame with an OUI of 0x000000, and ipx, where it checks for the IPX etype in an Eth ernet frame, the IPX DSAP in the LLC header, the 802.3 with no LLC header encapsulation of IPX, and the IPX etype in a SNAP frame.]decnet src hostTrue if the DECNET source address is host, which may be an address of the form ``10.123'', or a DECNET host name. [DECNET host name support is only available on Ultrix systems that are configured to run DECNET.]decnet dst hostTrue if the DECNET destination address ishost.decnet host hostTrue if either the DECNET source or destina tion address is host.ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp,ipx, netbeuiAbbreviations for:ether proto pwhere p is one of the above protocols.lat, moprc, mopdlAbbreviations for:ether proto pwhere p is one of the above protocols. Note that tcpdump does not currently know how to parse these protocols.vlan[vlan_id]True if the packet is an IEEE 802.1Q VLAN packet. If [vlan_id] is specified, only encountered in expression changes the decod ing offsets for the remainder of expression on the assumption that the packet is a VLAN packet.tcp, udp, icmpAbbreviations for:ip proto p or ip6proto pwhere p is one of the above protocols.iso proto protocolTrue if the packet is an OSI packet of pro tocol type protocol. Protocol can be a num ber or one of the names clnp, esis, or isis.clnp, esis, isisAbbreviations for:iso proto pwhere p is one of the above protocols. Note that tcpdump does an incomplete job of pars ing these protocols.expr relop exprTrue if the relation holds, where relop is one of >, <, >=, <=, =, !=, and expr is an arithmetic expression composed of integer constants (expressed in standard C syntax), the normal binary operators [+, -, *, /, &, |], a length operator, and special packet data accessors. To access data inside the packet, use the following syntax:proto[expr:size]Proto is one of ether,fddi,tr,ip,arp,rarp,tcp,udp,icmp or ip6, and indicates the protocol layer for the index operation. Note that tcp,udp and other upper-layer protocol types only apply to IPv4, not IPv6 (this will be fixed in the future). The byte offset, relative to the indicated pro tocol layer, is given by expr. Size is optional and indicates the number of bytes in the field of interest; it can be either one, two, or four, and defaults to one. The length operator, indicated by the keywordlen, gives the length of the packet.For example, `ether[0]&1!=0' catches all multicast traffic. The expression `ip[0]&0xf!=5' catches all IP packets with options. The expression `ip[6:2]&0x1fff=0' catches only unfragmented datagrams and frag zero of fragmented datagrams. This always means the first byte of the TCPheader, and never means the first byte of an intervening fragment.Some offsets and field values may be expressed as names rather than as numeric values. The following protocol header field offsets are available: icmptype (ICMP type field), icmpcode (ICMP code field), andtcpflags (TCP flags field).The following ICMP type field values are available: icmp-echoreply, icmp-unreach,icmp-sourcequench, icmp-redirect, icmp-echo,icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply,icmp-maskreq, icmp-maskreply.The following TCP flags field values are available: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg.Primitives may be combined using:A parenthesized group of primitives and operators (parentheses are special to the Shell and must be escaped).Negation (`!' or `not').Concatenation (`&&' or `and').Alternation (`||' or `or').Negation has highest precedence. Alternation and concatenation have equal precedence and associate left to right. Note that explicit and tokens, not juxtaposition, are now required for concatenation. If an identifier is given without a keyword, the most recent keyword is assumed. For example,not host vs and aceis short fornot host vs and host acewhich should not be confused withnot(host vs or ace)Expression arguments can be passed to tcpdump as either a single argument or as multiple arguments, whichever is more convenient. Generally, if the expression contains Shell metacharacters, it is before being parsed.EXAMPLESTo print all packets arriving at or departing from sun down:tcpdump host sundownTo print traffic between helios and either hot or ace:tcpdump host helios and\(hot or ace\)To print all IP packets between ace and any host except helios:tcpdump ip host ace and not heliosTo print all traffic between local hosts and hosts at Berkeley:tcpdump net ucb-etherTo print all ftp traffic through internet gateway snup: (note that the expression is quoted to prevent the shell from (mis-)interpreting the parentheses):tcpdump'gateway snup and(port ftp or ftp-data)'To print traffic neither sourced from nor destined for local hosts (if you gateway to one other net, this stuff should never make it onto your local net).tcpdump ip and not net localnetTo print the start and end packets (the SYN and FIN packets) of each TCP conversation that involves a non-localhost.tcpdump'tcp[tcpflags]&(tcp-syn|tcp-fin)!=0and not src and dst net localnet'To print IP packets longer than 576 bytes sent throughgateway snup:tcpdump'gateway snup and ip[2:2]>576'To print IP broadcast or multicast packets that were notsent via ethernet broadcast or multicast:tcpdump'ether[0]&1=0and ip[16]>=224'To print all ICMP packets that are not echorequests/replies (i.e., not ping packets):tcpdump'icmp[icmptype]!=icmp-echo and icmp[icmptype]!=icmp-echoreply'OUTPUT FORMATThe output of tcpdump is protocol dependent. The following gives a brief description and examples of most of theformats.Link Level Headersaddresses, protocol, and packet length are printed.On FDDI networks, the '-e' option causes tcpdump to printthe `frame control' field, the source and destinationaddresses, and the packet length. (The `frame control'field governs the interpretation of the rest of thepacket. Normal packets (such as those containing IP datagrams) are `async' packets, with a priority value between0 and 7; for example, `async4'. Such packets are assumedto contain an 802.2 Logical Link Control (LLC) packet; theLLC header is printed if it is not an ISO datagram or aso-called SNAP packet.On Token Ring networks, the '-e' option causes tcpdump toprint the `access control' and `frame control' fields, thesource and destination addresses, and the packet length.As on FDDI networks, packets are assumed to contain an LLCpacket. Regardless of whether the '-e' option is specified or not, the source routing information is printed forsource-routed packets.(N.B.:The following description assumes familiarity withthe SLIP compression algorithm described in RFC-1144.)On SLIP links, a direction indicator (``I'' for inbound,``O'' for outbound), packet type, and compression information are printed out. The packet type is printed first.The three types are ip, utcp, and ctcp. No further linkinformation is printed for ip packets. For TCP packets,the connection identifier is printed following the type.If the packet is compressed, its encoded header is printedout. The special cases are printed out as *S+n and *SA+n,where n is the amount by which the sequence number (orsequence number and ack) has changed. If it is not a special case, zero or more changes are printed. A change isindicated by U (urgent pointer), W (window), A (ack), S(sequence number), and I (packet ID), followed by a delta(+n or -n), or a new value (=n). Finally, the amount ofdata in the packet and compressed header length areprinted.For example, the following line shows an outbound compressed TCP packet, with an implicit connection identifier; the ack has changed by 6, the sequence number by 49,and the packet ID by 6; there are 3 bytes of data and 6bytes of compressed header:O ctcp*A+6S+49I+63(6)ARP/RARP PacketsArp/rarp output shows the type of request and its arguments. The format is intended to be self explanatory.arp who-has csam tell rtsgarp reply csam is-at CSAMThe first line says that rtsg sent an arp packet askingfor the ethernet address of internet host csam. Csamreplies with its ethernet address (in this example, ethernet addresses are in caps and internet addresses in lowercase).This would look less redundant if we had done tcpdump-n:arp who-has128.3.254.6tell128.3.254.68arp reply128.3.254.6is-at02:07:01:00:01:c4If we had done tcpdump-e, the fact that the first packetis broadcast and the second is point-to-point would bevisible:RTSG Broadcast080664:arp who-has csam tell rtsgCSAM RTSG080664:arp reply csam is-at CSAMFor the first packet this says the ethernet source addressis RTSG, the destination is the ethernet broadcastaddress, the type field contained hex 0806 (typeETHER_ARP) and the total length was 64 bytes.TCP Packets(N.B.:The following description assumes familiarity withthe TCP protocol described in RFC-793.If you are notfamiliar with the protocol,neither this description nortcpdump will be of much use to you.)The general format of a tcp protocol line is:src>dst:flags data-seqno ack window urgent optionsSrc and dst are the source and destination IP addressesand ports. Flags are some combination of S (SYN), F(FIN), P (PUSH) or R (RST) or a single `.' (no flags).Data-seqno describes the portion of sequence space coveredby the data in this packet (see example below). Ack issequence number of the next data expected the other direction on this connection. Window is the number of bytes ofreceive buffer space available the other direction on thisconnection. Urg indicates there is `urgent' data in thepacket. Options are tcp options enclosed in angle brackets (e.g., <mss 1024>).Src,dst and flags are always present. The other fieldsdepend on the contents of the packet's tcp protocol headerand are output only if appropriate.Here is the opening portion of an rlogin from host rtsg tohost csam.rtsg.1023>csam.login:S768512:768512(0)win4096<mss1024>csam.login>rtsg.1023:S947648:947648(0)ack768513win4096<mss1024>rtsg.1023>csam.login:.ack1win4096rtsg.1023>csam.login:P2:21(19)ack1win4096csam.login>rtsg.1023:P1:2(1)ack21win4077csam.login>rtsg.1023:P2:3(1)ack21win4077urg1csam.login>rtsg.1023:P3:4(1)ack21win4077urg1The first line says that tcp port 1023 on rtsg sent apacket to port login on csam. The S indicates that theSYN flag was set. The packet sequence number was 768512and it contained no data. (The notation is`first:last(nbytes)' which means `sequence numbers firstup to but not including last which is nbytes bytes of userdata'.) There was no piggy-backed ack, the availablereceive window was 4096 bytes and there was a max-segment-size option requesting an mss of 1024 bytes.Csam replies with a similar packet except it includes apiggy-backed ack for rtsg's SYN. Rtsg then acks csam'sSYN. The `.' means no flags were set. The packet contained no data so there is no data sequence number. Notethat the ack sequence number is a small integer (1). Thefirst time tcpdump sees a tcp `conversation', it printsthe sequence number from the packet. On subsequent packets of the conversation, the difference between the current packet's sequence number and this initial sequencenumber is printed. This means that sequence numbers afterthe first can be interpreted as relative byte positions inthe conversation's data stream (with the first data byteeach direction being `1'). `-S' will override this feature, causing the original sequence numbers to be output.On the 6th line, rtsg sends csam 19 bytes of data (bytes 2through 20 in the rtsg -> csam side of the conversation).The PUSH flag is set in the packet. On the 7th line, csamsays it's received data sent by rtsg up to but not including byte 21. Most of this data is apparently sitting inthe socket buffer since csam's receive window has gotten19 bytes smaller. Csam also sends one byte of data tortsg in this packet. On the 8th and 9th lines, csam sendstwo bytes of urgent, pushed data to rtsg.If the snapshot was small enough that tcpdump didn't capture the full TCP header, it interprets as much of theheader as it can and then reports ``[|tcp]'' to indicatethe remainder could not be interpreted. If the headercontains a bogus option (one with a length that's eithertoo small or beyond the end of the header), tcpdumpreports it as ``[bad opt]'' and does not interpret anyfurther options (since it's impossible to tell where theystart). If the header length indicates options are present but the IP datagram length is not long enough for theoptions to actually be there, tcpdump reports it as ``[bad。
tcpdump命令的使用方法(5)UDP 数据包UDP 数据包的显示格式,可通过rwho这个具体应用所产生的数据包来说明:actinide.who > broadcast.who: udp 84其含义为:actinide主机上的端口who向broadcast主机上的端口who发送了一个udp数据包(nt: actinide和broadcast都是指Internet地址).这个数据包承载的用户数据为84个字节.一些UDP服务可从数据包的源或目的端口来识别,也可从所显示的更高层协议信息来识别. 比如, Domain Name service requests(DNS 请求,在RFC-1034/1035中), 和Sun RPC calls to NFS(对NFS服务器所发起的远程调用(nt: 即Sun RPC),在RFC-1050中有对远程调用的描述).UDP 名称服务请求(注意:以下的描述假设你对Domain Service protoco(nt:在RFC-103中有所描述), 否则你会发现以下描述就是天书(nt:希腊文天书, 不必理会, 吓吓你的, 接着看就行))名称服务请求有如下的格式:src > dst: id op? flags qtype qclass name (len)(nt: 从下文来看, 格式应该是src > dst: id op flags qtype qclass? name (len))比如有一个实际显示为:h2opolo.1538 > helios.domain: 3+ A? .(37)主机h2opolo 向helios 上运行的名称服务器查询 的地址记录(nt: qtype等于A). 此查询本身的id 号为'3'. 符号'+'意味着递归查询标志被设置(nt: dns服务器可向更高层dns服务器查询本服务器不包含的地址记录). 这个最终通过IP包发送的查询请求数据长度为37字节, 其中不包括UDP和IP协议的头数据. 因为此查询操作为默认值(nt | rt: normal one的理解), op字段被省略.如果op字段没被省略, 会被显示在'3' 和'+'之间. 同样, qclass也是默认值, C_IN, 从而也没被显示, 如果没被忽略, 她会被显示在'A'之后.异常检查会在方括中显示出附加的域: 如果一个查询同时包含一个回应(nt: 可理解为, 对之前其他一个请求的回应), 并且此回应包含权威或附加记录段,ancount, nscout, arcount(nt: 具体字段含义需补充) 将被显示为'[na]', '[nn]', '[nau]', 其中n代表合适的计数. 如果包中以下回应位(比如AA位, RA位, rcode位), 或者字节2或3中任何一个'必须为0'的位被置位(nt: 设置为1), '[b2&3]=x' 将被显示, 其中x表示头部字节2与字节3进行与操作后的值.UDP 名称服务应答对名称服务应答的数据包,tcpdump会有如下的显示格式src > dst: id op rcode flags a/n/au type class data (len)比如具体显示如下:helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273) helios.domain > h2opolo.1537: 2 NXDomain_0/1/0 (97)第一行表示: helios 对h2opolo 所发送的3号查询请求回应了3条回答记录(nt | rt: answer records), 3条名称服务器记录, 以及7条附加的记录. 第一个回答记录(nt: 3个回答记录中的第一个)类型为A(nt: 表示地址), 其数据为internet地址128.32.137.3.此回应UDP数据包, 包含273字节的数据(不包含UPD和IP的头部数据). op字段和rcode字段被忽略(nt: op的实际值为Query, rcode, 即response code的实际值为NoError), 同样被忽略的字段还有class 字段(nt | rt: 其值为C_IN, 这也是A类型记录默认取值)第二行表示: helios 对h2opolo 所发送的2号查询请求做了回应. 回应中, rcode编码为NXDomain(nt: 表示不存在的域)), 没有回答记录,但包含一个名称服务器记录, 不包含权威服务器记录(nt | ck: 从上文来看, 此处的authority records 就是上文中对应的additional records). '_表示权威服务器回答标志被设置(nt: 从而additional records就表示的是authority records).由于没有回答记录, type, class, data字段都被忽略.flag字段还有可能出现其他一些字符, 比如'-'(nt: 表示可递归地查询, 即RA 标志没有被设置), '|'(nt: 表示被截断的消息, 即TC 标志被置位). 如果应答(nt | ct: 可理解为, 包含名称服务应答的UDP数据包, tcpdump知道这类数据包该怎样解析其数据)的'question'段一个条目(entry)都不包含(nt: 每个条目的含义, 需补充),'[nq]' 会被打印出来.要注意的是:名称服务器的请求和应答数据量比较大, 而默认的68字节的抓取长度(nt: snaplen, 可理解为tcpdump的一个设置选项)可能不足以抓取数据包的全部内容. 如果你真的需要仔细查看名称服务器的负载, 可以通过tcpdump 的-s 选项来扩大snaplen值.SMB/CIFS 解码tcpdump 已可以对SMB/CIFS/NBT相关应用的数据包内容进行解码(nt: 分别为'Server Message Block Common', 'Internet File System''在TCP/IP上实现的网络协议NETBIOS的简称'. 这几个服务通常使用UDP的137/138以及TCP的139端口). 原来的对IPX和NetBEUI SMB数据包的解码能力依然可以被使用(nt: NetBEUI为NETBIOS的增强版本).tcpdump默认只按照最简约模式对相应数据包进行解码, 如果我们想要详尽的解码信息可以使用其-v 启动选现. 要注意的是, -v 会产生非常详细的信息,比如对单一的一个SMB数据包, 将产生一屏幕或更多的信息, 所以此选项, 确有需要才使用.关于SMB数据包格式的信息, 以及每个域的含义可以参看 或者 镜像站点的pub/samba/specs/ 目录. linux 上的SMB 补丁(nt | rt: patch)由AndrewTridgell(****************)提供.NFS 请求和回应tcpdump对Sun NFS(网络文件系统)请求和回应的UDP数据包有如下格式的打印输出:src.xid > dst.nfs: len op argssrc.nfs > dst.xid: reply stat len op results以下是一组具体的输出数据sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165wrl.nfs > sushi.6709: reply ok 40 readlink "../var"sushi.201b > wrl.nfs:144 lookup fh 9,74/4096.6878 "xcolors"wrl.nfs > sushi.201b:reply ok 128 lookup fh 9,74/4134.3150第一行输出表明: 主机sushi向主机wrl发送了一个'交换请求'(nt: transaction), 此请求的id为6709(注意, 主机名字后是交换请求id号, 而不是源端口号). 此请求数据为112字节, 其中不包括UDP和IP头部的长度. 操作类型为readlink(nt: 即此操作为读符号链接操作),操作参数为fh 21,24/10.73165(nt: 可按实际运行环境, 解析如下, fd 表示描述的为文件句柄, 21,24 表示此句柄所对应设备的主/从设备号对, 10表示此句柄所对应的i节点编号(nt:每个文件都会在操作系统中对应一个i节点, 限于unix类系统中), 73165是一个编号(nt: 可理解为标识此请求的一个随机数, 具体含义需补充)).第二行中, wrl 做了'ok'的回应, 并且在results 字段中返回了sushi 想要读的符号连接的真实目录(nt: 即sushi要求读的符号连接其实是一个目录).第三行表明: sushi 再次请求 wrl 在'fh 9,74/4096.6878'所描述的目录中查找'xcolors'文件. 需要注意的是, 每行所显示的数据含义依赖于其中op字段的类型(nt: 不同op 所对应args 含义不相同), 其格式遵循NFS 协议, 追求简洁明了.如果tcpdump 的-v选项(详细打印选项) 被设置, 附加的信息将被显示. 比如:sushi.1372a > wrl.nfs:148 read fh 21,11/12.195 8192 bytes @ 24576wrl.nfs > sushi.1372a:reply ok 1472 read REG 100664 ids 417/0 sz 29388(-v 选项一般还会打印出IP头部的TTL, ID,length, 以及fragmentation 域, 但在此例中, 都略过了(nt: 可理解为,简洁起见, 做了删减))在第一行, sushi 请求wrl 从文件 21,11/12.195(nt: 格式在上面有描述)中, 自偏移24576字节处开始, 读取8192字节数据.Wrl 回应读取成功; 由于第二行只是回应请求的开头片段, 所以只包含1472字节(其他的数据将在接着的reply片段中到来, 但这些数据包不会再有NFS头, 甚至UDP头信息也为空(nt: 源和目的应该要有), 这将导致这些片段不能满足过滤条件, 从而没有被打印). -v 选项除了显示文件数据信息, 还会显示附加显示文件属性信息: file type(文件类型, ''REG'' 表示普通文件), file mode(文件存取模式, 8进制表示的), uid 和gid(nt: 文件属主和组属主), file size (文件大小).如果-v 标志被多次重复给出(nt: 如-vv), tcpdump会显示更加详细的信息.必须要注意的是, NFS 请求包中数据比较多, 如果tcpdump 的snaplen(nt: 抓取长度) 取太短将不能显示其详细信息. 可使用'-s 192'来增加snaplen, 这可用以监测NFS应用的网络负载(nt: traffic).NFS 的回应包并不严格的紧随之前相应的请求包(nt: RPC operation). 从而, tcpdump 会跟踪最近收到的一系列请求包, 再通过其交换序号(nt: transaction ID)与相应请求包相匹配. 这可能产生一个问题,如果回应包来得太迟, 超出tcpdump 对相应请求包的跟踪范围,该回应包将不能被分析.。
tcpdump使用手册TCPDump是一款功能强大的网络抓包工具,它可以捕获网络数据包并展示其详细信息,帮助我们分析网络通信问题。
本篇文章将为您介绍TCPDump的基本使用方法和一些常用参数。
一、安装TCPDumpTCPDump在大多数操作系统中都有相应的安装包,您可以根据自己的操作系统选择相应的安装方法。
以下是一些常见操作系统的安装命令:- 在Debian/Ubuntu中,您可以使用apt-get命令进行安装:```sudo apt-get install tcpdump```- 在CentOS/RHEL中,您可以使用yum命令进行安装:```sudo yum install tcpdump```- 在MacOS中,您可以使用Homebrew进行安装:```brew install tcpdump```- 在Windows中,您可以从TCPDump的官方网站下载并安装相应的可执行文件。
二、语法格式TCPDump的基本语法如下:```tcpdump [options] [expression]```其中,options为可选参数,expression为过滤表达式,用于指定捕获的数据包类型或范围。
三、基本使用方法1. 捕获所有数据包要捕获网络接口上的所有数据包,只需在命令行输入```tcpdump```即可。
TCPDump将实时显示捕获到的数据包的详细信息,包括源IP地址、目标IP地址、传输协议、数据包大小等。
2. 指定网络接口如果您的系统有多个网络接口,可以使用```-i```选项来指定要捕获数据包的接口。
例如,要捕获eth0接口的数据包,可以使用```tcpdump -i eth0```命令。
3. 保存数据包到文件使用```-w```选项可以将捕获到的数据包保存到文件中,以便以后进行分析。
例如,要将捕获到的数据包保存到名为capture.pcap的文件中,可以使用```tcpdump -w capture.pcap```命令。
TCPDUMP使用说明tcpdump命令参数解释 (1)Tcpdump使用案例说明: (2)TCPDUMP出现“truncated-ip - 1215 bytes missing!”错误 (3)TCPDUMP 命令中的-i参数用VLAN名称与接口编号有什么区别 (3)TCPDUMP 命令中出现“pcap_loop: Error: Interface packet capture busy”错误信息? (5)tcpdump命令参数解释TcpD ump可以将网络中传送的数据包的“头”完全截获下来提供分析。
它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、o r、not等逻辑语句来帮助你去掉无用的信息。
数据过滤不带任何参数的TcpDu mp将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。
所以,我们应当先想好需要哪些数据,Tc pDu mp提供以下参数供我们选择数据:注:tcpdump命令只针对经过CPU处理的数据包进行捕获,一但在BIGIP中的某个VIP采用的是performance L4的方式,数据包则由四层加层ASIC芯片处理而没有流经CPU,无法捕获数据。
解决该问题的方法是:选取该Virtual Server将type由Performance Layer4临时改为Standard再来用TCPDUMP命令抓包,抓包以后,改回到Performance Layer4。
Tcpdump使用案例说明:举例1:对external接口主机139.212.96.2并且端口为1433的流量进行监控。
端口不指定tcp和udp,默认为同时对tcp和udp进行报文捕获。
本命令不解析IP地址/端口号为主机名/服务名称,同时显示报文十二进制和文本信息,报文最大为1500字节。
f5-1:~# tcpdump -i external -nn -X -s 1600 port 1433 andhost 139.212.96.2tcpdump: listening on external 21:48:41.295546 139.212.96.2.1201 > 10.75.9.44.1433: .302192826:302192827(1) ack 558871968 win 64360 (DF) 0x0000 012c 0800 4500 0029 38cf 4000 7f06c3b2 .,..E..)8.@.....0x0010 8bd4 6002 0a4b 092c 04b1 0599 120318ba ..`..K.,........0x0020 214f b5a0 5010 fb68 a926 000000 !O..P..h.&...21:48:41.296015 10.75.9.44.1433 > 139.212.96.2.1201: . ack1 win 64636 (DF)0x0000 012c 0800 4500 0028 cb2d4000 7f063155 .,..E..(.-@...1U0x0010 0a4b 092c 8bd4 6002 0599 04b1 214fb5a0 .K.,..`.....!O..0x0020 1203 18bb 5010 fc7c a812 0000 00000000 ....P..|........0x0030 0000 .. 21:48:50.701130 139.212.96.2.1206 > 10.75.9.44.1433: .304974934:304974935(1) ack 565108263 win 64882 (DF)0x0000 012c 0800 4500 0029 38f7 4000 7f06c38a .,..E..)8.@.....0x0010 8bd4 6002 0a4b 092c 04b6 0599 122d8c56 ..`..K.,.....-.V0x0020 21ae de27 5010 fd72 0a6b 000000 !..'P..r.k...21:48:50.702567 10.75.9.44.1433 > 139.212.96.2.1206: . ack1 win 65267 (DF)0x0000 012c 0800 4500 0028 d3a6 4000 7f0628dc .,..E..(..@...(.0x0010 0a4b 092c 8bd4 6002 0599 04b6 21aede27 .K.,..`.....!..'0x0020 122d 8c57 5010 fef3 08ea 0000 0000 0000 .-.WP...........0x0030 0000 ..举例2:对internal接口主机172.31.230.53和172.31.230.51之间端口8080的流量进行分组捕获。
文档维护人: 杨云邮箱:yangyun@版权所有 侵权必究 2013年12月上海网宿科技股份有限公司扎实稳健,和谐融洽 志存高远,厚积薄发tcpdump 使用说明---通过tcpdump 手机抓包说明版本修订记录(项目)目录1.背景 (4)2.抓包准备 (4)3.抓包步骤 (4)1.背景本文档介绍如何利用tcpdump工具在手机上抓包。
2.抓包准备(1)安卓手机root。
(2)platform-tools工具包。
将工具包解压到文件夹,本文档解压到F:\android。
(3)Tcpdump软件(获取地址/android/tcpdump)。
3.抓包步骤1. 将Android手机与电脑USB相连,打开USB调试。
打开windows命令提示符窗口,进入adb工具目录F:\android,在PC上把tcpdump软件也拷贝到F:\android目录下。
2. 将tcpdump程序copy至android手机(该命令前面那个目录文件为本地地址,后面那个目录为目的手机端地址)f:\android>adb push tcpdump /data/tcpdumpTips: 若此方法提示错误,可以先将tcpdump工具复制到SD卡上,再通过R.E文件管理工具,将tcpdump复制到/data目录下。
3. 进入root权限,修改tcpdump的权限进入/data目录,将tpcdump文件改成可执行权限才能抓包。
f:\android>adb shellshell@android:/ $ su在运行su指令后,手机终端桌面会出现相应提示信息以确认您对root操作的认可。
shell@android:/ # cd /datashell@android:/data # chmod 777 ./tcpdump4. 运行tcpdump,输入以下命令启动抓包。
shell@android:/data # ./tcpdump -nn -XX -vv -s 0 -w test.pcap5.执行完成后在命令提示符窗口执行Ctrl+C中断抓包进程6.将抓包结果复制至本地(前面那个目录为手机端地址,后面那个目录为本地地址)f:\android>adb pull /data/test.pcap f:/7. 使用Wireshark等工具查看抓包文件test.pcapC:\Windows\system32>d:D:\>cd d:/androidd:\android>adb shellshell@Coolpad8297-W01:/ $ susuroot@Coolpad8297-W01:/ # cd /datacd /dataroot@Coolpad8297-W01:/data # chmod 777 ./tcpdumpchmod 777 ./tcpdumproot@Coolpad8297-W01:/data # ./tcpdump -nn -XX -vv -s 0 -w test.pcap./tcpdump -nn -XX -vv -s 0 -w test.pcaptcpdump: WARNING: arptype 530 not supported by libpcap - falling back to cooked sockettcpdump: listening on rmnet0, link-type LINUX_SLL (Linux cooked), capture size 6 5535 bytes^Ct 2001d:\android>adb pull /data/test.pcap d:/error:d:\android>adb pull /data/test.pcap d:/failed to copy '/data/test.pcap' to 'd://test.pcap': Permission deniedd:\android>adb shellshell@Coolpad8297-W01:/ $ rootroot/system/bin/sh: root: not found127|shell@Coolpad8297-W01:/ $ susuroot@Coolpad8297-W01:/ # cd /datacd /dataroot@Coolpad8297-W01:/data # chmod 777 ./tcpdumpchmod 777 ./tcpdumproot@Coolpad8297-W01:/data # ./tcpdump -nn -XX -vv -s 0 -w test.pcap./tcpdump -nn -XX -vv -s 0 -w test.pcaptcpdump: WARNING: arptype 530 not supported by libpcap - falling back to cooked sockettcpdump: listening on rmnet0, link-type LINUX_SLL (Linux cooked), capture size 6 5535 bytes^Ct 562d:\android>adb pull /data/test.pcap d:/failed to copy '/data/test.pcap' to 'd://test.pcap': Permission deniedd:\android>adb pull /data/test.pcap d:/failed to copy '/data/test.pcap' to 'd://test.pcap': Permission deniedd:\android>adb shellshell@Coolpad8297-W01:/ $ susuroot@Coolpad8297-W01:/ # cd /datacd /dataroot@Coolpad8297-W01:/data # chmod 755 ./test.pcapchmod 755 ./test.pcaproot@Coolpad8297-W01:/data # ./tcpdump -nn -XX -vv -s 0 -w test.pcap./tcpdump -nn -XX -vv -s 0 -w test.pcaptcpdump: WARNING: arptype 530 not supported by libpcap - falling back to cooked sockettcpdump: listening on rmnet0, link-type LINUX_SLL (Linux cooked), capture size 6 5535 bytes^Ct 99d:\android>adb pull /data/test.pcap d:/1028 KB/s (36864 bytes in 0.035s) d:\android。
TCPDUMP中文手册名称(NAME)tcpdump-转储网络上的数据流总览(SYNOPSIS)tcpdump[-adeflnNOpqStvx][-ccount][-Ffile][-iinterface][-rfile][-ssnaplen][-Ttype][-wfile][expression]描述(DESCRIPTION)Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限. 对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限. 对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.对于BSD:你必须有/dev/bpf*的读访问权限.选项(OPTIONS)-a试着把网络和广播地址转换成名称.-c当收到count报文后退出.-d把编译好的报文匹配模板(packet-matchingcode)翻译成可读形式,传往标准输出,然后退出.-dd把报文匹配模板(packet-matchingcode)以C程序片断的形式输出.-ddd把报文匹配模板(packet-matchingcode)以十进制数形式输出(前面加上总数).-e每行都显示链路层报头.-f用数字形式显示'外部的'互联网地址,而不是字符形式(这个选项用来绕开脑壳坏光的SUN黄页服务器的问题---一般说来它翻译外部网络数字地址的时候会长期挂起).-F把file的内容用作过滤表达式.忽略命令行上的表达式.-i监听interface.如果不指定接口,tcpdump在系统的接口清单中,寻找号码最小,已经配置好的接口(loopback除外).选中的时候会中断连接.-l行缓冲标准输出.可用于捕捉数据的同时查看数据.例如,``tcpdump-l|teedat''or``tcpdump-l>dat&tail-fdat''.-n别把地址转换成名字(就是说,主机地址,端口号等)-N不显示主机名字中的域名部分.例如,如果使用这个选项,tcpdump只显示``nic'',而不是``''.-O禁止运行报文匹配模板的优化器.只有当你怀疑优化器有bug时才有用.-p禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而处于promiscuous模式;因此,'-p'不能作为`etherhost{local-hw-addr}或etherbroadcast'的简写.-q快速输出.显示较少的协议信息,输出行会短一点点.-r从file中读入数据报(文件是用-w选项创建的).如果file是``-'',就读标准输入.-s从每个报文中截取snaplen字节的数据,而不是缺省的68(如果是SunOS的NIT,最小值是96).68个字节适用于IP,ICMP,TCP和UDP,但是有可能截掉名字服务器和NFS报文的协议信息(见下面).输出时如果指定``[|proto]'',tcpdump可以指出那些捕捉量过小的数据报,这里的proto是截断发生处的协议层名称.注意,采用更大的捕捉范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢失.你应该把snaplen设的尽量小,只要能够容纳你需要的协议信息就可以了.-T把通过"expression"挑选出来的报文解释成指定的type.目前已知的类型有:rpc(远程过程调用RemoteProcedureCall),rtp(实时应用协议Real-TimeApplicationsprotocol),rtcp(实时应用控制协议Real-TimeApplicationscontrolprotocol),vat(可视音频工具VisualAudioTool),和wb(分布式白板distributedWhiteBoard).-S显示绝对的,而不是相对的TCP序列号.-t禁止显示时戳标志.-tt显示未格式化的时戳标志.-v(稍微多一点)繁琐的输出.例如,显示IP数据报中的生存周期和服务类型.-vv更繁琐的输出.例如,显示NFS应答报文的附加域.-w把原始报文存进file,而不是分析和显示.它们可以以后用-r选项显示.如果file是``-'',就写往标准输出.-x以16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.expression用来选择要转储的数据报.如果没有指定expression,就转储网络的全部报文.否则,只转储相对expression为`true'的数据报.expression一个或多个原语(primitive)组成.原语通常由一个标识(id,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:type类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,`hostfoo',`net128.3',`port20'.如果不指定类型修饰子,就使用缺省的host.dir方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识).可以使用的方向有src,dst,srcordst和srcanddst.例如,`srcfoo',`dstnet128.3',`srcordstportftp-data'.如果不指定方向修饰子,就使用缺省的srcordst.对于`null'链路层(就是说象slip之类的点到点协议),用inbound和outbound修饰子指定所需的传输方向.proto协议修饰子要求匹配指定的协议.可以使用的协议有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc,mopdl,tcp和udp.例如,`ethersrcfoo',`arpnet128.3',`tcpport21'.如果不指定协议修饰子,就使用所有符合类型的协议.例如,`srcfoo'指`(ip或arp或rarp)srcfoo'(注意后者不符合语法),`netbar'指`(ip或arp或rarp)netbar',`port53'指`(tcp或udp)port53'.[`fddi'实际上是`ether'的别名;分析器把它们视为``用在指定网络接口上的数据链路层.''FDDI 报头包含类似于以太协议的源目地址,而且通常包含类似于以太协议的报文类型,因此你可以过滤FDDI域,就象分析以太协议一样.FDDI报头也包含其他域,但是你不能在过滤器表达式里显式描述.]作为上述的补充,有一些特殊的`原语'关键字,它们不同于上面的模式:gateway,broadcast,less,greater和数学表达式.这些在后面有叙述.更复杂的过滤器表达式可以通过and,or和not连接原语来组建.例如,`hostfooandnotportftpandnotportftp-data'.为了少敲点键,可以忽略相同的修饰子.例如,`tcpdstportftporftp-dataordomain'实际上就是`tcpdstportftportcpdstportftp-dataortcpdstportdomain'.允许的原语有:dsthosthost如果报文中IP的目的地址域是host,则逻辑为真.host既可以是地址,也可以是主机名. srchosthost如果报文中IP的源地址域是host,则逻辑为真.hosthost如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:iphosthost它等价于:etherproto\ipandhosthost如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.etherdstehost如果报文的以太目的地址是ehost,则逻辑为真.Ehost既可以是名字(/etc/ethers里有),也可以是数字(有关数字格式另见ethers(3N)).ethersrcehost如果报文的以太源地址是ehost,则逻辑为真.etherhostehost如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.gatewayhost如果报文把host当做网关,则逻辑为真.也就是说,报文的以太源或目的地址是host,但是IP的源目地址都不是host.host必须是个主机名,而且必须存在/etc/hosts和/etc/ethers中.(一个等价的表达式是etherhostehostandnothosthost对于host/ehost,它既可以是名字,也可以是数字.)dstnetnet如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存在/etc/networks中),也可以是网络号.(详见networks(4)).srcnetnet如果报文的IP源地址属于网络号net,则逻辑为真.netnet如果报文的IP源地址或目的地址属于网络号net,则逻辑为真.netnetmaskmask如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.netnet/len如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len.本原语可以用src或dst修饰.dstportport如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一个数字,也可以是/etc/services中说明过的名字(参看tcp(4P)和udp(4P)).如果使用名字,则检查端口号和协议.如果使用数字,或者有二义的名字,则只检查端口号(例如,dstport513将显示tcp/login的数据和udp/who的数据,而portdomain将显示tcp/domain和udp/domain的数据).srcportport如果报文的源端口号是port,则逻辑为真.portport如果报文的源端口或目的端口是port,则逻辑为真.上述的任意一个端口表达式都可以用关键字tcp或udp做前缀,就象:tcpsrcportport它只匹配源端口是port的TCP报文.lesslength如果报文的长度小于等于length,则逻辑为真.它等同于:len<=length.greaterlength如果报文的长度大于等于length,则逻辑为真.它等同于:len>=length.ipprotoprotocol如果报文是IP数据报(参见ip(4P)),其内容的协议类型是protocol,则逻辑为真.Protocol可以是数字,也可以是下列名称中的一个:icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键字,所以必须用反斜杠(\)转义,在C-shell中应该是\\.etherbroadcast如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.ipbroadcast如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.ethermulticast如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可选的.这实际上是`ether[0]&1!=0'的简写.ipmulticast如果报文是IP多目传送报文,则逻辑为真.etherprotoprotocol如果报文协议属于以太类型的protocol,则逻辑为真.Protocol可以是数字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是关键字,所以必须用反斜杠(\)转义.[如果是FDDI(例如,`fddiprotocolarp'),协议标识来自802.2逻辑链路控制(LLC)报头,它通常位于FDDI报头的顶层.当根据协议标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头用的是SNAP格式.]decnetsrchost如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是``10.123'',或者是DECNET主机名.[只有配置成运行DECNET的Ultrix系统支持DECNET主机名.]decnetdsthost如果DECNET的目的地址是host,则逻辑为真.decnethosthost如果DECNET的源地址或目的地址是host,则逻辑为真.ip,arp,rarp,decnet是:etherprotop的简写形式,其中p为上述协议的一种.lat,moprc,mopdl是:etherprotop的简写形式,其中p为上述协议的一种.注意tcpdump目前不知道如何分析这些协议. tcp,udp,icmp是:ipprotop的简写形式,其中p为上述协议的一种.exprrelopexpr如果这个关系成立,则逻辑为真,其中relop是>,<,>=,<=,=,!=之一,expr是数学表达式,由常整数(标准C语法形式),普通的二进制运算符[+,-,*,/,&,|],一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数据,使用下面的语法:proto[expr:size]Proto是ether,fddi,ip,arp,rarp,tcp,udp,oricmp之一,同时也指出了下标操作的协议层.expr给出字节单位的偏移量,该偏移量相对于指定的协议层.Size是可选项,指出感兴趣的字节数;它可以是1,2,4,缺省为1字节.由关键字len给出的长度运算符指明报文的长度.例如,`ether[0]&1!=0'捕捉所有的多目传送报文.表达式`ip[0]&0xf!=5'捕捉所有带可选域的IP 报文.表达式`ip[6:2]&0x1fff=0'只捕捉未分片和片偏移为0的数据报.这种检查隐含在tcp和udp下标操作中.例如,tcp[0]一定是TCP报头的第一个字节,而不是其中某个IP片的第一个字节.原语可以用下述方法结合使用:园括弧括起来的原语和操作符(园括弧在Shell中有专用,所以必须转义).取反操作(`!'or`not').连结操作(`&&'or`and').或操作(`||'or`or').取反操作有最高优先级.或操作和连结操作有相同的优先级,运算时从左到右结合.注意连结操作需要显式的and算符,而不是并列放置.如果给出标识符,但没给关键字,那么暗指最近使用的关键字.例如,nothostvsandace作为nothostvsandhostace的简写形式,不应该和not(hostvsorace)混淆.表达式参数可以作为单个参数传给tcpdump,也可以作为复合参数,后者更方便一些.一般说来,如果表达式包含Shell元字符(metacharacter),传递单个括起来的参数要容易一些.复合参数在被解析前用空格联接一起.示例(EXAMPLES)显示所有进出sundown的报文:tcpdumphostsundown显示helios和主机hot,ace之间的报文传送:tcpdumphostheliosand\(hotorace\)显示ace和除了helios以外的所有主机的IP报文:tcpdumpiphostaceandnothelios显示本地的主机和Berkeley的主机之间的网络数据:tcpdumpnetucb-ether显示所有通过网关snup的ftp报文(注意这个表达式被单引号括起,防止shell解释园括弧):tcpdump'gatewaysnupand(portftporftp-data)'显示既不是来自本地主机,也不是传往本地主机的网络数据(如果你把网关通往某个其他网络,这个做法将不会把数据发往你的本地网络).tcpdumpipandnotnetlocalnet显示每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中有一个远程主机.tcpdump'tcp[13]&3!=0andnotsrcanddstnetlocalnet'显示经过网关snup中大于576字节的IP数据报:tcpdump'gatewaysnupandip[2:2]>576'显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播或多目传送形式传送的:tcpdump'ether[0]&1=0andip[16]>=224'显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):tcpdump'icmp[0]!=8andicmp[0]!=0"输出格式(OUTPUTformAT)tcpdump的输出格式取决于协议.下面的描述给出大多数格式的简要说明和范例.链路层报头(LinkLevelHeaders)如果给出'-e'选项就显示链路层报头.在以太网上,显示报文的源目地址,协议和报文长度.在FDDI网络上,'-e'选项导致tcpdump显示出`帧控制(framecontrol)'域,源目地址和报文长度.(`帧控制'域负责解释其余的报文.普通报文(比如说载有IP数据报)是`异步'报文,优先级介于0到7;例如,`async4'.这些被认为载有802.2逻辑链路控制(LLC)报文;如果它们不是ISO数据报或者所谓的SNAP报文,就显示出LLC报头.(注意:以下描述中假设你熟悉RFC-1144中说明的SLIP压缩算法.)在SLIP链路上,tcpdump显示出方向指示(``I''指inbound,``O''指outbound),报文类型和压缩信息.首先显示的是报文类型.有三种类型ip,utcp和ctcp.对于ip报文不再显示更多的链路信息.对于TCP报文,在类型后面显示连接标识.如果报文是压缩过的,就显示出编码的报头.特殊情形以*S+n和*SA+n的形式显示,这里的n是顺序号(或顺序号及其确认)发生的改变总和.如果不是特殊情形,就显示0或多少个改变.改变由U(urgentpointer),W(window),A(ack),S(sequencenumber)和I(packetID)指明,后跟一个变化量(+nor-n),或另一个值(=n).最后显示报文中的数据总和,以及压缩报头的长度.例如,下面一行显示了一个传出的压缩的TCP报文,有一个隐含的连接标识;确认(ack)的变化量是6,顺序号是49,报文ID是6;有三个字节的数据和六个字节的压缩报头:Octcp*A+6S+49I+63(6)ARP/RARP报文Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里是一个简单的例子,来自主机rtsg到主机csam的'rlogin'开始部分:arpwho-hascsamtellrtsgarpreplycsamis-atCSAM第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写).如果用tcpdump-n看上去要清楚一些:arpwho-has128.3.254.6tell128.3.254.68arpreply128.3.254.6is-at02:07:01:00:01:c4如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的:RTSGBroadcast080664:arpwho-hascsamtellrtsgCSAMRTSG080664:arpreplycsamis-atCSAM这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为16进制数0806(类型ETHER_ARP),报文全长64字节.TCP报文(注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协议,无论是本文还是tcpdump都对你用处不大)一般说来tcp协议的输出格式是:src>dst:flagsdata-seqnoackwindowurgentoptionsSrc和dst是源目IP地址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或单独的`.'(无标志),或者是它们的组合.Data-seqno说明了本报文中的数据在流序号中的位置(见下例).Ack是在这条连接上信源机希望下一个接收的字节的流序号(sequencenumber).Window是在这条连接上信源机接收缓冲区的字节大小.Urg表明报文内是`紧急(urgent)'数据.Options是tcp可选报头,用尖括号括起(例如,).Src,dst和flags肯定存在.其他域依据报文的tcp报头内容,只输出有必要的部分.下面是从主机rtsgrlogin到主机csam的开始部分.rtsg.1023>csam.login:S768512:768512(0)win4096csam.login>rtsg.1023:S947648:947648(0)ack768513win4096rtsg.1023>csam.login:.ack1win4096rtsg.1023>csam.login:P1:2(1)ack1win4096csam.login>rtsg.1023:.ack2win4096rtsg.1023>csam.login:P2:21(19)ack1win4096csam.login>rtsg.1023:P1:2(1)ack21win4077csam.login>rtsg.1023:P2:3(1)ack21win4077urg1csam.login>rtsg.1023:P3:4(1)ack21win4077urg1第一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了SYN标志.报文的流序号是768512,没有数据.(这个写成`first:last(nbytes)',意思是`从流序号first到last,不包括last,有nbytes字节的用户数据'.)此时没有捎带确认(piggy-backedack),有效的接收窗口是4096字节,有一个最大段大小(max-segment-size)的选项,请求设置mss为1024字节. Csam用类似的形式应答,只是增加了一个对rtsgSYN的捎带确认.然后Rtsg确认csam的SYN.`.'意味着没有设置标志.这个报文不包含数据,因此也就没有数据的流序号.注意这个确认流序号是一个小整数(1).当tcpdump第一次发现一个tcp会话时,它显示报文携带的流序号.在随后收到的报文里,它显示当前报文和最初那个报文的流序号之差.这意味着从第一个报文开始,以后的流序号可以理解成数据流中的相对位移asrelativebytepositionsintheconversation'sdatastream(withthefirstdatabyteeachdirectionbeing`1').`-S'选项能够改变这个特性,直接显示原始的流序号.在第六行,rtsg传给csam19个字节的数据(字节2到20).报文中设置了PUSH标志.第七行csam 表明它收到了rtsg的数据,字节序号是21,但不包括第21个字节.显然大多数数据在socket的缓冲区内,因为csam的接收窗口收到的数据小于19个字节.同时csam向rtsg发送了一个字节的数据.第八和第九行显示csam发送了两个字节的紧急数据到rtsg.如果捕捉区设置的过小,以至于tcpdump不能捕捉到完整的TCP报头,tcpdump会尽可能的翻译已捕获的部分,然后显示``[|tcp]'',表明无法翻译其余部分.如果报头包含一个伪造的选项(onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump显示``[badopt]''并且不再翻译其他选项部分(因为它不可能判断出从哪儿开始).如果报头长度表明存在选项,但是IP 数据报长度不够,不可能真的保存选项,tcpdump就显示``[badhdrlength]''.UDP报文UDP格式就象这个rwho报文显示的:actinide.who>broadcast.who:udp84就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广播地址的who 端口.报文包含84字节的用户数据.某些UDP服务能够识别出来(从源目端口号上),因而显示出更高层的协议信息.特别是域名服务请求(RFC-1034/1035)和NFS的RPC调用(RFC-1050).UDP域名服务请求(NameServerRequests)(注意:以下的描述中假设你熟悉RFC-1035说明的域名服务协议.如果你不熟悉这个协议,下面的内容就象是天书.)域名服务请求的格式是src>dst:idop?flagsqtypeqclassname(len)h2opolo.1538>helios.domain:3+A?.(37)主机h2opolo访问helios上的域名服务,询问和.关联的地址记录(qtype=A).查询号是`3'.`+'表明设置了递归请求标志.查询长度是37字节,不包括UDP和IP头.查询操作是普通的Query操作,因此op域可以忽略.如果op设置成其他什么东西,它应该显示在`3'和`+'之间.类似的,qclass是普通的C_IN类型,也被忽略了.其他类型的qclass应该在`A'后面显示. Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个查询包含回答,名字服务或管理机构部分,就把ancount,nscount,或arcount显示成`[na]',`[nn]'或`[nau]',这里的n代表相应的数量.如果在第二和第三字节中,任何一个回答位(AA,RA或rcode)或任何一个`必须为零'的位被置位,就显示`[b2&3=x]',这里的x是报头第二和第三字节的16进制数.UDP名字服务回答名字服务回答的格式是src>dst:idoprcodeflagsa/n/autypeclassdata(len)helios.domain>h2opolo.1538:33/3/7A128.32.137.3(273)helios.domain>h2opolo.1537:2NXDomain*0/1/0(97)第一个例子里,helios回答了h2opolo发出的标识为3的询问,一共是3个回答记录,3个名字服务记录和7个管理结构记录.第一个回答纪录的类型是A(地址),数据是internet地址128.32.137.3.回答的全长为273字节,不包括UDP和IP报头.作为A记录的class(C_IN)可以忽略op(询问)和rcode(NoError).在第二个例子里,helios对标识为2的询问作出域名不存在(NXDomain)的回答,没有回答记录,一个名字服务记录,而且没有管理结构.`*'表明设置了权威回答(authoritativeanswer).由于没有回答记录,这里就不显示type,class和data.其他标志字符可以显示为`-'(没有设置递归有效(RA))和`|'(设置消息截短(TC)).如果`问题'部分没有有效的内容,就显示`[nq]'.注意名字服务的询问和回答一般说来比较大,68字节的snaplen可能无法捕捉到足够的报文内容.如果你的确在研究名字服务的情况,可以使用-s选项增大捕捉缓冲区.`-s128'应该效果不错了.NFS请求和响应SunNFS(网络文件系统)的请求和响应显示格式是:src.xid>dst.nfs:lenopargssrc.nfs>dst.xid:replystatlenopresultssushi.6709>wrl.nfs:112readlinkfh21,24/10.73165wrl.nfs>sushi.6709:replyok40readlink"../var"sushi.201b>wrl.nfs:144lookupfh9,74/4096.6878"xcolors"wrl.nfs>sushi.201b:replyok128lookupfh9,74/4134.3150在第一行,主机sushi向wrl发送号码为6709的交易会话(注意源主机后面的数字是交易号,不是端口).这项请求长112字节,不包括UDP和IP报头.在文件句柄(fh)21,24/10.731657119上执行readlink(读取符号连接)操作.(如果运气不错,就象这种情况,文件句柄可以依次翻译成主次设备号,i节点号,和事件号(generationnumber).)Wrl回答`ok'和连接的内容.在第三行,sushi请求wrl在目录文件9,74/4096.6878中查找`xcolors'.注意数据的打印格式取决于操作类型.格式应该是可以自我说明的.给出-v(verbose)选项可以显示附加信息.例如:sushi.1372a>wrl.nfs:148readfh21,11/12.1958192bytes@24576wrl.nfs>sushi.1372a:replyok1472readREG100664ids417/0sz29388(-v同时使它显示IP报头的TTL,ID,和分片域,在这个例子里把它们省略了.)在第一行,sushi 请求wrl从文件21,11/12.195的偏移位置24576开始,读取8192字节.Wrl回答`ok';第二行显示的报文是应答的第一个分片,因此只有1472字节(其余数据在后续的分片中传过来,但由于这些分片里没有NFS甚至UDP报头,因此根据所使用的过滤器表达式,有可能不显示).-v选项还会显示一些文件属性(它们作为文件数据的附带部分传回来):文件类型(普通文件``REG''),存取模式(八进制数),uid和gid,以及文件大小.如果再给一个-v选项(-vv),还能显示更多的细节.注意NFS请求的数据量非常大,除非增加snaplen,否则很多细节无法显示.试一试`-s192'选项.NFS应答报文没有明确标明RPC操作.因此tcpdump保留有``近来的''请求记录,根据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析.KIPAppletalk(UDP上的DDP)AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所有的UDP 报头信息).文件/etc/s用来把appletalk网络和节点号翻译成名字.这个文件的行格式是numbername1.254ether16.1icsd-net1.254.110ace前两行给出了appletalk的网络名称.第三行给出某个主机的名字(主机和网络依据第三组数字区分-网络号一定是两组数字,主机号一定是三组数字.)号码和名字用空白符(空格或tab)隔开./etc/s文件可以包含空行或注释行(以`#'开始的行).Appletalk地址按这个格式显示net.host.port144.1.209.2>icsd-net.112.220office.2>icsd-net.112.220jssmag.149.235>icsd-net.2(如果不存在/etc/s,或者里面缺少有效项目,就以数字形式显示地址.)第一个例子里,网络144.1的209节点的NBP(DDP端口2)向网络icsd的112节点的220端口发送数据.第二行和上面一样,只是知道了源节点的全称(`office').第三行是从网络jssmag的149节点的235端口向icsd-net的NBP端口广播(注意广播地址(255)隐含在无主机号的网络名字中-所以在/etc/s中区分节点名和网络名是个好主意).Tcpdump可以翻译NBP(名字联结协议)和A TP(Appletalk交互协议)的报文内容.其他协议只转储协议名称(或号码,如果还没给这个协议注册名称)和报文大小.NBP报文的输出格式就象下面的例子:icsd-net.112.220>jssmag.2:nbp-lkup190:"=:LaserWriter@*"jssmag.209.2>icsd-net.112.220:nbp-reply190:"RM1140:LaserWriter@*"250techpit.2>icsd-net.112.220:nbp-reply190:"techpit:LaserWriter@*"186第一行是网络icsd的112主机在网络jssmag上的广播,对名字laserwriter做名字查询请求.名字查询请求的nbp标识号是190.第二行显示的是对这个请求的回答(注意它们有同样的标识号),主机jssmag.209表示在它的250端口注册了一个laserwriter的资源,名字是"RM1140".第三行是这个请求的其他回答,主机techpit的186端口有laserwriter注册的"techpit".ATP报文格式如下例所示:jssmag.209.165>helios.132:atp-req12266<0-7>0xae030001helios.132>jssmag.209.165:atp-resp12266:0(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:1(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:2(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:4(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:6(512)0xae040000helios.132>jssmag.209.165:atp-resp*12266:7(512)0xae040000jssmag.209.165>helios.132:atp-req12266<3,5>0xae030001helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000jssmag.209.165>helios.132:atp-rel12266<0-7>0xae030001jssmag.209.133>helios.132:atp-req*12267<0-7>0xae030002Jssmag.209向主机helios发起12266号交易,请求8个报文(`<0-7>').行尾的十六进制数是请求中`userdata'域的值.。