Skip to the content.

Ipv6

24 Oct 2023 - joy717

ipv6

开启内核参数 sysctl -w net.ipv6.conf.all.forwarding=1

IPv6 地址段解释

IPv6 一共128位(bits),分8个段,每个段有16位。用16进制表示,一个16进制可以代表4个位,因此每个段有4个16进制数,即FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF

”公网ip“ - 可聚合全局单播地址 Aggregatable Global Unicast Address

前缀以固定001开头。即2xxx::/3 或者3xxx::/3

”私有ip" - 唯一本地地址 Unique Local Address

固定前缀FC00::/7,即前7位固定为1111 110。 第8位如果设置了,代表了本地地址。即实际分成2个ip块。 FC00::/8 以及FD00::/8。

FC00::/8 目前没有被使用(not defined from wikipedia)

实际有用的ip块为 FD00::/8

前缀为FE80::/10,11-64位全为0,最后64位为接口标识(或者称为接口id,一般为EUI-64)。一般是将48位的mac地址按一定算法转换成64位的接口id,该id具有本地链路唯一性。

用于自动地址配置、邻居发现、路由器发现等机制中。

EUI-64算法

将 48位的mac地址,拆成24位与24位,在这中间插入FFFE一共16位,组成64位。由于mac地址的第7位,1代表本地管理,0代表全球管理。而EUI-64定义刚好相反,1为全球管理,0位本地。因此最后还需要将第7位取反,得到最终的EUI-64。

组播地址与请求节点组播地址与组播的mac地址

ipv4使用广播方式查找mac地址,ipv6弃用广播方式,采用单播,组播(即分组形式)等方式,减少消耗,提高性能。

组播地址,固定前缀为FFxx::/8,即前8位固定为1。内置的各种组播地址参考底下链接组播相关内容的图片。

请求节点组播地址,基于ip生成,固定前缀FF02::1:FF00:0/104,后面24位由v6 ip的后24位填充。这样可以定向的给这个节点发送数据。

组播的mac地址,前80位由组播地址前80位组成,81-96位固定为3333(16进制表示),后32位,由组播地址的后32位补充。 即 组播前80位:3333:xxxx:xxxx

具体可参考: https://blog.51cto.com/u_7658423/1337745

其他

IPv6 可以不需要通过dhcp获取ip地址,还可以使用无状态地址配置的方式,通过交换机返回的信息,结合本机生成IPv6地址

参考资料

https://zhuanlan.zhihu.com/p/425805018 https://zhuanlan.zhihu.com/p/382612295

其他

IPv6网卡配置

# 修改/etc/sysconfig/network,设置
NETWORKING_IPV6=yes
IPV6_AUTOCONF=no

# 给网卡ifcfg配置文件添加配置

IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6_DEFROUTE=yes
IPV6ADDR=FD00::1000:10/64
IPV6_DEFAULTGW=FD00::1

#之后重启网络
systemctl restart network

如果不设置上面这个的话,当机器上有多张网卡,需要配置多个ipv6段的时候,会导致多出来很多路由

原因是/etc/rc.d/init.d/network 会调用/etc/sysconfig/network-scripts/init.ipv6-global start pre,这边会调整网卡的一些内核参数,比如net.ipv6.conf.eth0.accept_ra,这会导致接收到ra(router advertisement)的信息,从而配置了一些错误的配置(因为我们这边希望的是静态的配置,不需要接收ra信息)。 如果只是给网卡设置IPV6_AUTOCONF=no 并没有效果(怀疑是bug?),需要在/etc/sysconfig/network内设置全局的配置。

网卡配置ifcfg字段详细说明

# 如果是v6,需要修改/etc/sysconfig/network,设置
NETWORKING_IPV6=yes
IPV6_AUTOCONF=no
#k8s需要开启v6的forwarding内核参数,如果此配置未指定的话,会导致network报错(虽然显示为ERROR,实际似乎没任何影响)
IPV6FORWARDING=yes

#如果需要指定默认路由所在的网卡,需要设置此项。同时网卡的ifcfg配置内IPV6_DEFAULTGW不能包含网卡名称的配置
#IPV6_DEFAULTDEV=eth1


# ifcfg网卡配置文件

#需要修改为相应网卡名称
DEVICE=br_eth0 
#需要修改为相应网卡名称
NAME=br_eth0
TYPE=Bridge
ONBOOT=yes
#一般持久化网卡配置的时候,这边要修改一下,一般设置为static或者none。 实际文档帮助内容:`bootp`或者`dhcp`则使用dhcp,除此之外的值都被当做静态配置。但有些脚本依赖于static,建议还是用static
BOOTPROTO=static
#v6, 需要设置为Yes
IPV6INIT=yes
#v6,因为要手动指定ip,故此应该设置为no
IPV6_AUTOCONF=no
DELAY=5
STP=no
#是否为v4的默认网关,如果非默认网关,设置为no
DEFROUTE=yes
#v4,ip
IPADDR=192.168.1.125
#v4,掩码
NETMASK=255.255.255.0
#v4,网关
GATEWAY=192.168.1.1
#v6,是否开启dhcp
DHCPV6C=no
#v6, 如果是默认网卡,设置为yes,若不是,设置为no。然而,实际验证,这个配置似乎没有效果
IPV6_DEFROUTE=yes
#v6,ip
IPV6ADDR=FD00::4000:10/100
#v6,网关,也可以加网卡名称配置上来,如:IPV6_DEFAULTGW=FD00::4000:1%eth0
IPV6_DEFAULTGW=FD00::4000:1
IPV6_FAILURE_FATAL=no
IPV4_FAILURE_FATAL=no

配置示例,未包含说明

# 修改/etc/sysconfig/network,设置
NETWORKING_IPV6=yes
IPV6_AUTOCONF=no
IPV6FORWARDING=yes

#IPV6_DEFAULTDEV=eth1

# ifcfg网卡配置文件
DEVICE=br_eth0
NAME=br_eth0
TYPE=Bridge
ONBOOT=yes
BOOTPROTO=static
IPV6INIT=yes
IPV6_AUTOCONF=no
DELAY=5
STP=no
DEFROUTE=yes
IPADDR=192.168.1.125
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DHCPV6C=no
IPV6_DEFROUTE=yes
IPV6ADDR=FD00::4000:10/100
IPV6_DEFAULTGW=FD00::4000:1
IPV6_FAILURE_FATAL=no
IPV4_FAILURE_FATAL=no

如何使配置生效

对于network管理的系统(比如c76),

systemctl restart network
# 或者
ifdown eth0
ifup eth0 

对于NetworkManager管理的(比如kylin),使用nmcli命令

# 重新加载配置
nmcli c reload
# 重启connection
nmcli c down eth0
nmcli c up eth0

# 重启所有interface
nmcli n off; nmcli n on
#nmcli n off
#nmcli n on

NetworkManager有2个概念。

一个是device,相当于是“硬件”网卡设备。(也包含虚拟网卡)。

一个是connection。connection类似电脑/手机上常见的wifi管理中的某个网络。

一个device可以有多个connection,但同时只能有一个激活的connection。

类似一台笔记本,里面的网卡硬件是固定的(device固定),但是这台笔记本,可以有n个wifi信号网络,在家里连home名称信号的wifi网络,在公司连office名称信号的wifi网络。

这个"home"、“office”的wifi网络,就是一个connection。而这张物理网卡,同一时间,只能连一个wifi网络。