关于如何创建静态 ipv6 但带有通告前缀的问题已经在这里被问过了(解决方案似乎是设置令牌),但我想确切了解我的设置中发生了什么。
我的系统本身使用 NetworkManager,但我想通过 ifupdown 来实现更改。我创建了一个 /etc/network/interfaces 文件,其配置如下
自动 wlp2s0 允许热插拔 wlp2s0
iface wlp2s0 inet dhcp
iface wlp2s0 inet6 自动
地址::be70:f1ic:a1a1:d502/64
accept_ra 2私钥 0
创建此文件后,当我启动networking
守护程序时,wlp2s0 接口会添加两个地址,一个global dynamic mngtmpaddr
和一个global dynamic mngtmpaddr noprefixroute
(除了原始地址之外,还包括全局动态地址、一个隐私扩展地址和一个链接地址),这两个地址都没有我想要修复的前缀。此外,在这个阶段我无法访问互联网(实际上,似乎现有连接仍在运行,而新连接无法建立)。
如果我重新启动系统(我相信重新启动 NetworkManager 可能就足够了,但不确定),我的无线适配器甚至无法启动(wlp2s0 接口保持关闭状态,没有载波)。
现在,我的问题是:
我知道做我想要做的事情的正确方法是使用令牌,但为什么我的配置没有修复 IP 来具有我的后缀?
为什么我会获得两个新地址,一个带有
noprefixroute
,一个不带有,而不是只有一个?为什么重新启动内核会杀死界面?
我非常感谢您的见解!
因为 ifupdown 中没有逻辑或代码可以识别
address ::foo/64
为“仅将后缀与已公布的前缀组合”。它建立在一个非常基本的文字替换系统上,它所做的只是ip -6 addr add %address% dev %iface%
使用您指定的参数进行调用。请记住,ifupdown本身没有“网络守护进程”——它所做的只是一次性配置内核以接收 SLAAC(每个
accept_ra 2
),此后的任何 SLAAC 通告处理都由内核决定——这意味着 ifupdown 本身对正在通告哪些前缀一无所知。因此,即使它有识别::foo
地址定义的逻辑,它唯一能做的就是在内核的 SLAAC 客户端中配置“接口令牌”。(并且,您告诉内核始终使用带有 SLAAC 公布的前缀的指定后缀的方法是……通过配置“接口令牌”。确实如此。)
可能是因为您现在同时拥有内核(accept_ra=2)和NetworkManager 来接收路由器通告,因此它们都接收 RA,并且它们都彼此独立地从通告的前缀中获取地址。
去检查 NetworkManager 日志。您可能有 NetworkManager 插件可以读取 ifupdown 配置,因此它现在使用 /etc/network/interfaces 中定义的配置文件而不是原始连接配置文件,并且 a) 它拒绝
::foo
作为接口地址,因此它甚至不会尝试启动配置文件,或者 b) 配置文件没有要连接的 SSID,因此它不可能启动它。