TL; DR:本文简要介绍了 IPV6 自动配置的基本概念和原理,并讨论了在 Linux 下自动配置(aka. SLAAC)原理和坑点,其中:
启用 IPV6 SLAAC 并允许内核自动添加 IPV6 默认路由需要使 net.ipv6.conf.{iface}.autoconf = 1 且 net.ipv6.conf.{iface}.accept_ra = 1
如果启用了 net.ipv6.conf.{iface}.forwarding ,则对应网卡接口 accept_ra 需要为 2
上述 iface 既可以是 default/all,也可以是具体某个网卡接口,但是需要特别注意,对于部分 IPV6 配置项,仅修改 net.ipv6.conf.all 时不会应用到全部网卡接口,使用时请确认所需的网卡接口上配置正确。
另外在部分发行版中可能修改 accept_ra 实际不生效,系统可能出现预期外行为(无法自动获取的地址和路由,或配置为不需要 SLAAC 时系统仍会进行配置等),此时可检查系统中是否存在其他网络管理工具如 systemd-networkd 和 netplan 造成了影响。
背景:IPV6 和 SLAAC
讨论这个问题前需要先梳理几个 IPV6 有关的协议之间的关系,IPV6 基于功能强大的 ICMPv6,实现了“即插即用”的从地址到网关自动配置,当然如果愿意的话 IPV4 中的传统的配置方式,包括但不限于编辑 interface 文件、使用 iprouote2 等进行手动的地址和网关管理的方式,在 IPV6 中也可以使用的:
NDP:基于 ICMPv6 的一种 ARP 的替代协议,是 IPV6 自动配置的基础。
RS 和 RA:router solicitation 和 router advertisement,顾名思义是请求和下发路由器信息,通过 IPV6 组播实现,实际可下发的信息包括 IPV6 前缀、MTU、默认网关、有效时间等。
SLAAC:基于 NDP 的路由宣告,客户端可实现零配置接入 IPV6 网络,其中地址前缀通过 RA 获得,后缀通过 EUI64 从 MAC 地址直接生成(如果启用了 RFC 4941 SLAAC 隐私扩展则会在对外发起连接时使用临时生成的地址,此为后话),默认路由通过 RA 下发。
正常情况下,如果内核参数和网络环境配置正确,ip -6 route 可见一条 default via fe80::xxxx dev iface proto ra 的默认路由表项,
明确这些基本概念,接下来继续讨论 Linux 中 SLAAC 的实际配置和行为。
梳理:自动配置和内核参数
之所以有本文,是因为在实际使用中遇到了这样的现象:已知二层存在响应 NDP 的 IPV6 网关,子网内两台服务器都启用了 autoconf,其中一台 A 可以正常通过 SLAAC 获取地址并配置 IPV6 默认网关,另一台 B 没有正确获取到默认网关(实际上也没有正确地从 SLAAC 配置本地地址,起初并没有关注这个点)