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