使用tcpdump实现网络抓包
作为一名开发者,使用各种工具实现网络抓包是一项基本技能,通过网络抓包可以帮助开发者分析网络的连通性,检查http请求发送的数据,从而排查问题,目前在Linux系统下,tcpdump是最广泛使用的抓包工具,而在windows环境下的可选择的抓包工具则非常多,有wireshark,fidder等,本文主要介绍tcpdump。tcpdump使用libcap库来实现抓包。
tcpdump的命令格式
tcpdump的抓包命令格式如下:
tcpdump [option] [proto] [dir] [type]
- option: 可选参数
- proto:协议类过滤器,支持指定协议过滤,可选的协议包括tcp, udp, icmp, ip, ip6等
- dir:方向过滤器,根据数据包的来源过滤,包括src和dst两种
- type:可识别的关键词有:host, net, port, portrange等,这些词后边需要再接参数
常见的tcpdump抓包参数
设置不解析域名提升速度
- -n:不把IP转换为域名
- -nn:不把协议和端口号转化成名字
- -N:不打印host的域名部分
控制展示内容的详细程度
- -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。
- -vv:比-v更详细的输出
- -vvv:比-vv更详细的输出
指定网卡
- -i: 指定要过滤的网卡接口
显示控制
- -A: 以 ASCII 字符串打印报文的全部数据
- -X:以16进制和ASCII字符串打印报文的全部数据
读写文件
- -r:从pcap文件中读取数据
- -w:将抓到的数据包写入当中pcap文件当中
不进入网络混杂模式
- -p:不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。
指定抓取的数量
- -c:指定抓取多少个包就退出
指定截取的数据长度
- -s:tcpdump 默认只会截取前
96字节的内容,要想截取所有的报文内容,可以使用-s number,number就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
常见tcpdump的过滤条件
- 指定IP地址抓包
tcpdump host 192.168.10.50
-
区分源IP地址和目标IP地址
- 源IP地址:
tcpdump src host 192.168.10.50 - 目标IP地址:
tcpdump dst host 192.168.10.50
- 源IP地址:
-
指定端口抓包
tcpdump port 80
- 指定网段抓包
tcpdump net 192.168.10.0/24
- 指定协议版本抓包
tcpdump tcp
组合过滤器
过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/&& 、 或/OR/|| 和 非/not/!
而在单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面两个符号 判断相等/==,判断不相等/!=。当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断。
- if:表示网卡接口名
- proc:表示进程名
- pid:表示进程 id
- dir:表示方向,in 和 out
另外,当你在使用多个过滤器进行组合时,有可能需要用到括号,而括号在 shell 中是特殊符号,因为你需要使用引号将其包含。下面是一个复杂过滤条件的示例:
$ tcpdump "( if=en0 and proc =service ) || (if != en0 and dir=in)"
这条命令的含义是:抓取过滤来自进程名为 service 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包。