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 dat
或tcpdump -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.net
,net 198.56.238.193
,port 80
,portrange 6000-9999
。如果没有类型修饰符,默认是host
。 -
dir 目录:此类修饰符指明了一个特定传输的方向是 到 和/或 来自 id。可选的方向有
src, dst, src or dst, src and dst, addr1, addr2, addr3, addr4
。如果没有指定目录修饰符,默认是src or dst
。addr1, addr2, addr3, addr4
只用于IEEE 802.11 无线LAN链路层。 -
proto 协议:此类修饰符限定匹配特定的协议。可选的协议有
ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp udp
。例如,tcp port 80
,udp portrange 7000-9000
,wlan 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可以过滤 带前缀的地址么
比如
tcpdump net 192.168.64.0/24
这样的。
我本机的IP是 112.94.72.186,在我的VPS上执行 tcpdump net 112.94.72.0/24,能抓到包。过滤用 tcpdump net not 112.94.72.0/24,就抓不到。希望对你有用。多试试。
你好,博主,问一下,我手头有一些国外实验室采集到的流量数据集,是pcap格式的数据集,现在实验需要提取服务器到客户端之间双向传输的数据流,主要提取HTTP、SSH、DNS,我想问一下在Linux下使用Tcpdump如何过滤提取相应协议的流量。麻烦指点一下。
这个我也没搞过。从google的结果来看,tcpdump可以生成pcap格式的文件,但没有说可以直接分析这些文件。pcap的格式非常明确,你可以照着格式自己解析应该不难。