tcpdump 异常错误

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

tcpdump 异常错误_第1张图片

如上所示,可以看到我的机器中所有可以抓包的网络接口。其中特殊接口 ​​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 序列号中字节数值长度是不一样的。
 

你可能感兴趣的:(综合,1024程序员节,改行学it)