修复 RackNerd 服务器 IPv6 连接问题

2023-01-18 注:服务器近期更换到 Debian 11 系统,出现了同样的问题。此方法依然有效。
2023-06-03 更新:关闭 IPv6 隐私扩展的解决方法。

这两天简单鼓捣了一下去年黑五闪购买来吃灰的 RackNerd 服务器,发现服务器的 IPv6 默认配置下工作不正常,具体表现在其能够正确响应外界对其IPv6地址的请求(搭建 nginx 服务器可访问),但是却无法访问任何外界 IPv6 资源(ping6 不通 Google)。

服务器位于 Los Angeles DC02 (Multacom) 机房,使用 Ubuntu 20.04 镜像。

问题排查与解决

使用 ip addr 查看服务器现有IP:(为了保护隐私,部分地址被隐藏)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@us:~# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether <Hidden> brd ff:ff:ff:ff:ff:ff
inet [服务器的 IPv4 地址]/26 brd <Hidden> scope global eth0
valid_lft forever preferred_lft forever
inet6 [未知的外网 IPv6 地址]/64 scope global dynamic mngtmpaddr
valid_lft 2591945sec preferred_lft 604745sec
inet6 [服务器的 IPv6 地址]/64 scope global
valid_lft forever preferred_lft forever
inet6 fe80::[内网 IPv6 地址]/64 scope link
valid_lft forever preferred_lft forever

10行是服务器的 IPv4 地址,14行是服务器的 IPv6 地址,16行是一个 IPv6 内网地址,这些条目都符合预期。但是在 12 行有一个未知的外网 IPv6 地址,并且其并非固定地址,而像是被分配的(valid_lft 不是 forever),怀疑就是这个 IP 导致了连接问题。

使用 ifconfig eth0 inet6 del [问题地址]/64 指令删除这个问题地址,删除后服务器的对外 IPv6 连接恢复正常。

但是,十几秒之后,对外 IPv6 连接再次无法正常工作,发现这个问题地址又被重新分配并出现在了 ip addr 查询结果里。

2023-06-03 更新:建议使用下一节中关闭 IPv6 隐私扩展的方法解决问题,本节剩余内容仅供存档。

这个地址是被分配的,且删除后又被重新分配,则必定是有服务在请求分配,大概是与 IPv6 自动配置有关的服务。经过一番搜索,找到了关闭 IPv6 自动配置的办法:

1
sysctl -w net.ipv6.conf.eth0.autoconf=0

执行语句后再删除问题地址,发现对外 IPv6 连接恢复正常,且不再有新地址添加回来。

这条指令重启后将会失效,如想使其永久生效,需要将其加入到 /etc/sysctl.conf 中,与配置 BBR 的过程类似。

1
2
echo net.ipv6.conf.eth0.autoconf=0 >> /etc/sysctl.conf
sysctl -p

2023-06-03 更新:关闭 IPv6 隐私扩展

RFC 4941 规定了 IPv6 隐私扩展标准,其在无状态地址自动配置的基础上通过混淆生成与自身 MAC 地址无关的 IPv6 地址,确保对外访问不会暴露自身的 IP 地址。

可能是由于 RackNerd 机房内路由器的错误配置,服务器使用这一 IP 地址无法对外访问,这是本次故障的根本原因。通过关闭内核中 IPv6 隐私扩展的功能即可解决这一问题。

1
2
echo net.ipv6.conf.eth0.use_tempaddr=0 >> /etc/sysctl.conf
sysctl -p

修复 RackNerd 服务器 IPv6 连接问题
https://blog.tonyzh.ao/build-website/racknerd-ipv6/
作者
Tony Zhao
发布于
2022年2月10日
许可协议