理论
成功实现IPv6地址无状态自动配置的条件:
- 路由器要开启IPv6功能(华三设备默认开启,思科和华为默认关闭);
- 路由器的接口地址前缀的掩码只能为64位(因为EUI-64生成了后64位的接口标识符);
- 路由器的接口要能周期发送RA报文,需要通过命令手工激活周期发送RA报文。
无状态自动配置过程:
- 主机根据接口标识符自动产生链路本地地址;
- 主机发出NS邻居请求报文,对链路本地地址进行重复地址检测;
- 如果地址冲突,则停止自动配置,需要手工配置。
- 如果不冲突,链路本地地址生效,节点具备本地链路通信能力。
- 主机发送RS路由器请求报文(或接收到路由器定期发送的RA路由器公告报文);
- 根据RA报文中的前缀信息和通过EUI-64规范生成的接口标识符得到IPv6全球单播地址。
实验
搭建一个简单的拓扑验证一下。
首先,我们先尝试让R1的GE0/0/0接口自动产生链路本地地址:
#
interface GigabitEthernet0/0/0
ipv6 address auto link-local
#
查看IPv6接口地址信息,可以看到设备根据接口MAC地址生成了一个实验性IPv6本地链路地址(实验性表示还未进行地址冲突检测,因为R2的端口还没有开启)。
Q1:本地链路地址是怎么生成的?
A1:由FE80::/10结合EUI-64的接口标识符自动形成的。也可以手工指定,手工指定的前缀要固定为FE80::/10。
Q2:EUI-64是怎么生成地址的?
A2:把接口48比特的MAC地址转换为二进制表示:
- 将48比特的MAC地址对半分开,前后各24比特,然后在中间插入16比特的值FFFE,即二进制的值1111111111111110,使整个地址变成8段;
- 设置U/L位,把首个字节的第7比特取反,通常设置为1;
- 把地址转换回十六进制,每4位十六进制数字合并为一段,就得到了4段的十六进制接口标识符;
- 最终形成64比特的EUI-64接口标识符。
之所以需要把第7比特取反的主要原因是在单播MAC中,第7比特的U/L位和EU-64中第7比特U/L位的含义相反。在单播MAC中第7比特位为0表示U(表示由IEEE管理分配),而在EUI-64的第7比特位为1才表示U。
Q3:串行接口如何形成EUI-64?
A3:思科设备取设备第一个以太网接口的MAC进行EUI-64的转换和形成,会导致一个设备可能有多个接口的EUI-64接口标识一样,但是因为链路本地地址只在本地链路有效,所以不会产生冲突。而华三设备串行接口的IEEE EUI-64格式的接口标识符由设备随机生成。
以实验为例,查看接口MAC地址:
接口MAC地址为90E1-8EAF-0105,对半分并插入16比特值FFFE,即为90E1-8EFF-FEAF-0105。把首个字节(90)的第7比特取反,即0000 1001 0000 0000橙字部分取反,变为0000 1001 0000 0010,即16进制值92。最终生成EUI-64值为92E1-8EFF-FEAF-0105。最后添加前缀部分,即FE80:0000:0000:0000:92E1:8EFF:FEAF:0105,格式化为FE80::92E1:8EFF:FEAF:105即为链路本地地址。
根据要求,开启RA报文的周期性发送:
#
interface GigabitEthernet0/0/0
undo ipv6 nd ra halt
#
打开R2的端口,通过抓包可以看到路由器已经在周期性发送RA报文,并携带了ICMP扩展信息描述路由器优先级、接口的前缀信息、MTU、接口的MAC地址。
注意,此时发送的RA报文中并没有包含接口的前缀信息,是因为接口上只生成了链路本地地址,而没有配置一个IPv6的64位前缀地址。因此,主机不知道应该生成什么前缀的IPv6地址,还无法完成无状态自动配置。
进一步添加配置,为接口配置一个全球单播地址:
#
interface GigabitEthernet0/0/0
ipv6 address 2000::1000/64
#
再次抓包查看:
可以看到,此时RA报文携带了前缀信息2000::
注:当接口配置了IPv6全球单播地址后,同时会自动生成链路本地地址。且与采用ipv6 address auto link-local命令生成的链路本地地址相同。
此外,还需要在R2上通过命令开启无状态自动配置IPv6地址功能:
#
interface GigabitEthernet0/0/0
ipv6 address auto
#
在R2上查看接口信息,可以看到成功通过无状态自动配置获取到了一个IPv6地址:
可以看到,R2接口上自动配置的地址为2000::901C:4BFF:FEDB:205,是根据通过RA报文获取的前缀信息2000::/64与通过EUI-64生成的接口标识符结合而成。
R2的MAC地址:
来看一下完整的抓包信息(忽略主机验证链路本地地址的报文)
请求方发送RS路由器请求报文,请求路由信息:
接收方向请求方响应一个RA路由器公告报文,携带路由信息:
请求方根据路由信息,进行无状态自动配置,并对生成的地址进行重复地址检测:
无设备应答,即没有地址冲突,请求方组播发送,声明使用此报文:
总结
主机发送RS路由器请求报文(或接收到路由器定期发送的RA路由器公告报文),根据RA路由器公告报文中的前缀信息和通过EUI-64规范生成的接口标识符进行无状态自动配置,获得IPv6全球单播地址。
路由器的接口地址前缀的掩码只能为64位,且要能周期发送RA报文。