{#section path-to-node="3" pm-slice="0 0 []"}
导读: 当一台原本工作正常的 PC 突然有线断网,作为网络工程师,我们的第一反应通常是检查 DHCP。但如果是在一个混合了树莓派(Pi)等 Linux 设备、且正在折腾 IPv6 的环境下,问题的根源可能远比你想象的深。
一、 核心前传:什么是 RA(路由通告)?
在 IPv4 世界,终端获取网关信息主要靠 DHCP。但在 IPv6 世界,引入了更优雅(也更复杂)的 SLAAC(无状态地址自动配置)。
1. RA 的原理
RA (Router Advertisement) 是 IPv6 邻居发现协议(NDP)的一部分。路由器会定期向局域网发送多播包,大声告诉所有设备:"我是这个网段的网关,请根据我发布的前缀生成你们的 IP。"
二、 案情回放:消失的 IP 地址
某局域网内,一台"无头" Windows PC 突然在 WOL 唤醒后无法获取 IP,路由器显示离线。排查发现,罪魁祸首竟是旁边的树莓派配置了特殊的 IPv6 参数,导致 Windows 产生了网关竞争,误把树莓派当成了通往公网的出口。
三、 核心方案:如何优雅且安全地配置 Pi?
我们要让 Pi 实现地址固定(Token),同时关闭任何可能干扰 Windows 的"网关行为"。
1. NetworkManager 侧:锁定 Token
执行以下步骤,将地址生成权从内核移交给管理程序:
Bash# 1. 切换模式为 eui64 (设置 Token 的前提)sudo nmcli connection modify "Wired connection 1" ipv6.addr-gen-mode eui64# 2. 设置固定后缀(例如 ::123)sudo nmcli connection modify "Wired connection 1" ipv6.token ::123# 3. 重启服务生效sudo systemctl restart NetworkManager
```text
#### 2. 内核 sysctl 侧:正确配置 RA 行为 {#内核-sysctl-侧正确配置-ra-行为 path-to-node="19"}
这是文章最关键的部分!我们需要在 `/etc/sysctl.conf`{index-in-node="17" path-to-node="20"} 中精准定义 Pi 如何处理 RA 报文,从而避免干扰 Windows:
Bash# 彻底关闭转发,确保 Pi 不会伪装成路由器net.ipv6.conf.all.forwarding=0# 核心配置:定义 RA 接受行为# 0: 不接受 RA (手动静态 IP)# 1: 接受 RA (当 forwarding 为 0 时默认开启)# 2: 强制接受 RA (即使开启转发也接受,这往往是干扰的源头)net.ipv6.conf.eth0.accept_ra=1# 禁用发送重定向,防止 Pi 告诉 Windows “请走我这里”net.ipv4.conf.eth0.send_redirects=0net.ipv6.conf.eth0.accept_redirects=0
```
执行 sudo sysctl -p 即可生效。
{#section-1 path-to-node="24"}
四、 深度复盘:addr-gen-mode 与地址属性对照
1. 模式选择 (addr-gen-mode)
| 模式 | 逻辑说明 | 适用场景 |
|---|---|---|
[stable-privacy]{path-to-node="26,1,0,0"} |
[默认随机后缀,保护隐私。]{path-to-node="26,1,1,0"} | [普通终端。]{path-to-node="26,1,2,0"} |
[eui64]{path-to-node="26,2,0,0"} |
[基于用户定义生成。]{path-to-node="26,2,1,0"} | [设置 Token 的必备模式。]{path-to-node="26,2,2,0"} |
2. 地址属性全解析 (ip -6 a s)
| 属性关键字 | 状态解读 | 网工视角 |
|---|---|---|
| [scope global]{path-to-node="28,1,0,0"} | [全球唯一地址。]{path-to-node="28,1,1,0"} | [可以上公网。]{path-to-node="28,1,2,0"} |
| [dynamic]{path-to-node="28,2,0,0"} | [随路由器前缀更新。]{path-to-node="28,2,1,0"} | [兼具静态的稳点和动态的灵活。]{path-to-node="28,2,2,0"} |
| [mngtmpaddr]{path-to-node="28,3,0,0"} | [隐私地址"母版"。]{path-to-node="28,3,1,0"} | [负责生成随机临时后缀。]{path-to-node="28,3,2,0"} |
| [noprefixroute]{path-to-node="28,4,0,0"} | [路由权移交给 NM。]{path-to-node="28,4,1,0"} | [防止内核"乱跑"导致断网。]{path-to-node="28,4,2,0"} |
{#section-2 path-to-node="30"}
五、 总结:网工的排查闭环
这次故障的本质,是 Linux 端非标准的 IPv6 配置误导了局域网内 Windows 的网关判定。
通过将地址生成逻辑从内核移交给 NetworkManager,并配合 eui64 模式下的 Token 设置,同时在内核层关闭 forwarding 并锁定 accept_ra=1,我们成功实现了"地址固定"与"网络安全"的平衡。
想了解更多 IPv6 实战技巧?关注我们,回复"IPv6"获取网卡参数调优备忘单!