tcpdump的使用

tcpdump - dump traffic on a network

1. tcpdump概述

Tcpdump打印出与布尔表达式匹配的网络接口上数据包内容的描述;在描述之前有一个时间戳,默认情况下打印为小时、分钟、秒和自午夜以来的几分之一秒。

它还可以与:

  • -w标志一起运行,这将导致它将包数据保存到文件中以便以后分析,或者与
  • -r标志一起运行,这将导致它从保存的包文件中读取,而不是从网络接口读取包。它还可以使用
  • -V标志运行,这将导致它读取保存的包文件列表。

在所有情况下,只有匹配表达式的包才会被tcpdump处理。

当tcpdump完成捕获数据包时,它将报告以下计数:

  • 数据包“捕获”(tcpdump接收和处理的数据包数量)
  • “接收数据包过滤”(这取决于运行tcpdump的操作系统配置的方式,如果在命令行上指定一个过滤器,在一些操作系统方面包无论他们被筛选器表达式匹配,即使他们被筛选器表达式匹配,无论tcpdump读取和处理他们,在其他操作系统上,它只计数与过滤表达式匹配的包,而不管tcpdump是否已经读取和处理了它们;在其他操作系统上,它只计数与过滤表达式匹配并由tcpdump处理的包)
  • 数据包“被内核丢弃”(这是tcpdump运行的操作系统中,如果操作系统将该信息报告给应用程序,则该操作系统中的包捕获机制由于缓冲区空间不足而丢弃的数据包数量;如果不是,则报告为0)。

从网络接口读取数据包可能要求您具有特权;有关详细信息,请参见pcap (3PCAP)手册页。读取保存的包文件不需要特殊特权。

2. 常用命令参数

2.1. 网络接口查询和指定(-D、-L、-i)

// -D 打印系统可被tcpdump进行包捕获的网络接口
tcpdump -D
// -L 接口链路类型
tcpdump -L
// -i interface 指定网络接口名称或者ID(由—D输出)
tcpdump -i

tips: 针对Mac系统,网络包监听需要指定网络接口

On Darwin systems version 13 or later, when the interface is unspecified, tcpdump will use a pseudo interface to capture pack- ets on a set of interfaces determined by the kernel (excludes by default loopback and tunnel interfaces).

tcpdump -i pktap,lo0,en0

2.2. 输出格式(-f、-n、-nn )

// -f 数字形式打印IP地址,非符号化
tcpdump -f 
// 主机地址不做名称转换
tcpdump -n
// 协议和端口都做数字显示
tcpdump -nn

2.3. 快捷统计数据包流向(-q )

// -q 单行简单输出,忽略tcp协议等相关详细信息(方便统计数据包流向)
tcpdump -i eth0 -q
tcpdump -i1 --time-stamp-precision=nano

2.4. TCP包明细(-S )

// -S ,ISN不做相对偏移,做绝对数据输出

sudo tcpdump -i lo0 -nn -S port 2000

2.5. 输出捕获信息到文件、读取、缓存区等(-w、-r、-l)

// -l 让输出内容被写入缓冲区,方便管道处理
tcpdump -l |tee /tmp/tcpdump.log
tcpdump -l > /tmp/tcpdump-2.log & tail -f /tmp/tcpdump-2.log

3. 命令详解

3.1. 基本参数

-c count 累计抓多少包
-n 不转换地址为名字(host、port等)
-w file 抓的包内容写入文件,后续分析
-r file 从文件读取包内容进行分析,也支持标准数据输出流
-l 让输出内容被写入缓冲区,方便管道处理(tcpdump -l |tee /tmp/tcpdump.log ,或者 sudo tcpdump -l > /tmp/tcpdump-2.log & tail -f /tmp/tcpdump-2.log)
-# 打印序号
-Q expression 查询表达式的包(Apple专属)
-q 少量信息输出,更少的协议相关内容(仅含源、目标、端口、协议名、传输数据大小)
-s 每个数据包的数据字节数,而不是默认为65535字节
-k 通过arg参数选定包的meta数据
    I     interface name (or interface ID)
    N     process name
    P     process ID
    S     service class
    D     direction
    C     comment
    C     flags
    U     process UUID (not shown by default)
    A     display all types of metadata
-E IPsec ESP packets,解密
-F file 过滤表达式文件,此时附加命令行表达式被忽略
-D 列出可用网络接口
-i interface 指定网络接口
-L 列出数据连接类型(RAW、PKTAP、DOCSIS、EN10MB)
-C size 过了size就,新开保存文件,基于-w file文件名后加number
-G rotate_seconds 每隔N秒,写入指定文件,然后新开文件(-w 文件需要含strftime信息,否则被文件被重复覆盖)
-W 限定创建文件的数量,可以与-C或者-G结合使用
-e 打印链路层的信息
-f 数字形式打印IP地址,非符号化
-g 在verbose模式下不换号打印
-H Attempt to detect 802.11s draft mesh headers.
-S 打印绝对的TCP sequence number序列化
--immediate-mode 包来了立即处理,而非通过更高效的缓存处理(在打印,非-w保存文件下,默认采用的)
--packet-buffered 将来的包缓存住输出(用于解析包内容分析等)
--monitor-mode (仅wiki+特定操作系统支持)

3.2. 时间格式 & 详细输出

-t n (n为0~5),即以下规则:
-t 禁止时间戳打印(IP)
-tt 时间戳打印(默认为时间打印:1544510801.190547 IP) 
-ttt 小数点仅微秒部分打印 :  00:00:00.408187 IP
-tttt 年月日+时间打印 :2018-12-11 14:47:58.970458 IP
--time-stamp-precision 读取转换时间格式(nano和micro)

-v 详细输出
-vv 更详细输出
-vvv 超详输出
-x 解析和打印(包头+16进制的包体内容),内容主要是链路层的信息
-xx 含链接层头,解析和打印
-X 解析和打印包,包含16进制以及ASII格式,每个包内容(非常有用分析内容)
-XX 含链接层头,解析和打印

-d dump 包内容为人可读形式
-dd dump c程序框架
-ddd dump包为10进制数

4. expression过滤表达式例子 (man pcap-filter)

4.1. 5.1 选择tcp包、特定主机、特定端口

tcpdump host 10.40.2.181
tcpdump host helios and \( hot or ace \)
tcpdump -nn 'host 10.40.2.181 and (port 80 or 443)'

4.2. 选择tcp包+特定主机

sudo tcpdump -nq tcp
sudo tcpdump -n -i en0 "tcp and host 10.40.2.181” # 查看到181的tcp,在en0上的连接,不做name解析

4.3. 5.3 TCP包结构查看

通过man tcpdump查看得到

5. 其他分析方式,和wireshark一起工作

  • 方式1,命令行粗略分析,当前IP流入和流程服务请求情况
  • 方式2,考虑利用-w将,IP记录包内容保存到文件,然后利用wireshark来导入分析