前言
现在云服务器厂商在全面推广IPv6,于是购买的服务器基本都会分配IPv6地址。但是最近发现,服务器厂商分配的IPv6往往都无法连接。
问题
问题一:dadfailed
Root•~» ip -6 addr show scope global
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2607:ff68:7:5e:2ac:21ff:fec2:92bf/64 scope global dadfailed tentative
valid_lft forever preferred_lft forever
这是IPv6 的重复地址检测 (Duplicate Address Detection, DAD) 机制。
核心原因:dadfailed (重复地址检测失败)
-
dadfailed: DAD 代表 Duplicate Address Detection(重复地址检测)。系统在尝试启用这个 IPv6 地址时,检测到网络中似乎已经有设备在使用这个 IP 了,为了避免冲突,系统强制禁用了这个地址。 -
tentative: 意味着这个地址目前处于“试探”状态,尚未正式生效。
问题二:deprecated
root•~» ip -6 addr show scope global
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2607:ff68:7:5e:2ac:21ff:fec2:92bf/64 scope global deprecated dynamic mngtmpaddr noprefixroute
valid_lft 1925794sec preferred_lft 0sec
输出显示 IPv6 地址处于 deprecated 状态,这表明它是一个有效但不再首选使用的地址。这通常是正常的 IPv6 地址生命周期管理的一部分,并非系统错误。
在 IPv6 中,地址的生命周期分为两个阶段:
-
Preferred (首选):地址是完全可用的,系统会优先使用它来发起新的出站连接。
-
Deprecated (弃用):当地址的首选生命周期 (
preferred_lft) 耗尽但仍在有效生命周期 (valid_lft) 内时,它会进入此状态。-
用途: 处于
deprecated状态的地址仍可用于接收入站流量或维持现有连接。 -
限制: 不应用于发起新的出站连接。
-
因此,它也无法进行连接。正常情况下,它会获取一个新的地址,但是一直卡在获取新地址状态。
解决
以上两种问题使用的解决方法如下:
1.修改系统内核参数
echo "net.ipv6.conf.eth0.accept_dad = 0" >> /etc/sysctl.d/99-sysctl-ipv6.conf
sysctl -p
注:如果你的网卡名不是
eth0,将eth0换成自身网卡
2.重置 IPv6 地址以清除错误状态
ip addr del 2607:ff68:7:5e:2ac:21ff:fec2:92bf/64 dev eth0 # 删除报错地址
ip addr add 2607:ff68:7:5e:2ac:21ff:fec2:92bf/64 dev eth0 # 重新添加地址,此时因为 DAD 已关,它会立即生效
注:替换为自己的IPv6地址
3.验证
root•~» ip -6 addr show scope global
# 输出结果如下
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000
inet6 2607:ff68:7:5e:2ac:21ff:fec2:92bf/64 scope global
valid_lft forever preferred_lft forever
此时,没有 dadfailed ,也没有 deprecated ,问题解决。
最后
其实我也不得其解,既然服务器厂商分配了IPv6地址,但是又没有让你到可以直接使用的地步,一般很少会特地关注IPv6能不能连接,毕竟有且只有IPv6的网络环境极少极少,大多数都会忽略这个问题。