之前没了解过这个工具,遇到一个开发问题,需要查看NS和NA的行为,确保不会因为太频繁导致网络堵塞
【0】icmpv6的ns na rs ra报文
首先介绍一下icmpv6的ns na rs ra报文是干什么的?
😀上来让你抓包,首先需要知道这些包到底是什么
ICMPv6中的NS、NA、RS、RA是IPv6邻居发现协议(NDP)的四种核心报文类型,用于IPv6网络的地址解析、路由器发现等功能:
1. NS (Neighbor Solicitation - 邻居请求报文)
- 功能 :用于解析IPv6地址对应的链路层地址(类似IPv4的ARP请求)
- 用途 :
地址解析:查询某个IPv6地址对应的MAC地址
重复地址检测(DAD):检查自己想要使用的IPv6地址是否已被使用
邻居不可达检测(NUD):验证邻居是否仍然可达
发送方式 :通常以多播或单播形式发送
2. NA (Neighbor Advertisement - 邻居通告报文)
- 功能 :对NS报文的响应,通告自己的IPv6地址和链路层地址
- 用途 :
回应NS报文的地址解析请求
主动通告地址变化(如链路层地址改变时)
确认地址唯一性(DAD响应)
发送方式 :通常是单播回应NS,也可能在地址变更时多播通告
3. RS (Router Solicitation - 路由器请求报文)
- 功能 :主机启动时发送,请求路由器发送RA报文
- 用途 :
快速获取网络配置信息
在网络变化时触发路由器重新发送RA
发送方式 :发送到所有路由器多播地址(FF02::2)
4. RA (Router Advertisement - 路由器通告报文)
- 功能 :路由器周期性发送或响应RS,通告网络配置信息
- 用途 :
前缀信息:提供IPv6地址前缀供主机自动配置地址
默认网关信息:指定默认路由器
MTU大小:通告链路最大传输单元
跳数限制:建议的IPv6默认跳数
发送方式 :通常以多播形式发送到所有节点多播地址(FF02::1)
工作流程示例 :
-
主机启动后发送RS请求配置信息
-
路由器回应RA,提供前缀、默认网关等信息
-
主机使用前缀生成IPv6地址,然后发送NS进行DAD检测
-
如果没有冲突,主机设置地址;如果有其他节点已使用该地址,会回应NA冲突信息
-
当主机需要与其他IPv6节点通信时,发送NS查询目标的MAC地址
-
目标节点回应NA,提供MAC地址
-
通信建立后,主机会定期发送NS进行邻居可达性检测
这些报文共同构成了IPv6网络的基础发现和配置机制,替代了IPv4中的ARP协议和DHCP的部分功能。
【1】tcpdump基本介绍
TCPdump是一个功能强大的命令行网络数据包分析工具,主要用于在Linux和Unix系统上捕获和分析TCP/IP及其他网络协议的数据包。它常用于:
网络故障诊断和问题排查
网络安全审计和监控
网络流量分析和协议研究
应用程序调试和性能优化
【2】基本语法格式
tcpdump [选项] [过滤表达式]
【3】常用选项详解
1、接口与捕获选项
|---------|----------------------------------------|
| 选项 | 说明 |
| 网络接口 -i | 指定要监听的网络接口,如 -i eth0 、 -i enp1s0.1069 |
| 数量 -c | 限制捕获的数据包数量,如 -c 10 只捕获10个包 |
| 长度 -s | 设置数据包快照长度, -s 0 表示捕获完整数据包 |
| 文件名 -w | 将捕获的数据包保存到文件中(二进制格式),如 -w capture.pcap |
| 文件名 -r | 从保存的文件中读取数据包进行分析,如 -r capture.pcap |
2、显示格式选项
|-------|--------------------------------|
| -n | 不解析主机名,以IP地址显示,加快处理速度 |
| -nn | 不解析主机名和端口名称,以数字形式显示,如 -nn |
| -v | 详细输出模式,显示更多数据包信息 |
| -vv | 更详细的输出模式,显示完整的协议信息 |
| -A | 以ASCII格式显示数据包内容,适用于分析HTTP等文本协议 |
| -x | 以十六进制和ASCII格式显示数据包内容 |
| -e | 显示链路层头部信息,包括MAC地址 |
| -t | 不显示时间戳 |
| -tttt | 以可读的时间格式显示时间戳 |
【4】过滤表达式
1、基本过滤选项
|---------|--------------------------------------------------|
| 过滤类型 | 说明 |
| host | 基于主机名或IP地址过滤,如 host 192.168.1.1 |
| net | 基于网段过滤,如 net 192.168.0.0/24 |
| port | 基于端口号过滤,如 port 80 |
| src/dst | 基于源/目标地址/端口过滤,如 src host 192.168.1.1 dst port 80 |
| 协议名称 | 基于协议类型过滤,如 tcp 、 udp 、 icmp 、 icmp6 |
2、逻辑运算符
and 或 && :逻辑与
or 或 || :逻辑或
not 或 ! :逻辑非
3、特殊协议过滤
对于ICMPv6等特殊协议,使用更精确的过滤,如 过滤NS、NA、RS、RA、ping请求ping响应:
'icmp6 and (ip6[40] == 133 or ip6[40] == 134 or ip6[40] == 135 or ip6[40] == 136 or ip6[40] == 128 or ip6[40] == 129)' \
【5】使用示例
1、基础使用
抓取指定接口的所有流量:抓取eth0的所有流量:sudo tcpdump -i eth0
不解析主机名和端口,提高处理速度:sudo tcpdump -i eth0 -nn
限制捕获抓包数量:sudo tcpdump -i enp1s0.1069 -c 10
2、协议与端口过滤
捕获TCP协议的数据包:sudo tcpdump -i eth0 'tcp'
捕获HTTP流量,端口80:sudo tcpdump -i eth0 'port 80'
捕获多个端口的流量:sudo tcpdump -i eth0 'port 80 or port 443'
3、主机与地址过滤
捕获特定主机的流量:sudo tcpdump -i eth0 'host 192.168.1.1'
捕获从特定主机发出的流量:sudo tcpdump -i eth0 'src host 192.168.1.1'
捕获到特定主机的流量:sudo tcpdump -i eth0 'dst host 192.168.1.1'
4、ICMPv6相关过滤
捕获ICMPv6的邻居发现相关报文:sudo tcpdump -i enp1s0.1069 'icmp6 and (ip6[40] == 133 or ip6[40] == 134 or ip6[40] == 135 or ip6[40] == 136)' -nn -vv
- 133: Router Solicitation (RS) - 路由器请求
- 134: Router Advertisement (RA) - 路由器通告
- 135: Neighbor Solicitation (NS) - 邻居请求
- 136: Neighbor Advertisement (NA) - 邻居通告
- 128: Echo Request (ping请求)
- 129: Echo Reply (ping响应)
捕获ICMPv6的ping请求和响应:sudo tcpdump -i enp1s0.1069 'icmp6 and (ip6[40] == 128 or ip6[40] == 129)' -nn -vv
5、保存与读取捕获文件
将捕获的数据包保存到文件:sudo tcpdump -i eth0 -w capture.pcap
从文件中读取并过滤数据包:tcpdump -r capture.pcap 'host 192.168.1.1'
【6】数据包分析
标准tcpdump输出格式包含以下字段:
时间戳 协议 源地址.源端口 > 目标地址.目标端口: 标志 序列号 确认号 数据长度
对于ICMPv6报文,会显示类型、代码和相关信息
03:41:09.983272 IP6 (hlim 255, next-header ICMPv6 (58) payload length: 24) fe80::219:xxxx:xxxx:xxxx> fe80::xxxx:xxxx:xxxx:xxxx: [icmp6 sum ok] ICMP6, neighbor advertisement, length 24, tgt is fe80::219:xxxx:xxxx:xxxx, Flags [router, solicited]