tcpdump 进行抓包的时候,-w 提示 Permission denied:
sudo tcpdump -w test1.log
tcpdump: test1.log: Permission denied
开始以为是用户权限的问题,后来换用 root 账户还是不行,经搜索,是 AppArmor 的问题。
解决方案如下:
先查看当前的 tcpdump 的模式:
grep tcpdump /sys/kernel/security/apparmor/profiles
/usr/sbin/tcpdump (enforce)
上面显示是 enforce 模式,所以有这个问题,把它改成 complain 模式:
aa-complain /usr/sbin/tcpdump ------ This will change it to complain
再次使用 tcpdump 并写文件的时候就没问题了。
想在转换成 enforce 模式时:
aa-enforce /usr/sbin/tcpdump ----- This will renable the AppArmor profile for tcpdump
【注】 通过命令 aa-complain 或 aa-enforce 可以切换 profile 文件的状态。这需要先安装对应的 utils 工具: sudo apt-get install apparmor-utils
在抓包完成后,抓包的大小为0
一般的原因为磁盘满了,没有办法继续储存。
解决办法:
1、遇到该问题,先用df-h 命令,看一下磁盘的可用大小,排除是否为磁盘的原因
2、每次抓包在最后加一个参数,-v可以实时看到抓包大小的变化
在敲下命令,报错提示,No Space to left
这个问题的原因一般是inodes满了导致的
可以用df -i 命令,查看
安装tcpdump
用下面的命令检查一下是否已经安装了 tcpdump:
which tcpdump
这个截图就是没有安装tcpdump:
下面是安装了tcpdump的截图:
如果还没有安装 tcpdump,用如下命令安装 tcpdump:
sudo yum install -y tcpdump
tcpdump 依赖于 libpcap,该库文件用于捕获网络数据包。如果该库文件也没有安装,系统会根据依赖关系自动安装它。
用 tcpdump 抓包
使用 tcpdump 抓包,需要管理员权限,因此下面的示例中绝大多数命令都是以 sudo 开头。
首先,先用 tcpdump -D 命令列出可以抓包的网络接口:
sudo tcpdump -D
如上所示,可以看到我的机器中所有可以抓包的网络接口。其中特殊接口 any 可用于抓取所有活动的网络接口的数据包。
我们就用如下命令先对 any 接口进行抓包:
sudo tcpdump -i any
tcpdump 会持续抓包直到收到中断信号。你可以按 Ctrl+C 来停止抓包。正如上面示例所示,tcpdump 抓取了超过 10000 个数据包。在这个示例中,由于我是通过 ssh 连接到服务器,所以 tcpdump 也捕获了所有这类数据包。
-c 选项可以用于限制 tcpdump 抓包的数量:
sudo tcpdump -i any -c 3
如上所示,tcpdump 在抓取 3 个数据包后自动停止了抓包。这在有些场景中十分有用 —— 比如你只需要抓取少量的数据包用于分析。当我们需要使用过滤规则抓取特定的数据包(如下所示)时,-c 的作用就十分突出了。
在上面示例中,tcpdump 默认是将 IP 地址和端口号解析为对应的接口名以及服务协议名称。而通常在网络故障排查中,使用 IP 地址和端口号更便于分析问题;用 -n 选项显示 IP 地址,-nn 选项显示端口号:
sudo tcpdump -i any -c 3 -nn
理解抓取的报文
tcpdump 能够抓取并解码多种协议类型的数据报文,如 TCP、UDP、ICMP 等等。虽然这里我们不可能介绍所有的数据报文类型,但可以分析下 TCP 类型的数据报文,来帮助你入门。更多有关 tcpdump 的详细介绍可以参考其 帮助手册。tcpdump 抓取的 TCP 报文看起来如下:
12:43:24.047063 IP 202.106.2.140.22 > 202.106.2.116.52980: Flags [P.], seq 4020757562:4020757774, ack 1254862904, win 274, length 212
1列:12:43:24.047063 是该数据报文被抓取的系统本地时间戳。
2列:IP 是网络层协议类型,这里是 IPv4,如果是 IPv6 协议,该字段值是 IP6。
3列:202.106.2.140 是源 IP 地址和端口号 22
4列:202.106.2.116 是目的 IP 地址和端口号 52980
5列: TCP 报文标记段 Flags [P.]。该字段也可以是这些值的组合,例如 [S.] 代表 SYN-ACK 数据包。该字段通常取值如下:
值 | 标志类型 | 描述 |
S | SYN | Connection Start |
F | FIN | Connection Finish |
P | PUSH | Data push |
R | RST | Connection reset |
. | ACK | Acknowledgment |
6列:接下来是该数据包中数据的序列号。对于抓取的第一个数据包,该字段值是一个绝对数字,后续包使用相对数值,以便更容易查询跟踪。例如此处 seq 4020757562:4020757774代表该数据包包含该数据流的第 XX 到 XXX 字节。
7列:接下来是 ack 值:ack 1254862904。该数据包是数据发送方,ack 值为 XXX。在数据接收方,该字段代表数据流上的下一个预期字节数据。
8列:接下来字段是接收窗口大小 win 274,它表示接收缓冲区中可用的字节数,后跟 TCP 选项如 MSS(最大段大小)或者窗口比例值。更详尽的 TCP 协议内容请参考 Transmission Control Protocol(TCP) Parameters。
9列:length 212代表数据包有效载荷字节长度。这个长度和 seq 序列号中字节数值长度是不一样的。