Alpine 容器 IPv6 地址凭空消失:一次从 RA 查到内核 autoconf 的排障

举报
Newbeest 发表于 2026/10/28 10:22:23 2026/10/28
【摘要】 容器 IPv6 出网全断、地址过期后不再续期。抓包确认 RA 收到了但地址不重建,最后定位到 sysctl 里一个被忽略的 autoconf 开关。附完整排查路径和五条经验。

# Alpine 容器 IPv6 地址凭空消失:一次从 RA 查到内核 autoconf 的排障

## 现象

一个跑在 PVE 上的 Alpine LXC 容器,只做网络转发。某天开始:

- IPv4 出网正常
- IPv6 出网 100% 丢包
- 容器网卡上还挂着 IPv6 地址,但地址过期后**不再续期**,重启容器才会重新拿到

RA 是上游路由器发的,前缀也没变,看起来像"路由器那边的问题"。实际查下来,问题在容器自己的 sysctl。

## 第一层:先确认 RA 到底有没有收到

不要一上来就怀疑上游。在容器里抓 RA:

    tcpdump -i eth0 -n -vv 'icmp6 and ip6[40] == 134'

同时看内核计数:

    cat /proc/sys/net/ipv6/conf/eth0/accept_ra      # 0 / 1 / 2
    cat /proc/sys/net/ipv6/conf/eth0/forwarding

这里有个容易忽略的前提:**Linux 一旦开启 `forwarding=1`,内核默认把 `accept_ra` 置为 0**(除非显式设成 2)。所以"容器做转发 → 收不到 RA"是常见组合,第一反应都会往这上面想。

我们确实先按这个方向修:设 `accept_ra=2`、删掉旧地址、等下一轮 RA。

结果很反直觉:**RA 计数确实 +2(确认收到),但地址依然不重建**。

## 第二层:排除 RA 内容问题

既然 RA 收到了,就看 RA 里有什么。当时 RA 的 hop limit 字段是 0,一度怀疑上游配置有问题。让上游把 hop limit 改成 64 再测——**地址还是不重建**。

这一步的价值是:把"上游 RA 有问题"这个假设排除掉,把问题逼回本地。

## 第三层:找到真正的开关

`accept_ra` 只决定"要不要接受 RA",而**由 RA 前缀生成地址(SLAAC)是另一个开关**:

    cat /proc/sys/net/ipv6/conf/eth0/autoconf
    # 0

内核在 `addrconf` 处理 RA 前缀时,会先检查这个接口的 `autoconf`;为 0 时**直接跳过地址生成**——RA 收到了、计数加了、日志没报错,但地址就是不出现。这正好解释了我们看到的所有现象。

改成 1 并重新触发:

    sysctl -w net.ipv6.conf.eth0.autoconf=1
    ip -6 addr flush dev eth0 scope global
    # 等下一轮 RA(或重启网络)
    ip -6 addr show dev eth0

地址立刻重建,出网恢复。

## 为什么会变成 0

翻 `/etc/sysctl.d/` 找到答案:早期为了让容器做转发,写过一个 `10-forwarding.conf`,里面除了 `forwarding=1`,还顺手写了:

    net.ipv6.conf.all.accept_ra = 0
    net.ipv6.conf.all.autoconf = 0

这两行当时是"关掉不需要的 IPv6 自动配置"的顺手操作,一直没出问题——**直到这个容器真的需要用 IPv6 出网**。sysctl.d 是开机批量生效的,所以表现为"重启后正常一会儿,之后地址过期就再也回不来"。

## 修复与持久化

    cat > /etc/sysctl.d/20-ipv6-forwarding.conf <<'EOF'
    net.ipv6.conf.all.forwarding = 1
    net.ipv6.conf.eth0.accept_ra = 2
    net.ipv6.conf.eth0.autoconf = 1
    EOF
    sysctl --system

关键点:**`accept_ra` 和 `autoconf` 是两个独立开关**,转发场景下只改前者不够。

## 五条经验

1. **先抓包再怀疑上游**:`tcpdump` 一条命令就能分清"没收到 RA"和"收到但没用"。
2. **`forwarding=1` 会连带把 `accept_ra` 关掉**(默认 0),这是转发场景的第一嫌疑。
3. **`accept_ra=2` 只解决"收不收",`autoconf=1` 才决定"建不建地址"**。两个都查。
4. **RA 字段异常不代表根因**:hop limit 0 是个干扰项,改完照样不通,反而浪费了一轮。
5. **sysctl.d 是历史包袱的重灾区**:老配置里的"顺手关闭"会在半年后变成事故,改之前先 `grep -r` 一遍。

这套排查路径对任何 Linux(容器、虚机、软路由)都适用,不只是 Alpine。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。