Ubuntu 17.10无法禁用SLAAC:始终存在两个动态地址
解决Ubuntu 17.10无法禁用SLAAC、出现双动态IPv6地址的问题
我之前在Ubuntu 17.10上也碰到过一模一样的情况——没装NetworkManager,/etc/network/interfaces里只有回环配置,但网卡还是自动生成两个动态IPv6地址,SLAAC怎么关都没用。后来发现是systemd-networkd在后台接管了网络配置,这是Ubuntu 17.10默认的网络管理工具之一,很容易被忽略。
下面是我亲测有效的解决步骤:
第一步:确认网络管理工具与接口名
首先先确认你的系统正在用systemd-networkd管理网络,同时找到目标网卡的接口名:
- 执行
networkctl status,查看输出里的网络接口状态,确认是否由systemd-networkd托管 - 执行
ip link show,记下你的网卡接口名(比如eth0、ens33之类的)
第二步:配置systemd-networkd禁用SLAAC
systemd-networkd会默认对未配置的接口启用SLAAC,所以我们需要给目标网卡创建专属配置文件:
- 创建配置文件(把
eth0替换成你的接口名):sudo nano /etc/systemd/network/20-eth0.network - 写入以下配置内容:
[Match] Name=eth0 # 这里一定要替换成你的实际接口名 [Network] IPv6Autoconfig=no # 直接禁用SLAAC自动配置 IPv6AcceptRA=no # 拒绝路由器通告(RA会触发SLAAC地址生成) # 如果需要静态IPv6地址,取消下面一行的注释并修改为你的地址 # Address=2001:db8::123/64 - 保存文件后,重启systemd-networkd服务让配置生效:
sudo systemctl restart systemd-networkd
第三步:用sysctl加固配置(可选但推荐)
为了彻底防止SLAAC生效,我们可以通过sysctl参数全局或针对单个接口禁用自动配置:
- 创建sysctl配置文件:
sudo nano /etc/sysctl.d/99-disable-slaac.conf - 写入以下内容(同样替换
eth0为你的接口名):# 全局禁用IPv6自动配置 net.ipv6.conf.all.autoconf=0 net.ipv6.conf.all.accept_ra=0 # 针对目标接口单独禁用 net.ipv6.conf.eth0.autoconf=0 net.ipv6.conf.eth0.accept_ra=0 - 生效配置:
sudo sysctl --system
验证结果
执行以下命令检查IPv6地址列表,确认动态SLAAC地址已经消失:
ip -6 addr show eth0
如果还有问题,可以查看systemd-networkd的日志排查错误:
journalctl -u systemd-networkd -f
内容的提问来源于stack exchange,提问作者Seolh
相关产品推荐
相关产品推荐

