IPv6的世界里,如果DHCP6和SLACC这两位大佬都为没有为可怜的网卡分配IP地址,也没有人为网卡设置静态的IP地址,系统就会为网卡计算一个IPv6的网址来。这样的网址只能在本地使用,不得路由,所以,被称为“link-local address”,译作“本地联网地址”。

其方法是在特殊的网段fe80::/64内,利用网卡的MAC地址拼凑一个64位的地址,放在fe80::/64后,组成一个128位的本地联网地址。

IPv6的本地联网地址计算方法详解-LMLPHP

本地的主机之间可以使用这个地址通信。首先,我们来看一看这个地址如何计算。

第1步:找到网卡的MAC地址

# nmcli con show
# nmcli con show eth0


第2步:将MAC地址转换成二进制

oschina.net就有在线转换工具:https://tool.oschina.net/hexconvert/

比如说,找到的16进制的MAC地址是:00:11:22:aa:bb:cc,去掉中间间隔的冒号后,提交转换成2进制得到一个长度为37位的字串:

1000100100010101010101011101111001100

IPv6的本地联网地址计算方法详解-LMLPHP

第3步:将第7位进行0-1互换

将37位的字串补齐为48位,得到如下字串:

000000000001000100100010101010101011101111001100

蓝色为补齐的数字。将第7位数字进行0-1互换,即如果是0,就换成1;如果是1,就换成0。于是得到如下48位字串,其中紫色的那个1就是互换的结果:

000000100001000100100010101010101011101111001100

第4步:再转换成16进制

将上一步得到的48位字串再转换成16进制数字,得到如下结果:

IPv6的本地联网地址计算方法详解-LMLPHP

得到的结果是:21122aabbcc

第5步:插入ff:fe

在上述结果的中间位置插入ff:fe。21122aabbcc,原来是MAC地址,是12位,如今只剩下11位,需要加0补全,于是得到的结果是:021122aabbcc。再将ff:fe插到中间位置,再写成4个字符一组的模式,如下:

0211:22ff:feaa:bbcc

第6步:加上前面64位

在前面加上64位地址:fe80::/64得到的地址就是IPv6本地链接地址,可以用来在本地网络中通信,即:

fe80::211:22ff:feaa:bbcc

如果要与这个IPv6地址通信,需要带上其网卡的连接id(connection id),也就是使用nmcli con show看到的那个id,如下图所示:

IPv6的本地联网地址计算方法详解-LMLPHP

所上图所示,nmcli con show的界面上,第一列的NAME就是connection id。使用nmcli con show eth0,看到的详细情况中,这个eth0又被称为"连接id"。在这一点上,nmcli处理的不好,同一属性,两种查法中,却使用了不同的名字,让人费解。好了,现在就来试试这个计算出来的IPv6本地联网地址吧!

# ping6 fe80::211:22ff:feaa:bbcc%eth0
# ssh root@fe80::211:22ff:feaa:bbcc%eth0

参考:

https://tools.ietf.org/html/rfc4291#appendix-A

https://tool.oschina.net/hexconvert/

12-10 10:37