tcpdump命令


转载:https://www.kancloud.cn/chunyu/php_basic_knowledge/2106518

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,而不是nic.ddn.mil
  • -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' 的 数据报。

expression s 由一个或多个 原语 (primitive) 组成, 原语是通常由一个标识 (id, 名称或数字), 和标识前面的一个或多个修饰子(qualifier) 组成。修饰子有三种不同的类型:

  1. type 限定符显示标识名称或数字所指的原语类型。可能的类型为 host、net 和 port。例如,“host foo”、“net 128.3”和“port 20”。如果没有类型限定符,那么将采用 host。
  2. dir 限定符指定到标识和/或来自标识的特定传输方向。可能的方向为 src、dst、src 或 dst 和 src 以及 dst。如果没有 dir 限定符,那么将采用 src 或 dst。对于某些链接层(例如,SLIP)和某些其他设备类型,入站和出站限定符可以用来指定希望的方向。
  3. proto 限定符限制与特定协议相匹配。可能的协议为 fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp 和 udp。如果没有 proto 限定符,那么将采用与该类型一致的所有协议。

`fddi` 实际上 是 `ether` 的 别名,分析器 把 它们 视为 "用在 指定 网络接口 上的 数据链路层",FDDI报头包含类似于以太协议的源目地址, 而且通常包含类似于以太协议的报文类型, 因此你可以过滤FDDI域, 就象分析以太协议 一样,FDDI 报头也包含其他域, 但是你不能在过滤器表达式里显式描述。

作为上述的补充, 有一些特殊的'原语' 关键字: gateway, broadcast, less, greater和数学表达式。 它们不同于上面的模式,这些在后面有叙述。

        更复杂的 过滤器表达式 可以 通过 and, or 和 not 连接 原语 来 组建. 例如 host foo and not port ftp and not port ftp-data, 为了少敲点键键盘,可以忽略相同的修饰子。 例如, tcp dst port ftp or ftp-data or domain 实际上 就是 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain

允许的原语有:

  • dst host host:如果报文中IP的目的地址域是host, 则逻辑为真。host既可以是地址, 也可以是主机名
  • src host host
    :如果报文中IP的源地址域是host,则逻辑为真。
  • host host:如果报文中IP的源地址域或者目的地址域是host,则逻辑为真,上面所有的host表达式都可以加上ip, arp, 或rarp关键字做前缀, 就象:ip host host,它等价于ether proto ip and host host ,如果host是拥有多个IP地址 的, 它的每个地址都会被查验
  • ether dst ehost:如果报文的以太目的地址是 ehost,则逻辑为真, Ehost既可以是名字 (/etc/ethers 里有), 也可以是 数字
  • ether src ehost:如果报文的以太源地址是ehost, 则逻辑为真
  • ether host ehost:如果报文的以太源地址或以太目的地址是ehost, 则逻辑为真
  • gateway host: 如果报文把host当做网关, 则逻辑为真。 也就是说,报文的以太源或目的地址是host, 但是IP的源目地址都不是host,host必须是个主机名,而且必须存在/etc/hosts/etc/ethers 中 (一个等价的表达式是ether host ehost and not host host 。对于 host / ehost, 它既可以是 名字, 也可以是 数字.)
  • dst net net:如果报文的IP目的地址属于网络号net, 则逻辑为真。 net既可以是名字 (存在 /etc/networks 中), 也可以是网络号
  • src net net:如果报文的IP源地址属于网络号net, 则逻辑为真
  • net net:如果报文的IP源地址或目的地址属于网络号net, 则逻辑为真
  • net net mask mask:如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真。 本原语可以用src或dst修饰
  • net net/len:如果IP地址匹配指定网络掩码的net,则逻辑为真。 掩码的有效位宽为len, 本原语可以用src或dst修饰
  • dst port port:如果报文是ip/tcp或ip/udp,并且目的端口是port, 则逻辑为真。 port是一个数字, 也可以是 /etc/services 中说明过的名字 (参看 tcp(4P) 和 udp(4P))。 如果使用名字, 则检查端口号和协议。 如果使用数字或者有歧义的名字,则只检查端口号 (例如, dst port 513 将显示 tcp/login 的数据 和 udp/who 的数据, 而 port domain 将显示 tcp/domain 和 udp/domain 的数据)
  • src port port:如果报文的源端口号是port,则逻辑为真
  • port port:如果报文的源端口或目的端口是port, 则逻辑为真。 上述的任意一个端口表达式都可以用关键字tcp或 udp做前缀, 就象:tcp src port port
    ,它只匹配源端口是port的TCP报文
  • less length:如果报文的长度小于等于length, 则逻辑为真。它等同于:len <= length
  • greater length:如果报文的长度大于等于length, 则逻辑为真。它等同于:len >= length
  • ip proto protocol:如果报文是IP数据报,其内容的协议类型是protocol, 则逻辑为真。 Protocol可以是数字, 也可以是下列名称中的: icmp, igrp, udp, nd, 或 tcp。 注意 这些 标识符 tcp, udp, 和 icmp 也是 关键字, 所以
    必须 用 反斜杠() 转义, 在 C-shell 中 应该是 \
  • ether broadcast:如果报文是以太广播报文, 则逻辑为真。 关键字ether是可选的
  • ip broadcast:如果报文是IP广播报文, 则逻辑为真。 Tcpdump检查全0和全1广播约定, 并且检查本地的子网掩码
  • ether multicast:如果报文是以太多目传送报文(multicast),则逻辑为真。 关键字ether是可选的。 这实际上 是 ether[0] & 1 != 0 的简写
  • ip multicast:如果报文是IP多目传送报文,则逻辑为真
  • ether proto protocol:如果信息包为 ether 类型协议,那么为 True。protocol 可以为数字或以下名称之一:ip、ip6、arp、rarp、atalk、aarp、decnet、sca、lat、mopdl、moprc、iso、stp、ipx 或 netbeui。请注意,这些标识也是关键字,并且必须通过反斜杠(\)进行转义。[如果是 FDDI (例如, `fddi protocol arp'), 协议
    标识 来自 802.2 逻辑链路控制(LLC)报头, 它 通常 位于 FDDI 报头 的 顶层. 当 根据 协议标识 过滤 报文 时, Tcpdump 假设 所有的 FDDI 报文 含有 LLC 报头, 而且 LLC 报头 用的是 SNAP 格式.]
  • decnet src host:如果DECNET的源地址是host, 则逻辑为真, 该主机地址的形式可能是 “10.123”, 或者是 DECNET主机名. [只有 配置成 运行 DECNET 的 Ultrix 系统 支持 DECNET 主机名.]
  • decnet dst host:如果 DECNET的目的地址是host, 则逻辑为真
  • decnet host host:如果DECNET的源地址或目的地址是host, 则逻辑为真
  • expr relop expr:如果关系成立,其中 relop 是 >、=、<=、= 和 != 中的一个,expr 是算术表达式,此算术表达式由整数常量(用标准 C 语法表示)、常规二目运算符 [+、-、*、/、& 和 |]、长度运算符和特殊信息包数据存取器组成,那么为 true。要访问信息包里的数据,请使用以下语法:proto [ expr : size ]
    • Proto 是 ether、fddi、tr、wlan、ppp、slip、link、ip、arp、rarp、tcp、udp、icmp 或 ip6 其中之一,并且表明索引操作的协议层。(ether、fddi、wlan、tr、ppp、slip 和 link 都称为链接层。)请注意,tcp、udp 和其他上层协议类型仅适用于 IPv4,而不是 IPv6(以后将对其进行修订)。与表明的协议层相关的字节偏移量由 expr 给定。size 为可选,它表明兴趣字段里的字节数;它可以为 1、2 或 4,缺省值为 1。由关键字 len 表示的长度运算符给定信息包的长度。
    • 例如,ether[0] & 1 != 0 捕获所有多点广播流量。表达式 ip[0] & 0xf !=5 捕获带有选项的所有 IP 信息包。表达式 ip[6:2] & 0x1fff = 0 仅捕获未分段的信息包和分段信息包的片段零。此检查隐式适用于 tcp 和 udp 索引操作。例如,tcp[0] 始终表示 TCP 标题的第一个字节,而从不表示插入片段的第一个字节

原语可以用下述方法结合使用:

  1. 圆括弧括起来的原语和操作符 (圆括弧在Shell中有专用, 所以必须转义).
  2. 取反操作 (! or not).
  3. 连结操作 (&& or and).
  4. 或操作 (|| or or).

取反操作有最高优先级, 或操作和and操作有相同的优先级, 运算时从左到右结合, 注意and操作需要显式的and算符,而不是并列放置。

如果给出了不带关键字的标识,那么假定使用最新的关键字。例如,not host vs and ace 是 not host vs and host ace 的缩略语,不应与 not ( host vs or ace ) 混淆。表达式自变量可作为单自变量或多自变量(选择两者中较方便的一种)传递给 tcpdump。通常,如果表达式包含 Shell 元字符,将其作为单个的、加引号的自变量来传递会更容易。多自变量在语法分析之前以空格并置

命令 解释
tcpdump -i eth1 监视指定网络接口的数据包
tcpdump tcp port 23 and host 210.27.48.1 监视指定主机和端口的数据包
tcpdump net ucb-ether 监听指定网络的数据包
tcpdump host 210.27.48.1 截获所有210.27.48.1 的主机收到的和发出的所有的数据包
tcpdump ip host ace and not helios 显示 ace 和 除了 helios 以外的 所有 主机 的 IP报文
tcpdump ip and not net localnet 显示 既不是 来自 本地主机, 也不是 传往 本地主机 的 网络数据
tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet' 显示 每个 TCP会话 的 起始 和 结束 报文 (SYN 和 FIN 报文), 而且 会话方 中 有一个 远程主机.
tcpdump 'gateway snup and ip[2:2] > 576' 显示 经过 网关 snup 中 大于 576 字节的 IP 数据报
// 实例一:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型  
(2)-i eth1 : 只抓经过接口eth1的包  
(3)-t : 不显示时间戳  
(4)-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包  
(5)-c 100 : 只抓取100个数据包  
(6)dst port ! 22 : 不抓取目标端口是22的数据包  
(7)src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24  
(8)-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析
// 实例二:使用tcpdump抓取HTTP包,0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854