tcpdump

tcpdump是Linux内置的一个抓包工具,用于对网络上的数据包进行截获、分析的工具。

完整命令格式

       tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
               [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
               [ -W filecount ]
               [ -E spi@ipaddr algo:secret,...  ]
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]
               [ expression ]

常用选项

  • -A:以ASCII打印每个包(除去链路层的头),用于web页面抓包很方便。
  • -B buffer_size:设置操作系统用于抓包的缓存大小为buffer_size。
  • -c count:在接收到count个包后退出。
  • -C file_size:在写一个原始包到存储文件前,先检查当前文件是否大于 file_size,如果是,关闭当前存储文件并打开一个新的。第一个之后的存储文件的文件名将以 -w 标志指定的文件名后跟一个数字,开始于1,持续增长。file_size的单位是百万字节(1000000字节,而不是 1048576字节)。
  • -D:打印出系统当前可用的网络接口,tcpdump可用进行抓包的。
  • -e:在每一个转储行打印链路层的头。
  • -F expression-input-file:从指定输入文件读取过滤表达式。额外出现在命令行的表达式将被忽略。
  • -i interface:监听指定网络接口的数据包。如果不指定,tcpdump将搜索系统网络接口列表的第一个已配置接口(排除回环)。
  • -l:缓冲标准输出。在捕获的同时想查看数据很有用。如:tcpdump -l | tee dattcpdump -l > dat & tail -f dat
  • -n:不转换地址(如 主机地址,端口号等)到名字。
  • -t:在每一个转储行上输出时间戳。
  • -w output-file:把原始包写到输出文件,而不是过滤和打印(到标准输出)。如果输出文件为 - 则输出到标准输出。
  • -W file-count:与 -C选项一起时,用于限制文件的数量。
  • -x:在过滤和打印时,除了打印每个包的头,还以十六进制的形式打印每个包(出去链路层的头)的数据。
  • -X:在过滤和打印时,除了打印每个包的头,还以十六进制和ASCII的形式打印每个包(出去链路层的头)的数据。

表达式

表达式用于选择什么包才被转储。如果没有给出表达式,所有包都将被转储,否则,只有使表达式为 true 的包才被转储。

原语和原语组成

过滤表达式包含一个或多个原语。原语通常包含一个前缀有一个或多个修饰符的id(名字或数字)。有三种不同类型的修饰符:

  • type 类型:此类修饰符是说明id的名字或数字引用的事情类型。可选的类型有: host, net, port, portrange。如, host coderbee.netnet 198.56.238.193port 80portrange 6000-9999。如果没有类型修饰符,默认是 host

  • dir 目录:此类修饰符指明了一个特定传输的方向是 到 和/或 来自 id。可选的方向有 src, dst, src or dst, src and dst, addr1, addr2, addr3, addr4。如果没有指定目录修饰符,默认是 src or dstaddr1, addr2, addr3, addr4 只用于IEEE 802.11 无线LAN链路层。

  • proto 协议:此类修饰符限定匹配特定的协议。可选的协议有 ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp udp。例如,tcp port 80udp portrange 7000-9000wlan addr2 0:2:3:4:5:6。如果未指定协议修饰符,将假设是所有与 类型 一致的协议。

关系运算

表达式还可以进行关系运算: expr relop expr

repol 可以是 >, <, >=, <=, =, !=中的一个, expr是由整形常量、普通的二元运算符( +, -, *, /, &, |, <<, >>)、一个长度操作符和特定的包数据访问器 组成的数值表达式。注意,所有的比较都是无符号的。

为访问包内的数据,可以用表达式: proto[expr:size]

  • expr,是字节偏移,取决于给定的协议层。
  • size,可选的,用于指示感兴趣字段的字节数量,可以是 1, 2, 4。默认是 1。

长度操作符,用关键字 len 表示,给出包的长度。

原语操作符

原语还可以由 一组加括弧(小括号必须进行转义)的原语和操作符组成。

  • !not 表示否。
  • &&and 表示连接,是与。
  • ||or 表示选择,是或。

举例

在 venet0:0 网络接口 抓取 主机 coderbee.net 的 80 端口的包,并以ASCII编码打印包内容: tcpdump -A host coderbee.net and port 80 -i venet0:0

直接在网络上以十六进制和ACSII格式输出包: tcpdump host coderbee.net and port 80 -i venet0:0 -X

抓取HTTP报文: tcpdump -XvvennSs 0 -i venet0:0 –w filename tcp[20:2]=0x4745 or tcp[20:2]=0x4854 。测试发现没抓到包。

抓取指定主机之间、并排除特定主机的包: tcpdump host coderbee.net and \( 183.238.56.177 or 183.238.56.178 \) not 183.238.56.179

打印每个TCP会话的开始和结束包,并排除本机主机:tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

打印所有IPv4、去往80端口、包含数据的HTTP包, tcpdump 'tcp dst port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) !=0)' -Avv

tcpdump 要求对IP、TCP协议熟悉,对具体的帧的封装都要有深入了解,难度还是挺大的。网上提到的一般都是用tcpdump抓包,再用wireshark进行分析,这也是一个选择。不过对于简单的HTTP报文抓包还是挺方便的。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

tcpdump》上有4个想法

    • 我本机的IP是 112.94.72.186,在我的VPS上执行 tcpdump net 112.94.72.0/24,能抓到包。过滤用 tcpdump net not 112.94.72.0/24,就抓不到。希望对你有用。多试试。

  1. 你好,博主,问一下,我手头有一些国外实验室采集到的流量数据集,是pcap格式的数据集,现在实验需要提取服务器到客户端之间双向传输的数据流,主要提取HTTP、SSH、DNS,我想问一下在Linux下使用Tcpdump如何过滤提取相应协议的流量。麻烦指点一下。

    • 这个我也没搞过。从google的结果来看,tcpdump可以生成pcap格式的文件,但没有说可以直接分析这些文件。pcap的格式非常明确,你可以照着格式自己解析应该不难。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据