简介
这篇文章主要讲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协议的时候再说明。