常见用法:tcpdump -i eth0 -nn -s0 -v tcp port 80
一般参数
-x/-xx/-X/-XX: 以十六进制显示包内容,几个选项只有细微的差别,详见man手册
-A: 以ASCII编码打印每个报文(不包括链路层的头)
-a: 将网络地址和广播地址转变成名字
-c<数据包数目>: 在收到指定的包的数目后,tcpdump就会停止
-C:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
-D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
-e:在输出行打印出数据链路层的头部信息;
-f:将外部的Internet地址以数字的形式打印出来;
-F<表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
-l:如果没有使用 -w 选项,就可以将报文打印到 标准输出终端(此时这是默认);
-q:快速输出,仅列出少数的传输协议信息;
-r<数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生);
-S:用绝对而非相对数值列出TCP关联数;
-t:在输出的每一行不打印时间戳;
-tt:在输出的每一行显示未经格式化的时间戳记;
-T<数据包类型>:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议);
-w<数据包文件>:直接将包写入文件中,并不分析和打印出来;
常用表达式
多条件时可以用括号,但是要用 非 : ! or “not” (去掉双引号)
且 : && or “and”
或 : || or “or”
Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。
当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。
如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。
arp / tcp / udp / ip / icmp
单个 n 表示不解析域名,直接显示 IP;两个 n 表示不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
例如,
53端口 是 DNS服务器开放的端口,主要用于域名解析. 53端口的名字一般是 domain
使用-n 时, dns请求显示为 " Local_IP.xxxx > Route_IP.domain "
使用-nn时, dns请求显示为 " Local_IP.xxxx > Route_IP.53 "
tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。linux 2.2 内核及之后的版本支持 any 网卡,用于指代任意网卡
tcpdump -i eth0
端口过滤器,表示仅抓取 80 端口上的流量,通常是 HTTP
tcpdump port 80
使用 -v,-vv 和 -vvv 来显示更多的详细信息,通常会显示更多与特定协议相关的信息。
tcpdump -i <网卡> udp [src|dst] port 53 //抓取dns解析包
抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据:
tcpdump -i en0 host 10.37.63.255
抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信
tcpdump host 10.37.63.255 and \(10.37.63.61 or 10.37.63.95 \)
抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包
tcpdump -n host 10.37.63.255 and ! 10.37.63.61
抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包
tcpdump ip -n host 10.37.63.255 and ! 10.37.63.61
抓取主机10.37.63.3发送的所有数据
tcpdump -i en0 src host 10.37.63.3 (注意数据流向)
抓取主机10.37.63.3接收的所有数据:
tcpdump -i en0 dst host 10.37.63.3 (注意数据流向)
抓取主机10.37.63.3所有在TCP 80端口的数据包:
tcpdump -i en0 host 10.37.63.3 and tcp port 80
抓取HTTP主机10.37.63.3在80端口接收到的数据包
tcpdump -i en0 host 10.37.63.3 and dst port 80