Ubuntu 24.04中Netplan配置accept-ra后无法启用IPv6 SLAAC的异常问题
嘿,这个问题确实有点反直觉,我来帮你捋清楚到底是怎么回事,以及怎么彻底解决:
先搞懂核心矛盾:静态IPv4下的accept_ra特殊逻辑
你可能不知道,当网卡配置了静态IPv4地址(就像你这里dhcp4: no+手动指定addresses),内核对accept_ra的生效条件会“升级”:默认情况下,这种场景下内核要求net.ipv6.conf.eno1.accept_ra的值为2,而不是常规的1才能接受RA报文、触发SLAAC地址分配。
你在Netplan里写的accept-ra: yes,对应的是内核参数accept_ra=1,刚好达不到静态IPv4场景下的要求,这就是为什么sysctl里显示0的核心原因——内核直接忽略了1的设置,强制降到了0来匹配静态IPv4的默认策略。
为啥ip -6 route show之后突然正常?
这个操作其实是触发了内核或systemd-networkd(你用的renderer是它)重新检测IPv6路由状态,相当于给了系统一个“唤醒”信号,让它绕过了当前accept_ra=0的限制,临时处理了RA报文并分配了地址。但这只是临时的,重启后肯定会回到原来的问题,而且accept_ra的值也不会真的变化。
彻底解决的步骤
1. 修正Netplan配置,强制设置accept_ra=2
打开你的Netplan配置文件/etc/netplan/01-network-manager-all.yaml,在eno1的配置块里添加sysctl项,手动指定内核参数为2:
network: version: 2 renderer: networkd ethernets: eno1: dhcp4: no addresses: [10.xx.xx.xx/24] routes: - to: default via: 10.xx.xx.xx nameservers: addresses: [10.xx.xx.xx, 10.xx.xx.xx] accept-ra: yes sysctl: net.ipv6.conf.eno1.accept_ra: 2
2. 重新应用配置并验证
执行下面的命令让配置生效,同时重启networkd服务确保没有残留状态:
sudo netplan generate && sudo netplan apply sudo systemctl restart systemd-networkd
然后检查内核参数:
sysctl net.ipv6.conf.eno1.accept_ra
这时候应该会显示2了,再看ip addr show eno1,正常情况下应该已经自动获取到IPv6 SLAAC地址了,不需要再跑那个玄学的路由命令。
额外要排查的点
- 确保没有其他配置覆盖
accept_ra:检查/etc/sysctl.d/目录下有没有.conf文件手动设置了net.ipv6.conf.eno1.accept_ra=0,有的话直接删掉或者改成2。 - 确认NetworkManager没抢接管网卡:你用的是
networkd作为renderer,所以要确保eno1没被NetworkManager盯上,执行sudo nmcli device status看eno1的状态是不是unmanaged,如果是managed的话,可能会和networkd的配置冲突,这时候要么在Netplan里明确禁用NetworkManager对该网卡的管理,要么切换成NetworkManager作为renderer。
这样应该就能彻底解决你的问题,不用再依赖那个临时的路由命令了!
备注:内容来源于stack exchange,提问作者杨笑波




