简介
这篇文章主要讲IPv6
单播地址的分配方法,其中涉及到一些协议的内容,后面会详细了解,这里有用到就简单提下
静态
手工配置全局可聚合地址或者本地链路地址
ip -6 addr add 2001:da8:207::9402/64 dev eth0
ip -6 addr add fe80::f8a8:daff:fe91:8637/64 dev eth0
地址形式是以FE80::/10
为前缀(注意不是网络前缀,网络前缀固定是64),11-64
位为0
加 一个64
位接口标识
动态
动态分配又分为无状态跟有状态,所谓的无状态其实指的是不用额外的去部署dhcp
服务。无状态的两种方式都基于ICMPv6
协议,有状态基于DHCPv6
协议。(注意前缀都是固定位64位)
无状态自动配置(SLAAC)
主要为两种
- 路由器主动发送
RA
报文,主机收到后用RA
中的前缀 - 主机主动发送
RS
请求报文,路由器收到后发送RA
报文,主机使用收到的RA
报文中的前缀
确保整个过程中做实验的主机下面两个配置项是打开的,具体意思可以见之前的总结文章
第一种
- 路由器用LinkLocal地址发起路由通告
RA
报文,报文中带着前缀信息 - 主机收到
RA
报文后,将前缀以及接口ID
结合,形成新地址 - 主机用新地址发起
DAD
(地址重复检测),如果没有重复,就使用该新地址(如果有重复,什么情况后面再结合内核代码分析)
模拟实验则是部署了radvd
的wsl
作为路由器,qemu
作为主机
实验开始前,wsl
网卡信息如下
qemu
网卡信息如下
wsl
上启动radvd
,然后进行抓包,具体radvd
的使用见前面的文章
启动后可以看到qemu
获得了ipv6
地址了
抓包文件上传于此链接
第二种
- 主机向链路发起路由请求
RS
报文,目的MAC
为ff02::2,是个组播地址,代表链路上的所有路由器 - 路由器收到请求后会返回路由通告
RA
报文 - 主机用新地址发起
DAD
(地址重复检测),如果没有重复,就使用该新地址
模拟实验则是rock3a
发起RS
请求,wsl
这边的eth1
网卡上设置radvd
服务。如果rock3a要发出RS请求,需要注意不能开启forwarding
选项,具体原因见此。
rock3a
这边可以用Linux
下的rdisc6
命令发出RS
请求,下载工具包ndisc6
-r
可以指定rs
发包次数,如果不指定,超时3次后,rdisc6
就不进行发包,这里指定1000次,开始发RS
请求,这时候我们来配置wsl
这边
rdisc6 eth0 -r 1000
wsl
这边配置radvd
服务,对/etc/radvd.conf
文件进行编辑
interface eth1 {
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
prefix 2001:db9:1234:5678::/64 {
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
RDNSS fd00:2020:2019::100 fd00:2020:2019::200 {
AdvRDNSSLifetime 300;
};
};
wsl
开启转发并且开启radvd
服务
sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo /etc/init.d/radvd start
rock3a
这边可以看到收到RA
消息了
ifconfig
查看
然后也可以看到获取到了dns
相关信息
在rock3a
这边进行抓包,文件链接
从文件中可以看出rock3a
发出了RS
请求报文,收到wsl
这边的RA
报文后,对获取到的新地址进行NS
检测
有状态配置(DHCPv6)
参考之前我做过的实验,文章链接
参考链接
后话
其实这篇文章只是探讨了对地址的获取方式,其实对于网关,DNS
服务器得到获取方式也跟前面大同小异,这也跟ICMPv6
报文中的Mbit跟Obit相关,这个后续探讨NDP
协议的时候再说明。