为什么VPS的IPv6地址过一阵子会自己变,是不是被入侵了

ip -6 addr今天看的地址,隔几天再查,后半截莫名其妙变了,第一反应容易往坏处想——是不是配置被人动过手脚,或者哪个服务偷偷改了网络设置。其实大概率什么都没被入侵,这是IPv6一个专门设计出来的隐私保护特性在正常工作,只是这个特性放在服务器身上,通常并不是你想要的。

最早的IPv6地址,其实是个"永久身份证"

IPv6地址后64位(接口标识符)最早的生成方式叫EUI-64,直接把网卡的MAC地址原样嵌进去,好处是简单、不用协调就能保证唯一,副作用却很致命——这段后缀跟MAC地址死死绑定,不管设备换到哪个网络,暴露出来的这一截永远一样,等于给每台设备贴了张终身不变、全世界可见的身份证。安全研究者早就指出这是个隐私灾难,任何一方留意这个特征值,就能跨网络持续追踪同一台设备。

Privacy Extensions就是为了解决这个问题而生的

为了堵上这个漏洞,后来的标准(RFC 4941,现已被RFC 8981取代)给SLAAC加了Privacy Extensions机制——设备不再老实用MAC地址生成固定后缀,而是随机生成一段临时接口标识符,默认"首选"有效期约1天,完全失效前还有2天宽限期,快到期前系统自动生成新的随机地址顶替上去。地址隔一天左右自动换一次,是设计好该有的正常行为,不是故障也不是被篡改。

服务器和普通设备的需求正好相反

关键点在于:Privacy Extensions启用后,设备身上会同时存在两个地址——一个稳定地址负责让外界持续找到你;一个不断轮换的临时地址,专门用在设备主动发起的连接上,防止被追踪。这套设计是为终端设备(笔记本、手机)量身定制的。

但VPS的定位正好反过来——服务器存在的意义就是要被稳定地找到,域名解析、白名单、日志分析全指望这个地址长期不变。如果系统默认给VPS也开着这个特性,服务器主动向外发起的连接会不断换"马甲",排查问题时日志里同一台机器顶着好几个不同IPv6地址,只会徒增困惑,没有实际隐私收益。

怎么确认现在是不是开着,以及怎么关

先查一下当前的设置:

1
sysctl net.ipv6.conf.all.use_tempaddr

返回值是2表示已经开启,且优先用临时地址发起新连接;0是完全关闭;1是生成但不优先使用。如果这台VPS上确实显示的是2,关掉它,让服务器的出站连接固定用稳定地址:

1
2
3
4
sysctl -w net.ipv6.conf.all.use_tempaddr=0
sysctl -w net.ipv6.conf.default.use_tempaddr=0
echo "net.ipv6.conf.all.use_tempaddr=0" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.use_tempaddr=0" >> /etc/sysctl.conf

需要澄清一点:这个设置管的是服务器自己主动发起连接时用哪个地址,跟"别人怎么访问你这台服务器"是两码事——外部访问用的是你DNS里AAAA记录指向的那个稳定地址,关掉Privacy Extensions不会影响别人正常连进来,只会让你自己这台机器对外发起的连接不再莫名其妙换地址。

顺带一提

如果是在排查VPS被暴力破解怎么查有没有被入侵这类安全问题的过程中,看到日志里同一台自己的机器顶着不同IPv6地址出现,先别急着往"被入侵"这个方向想,回头查一下是不是这个特性在起作用。想确认自己这台VPS当前对外呈现的地址类型和质量,也可以配合推荐几个IP工具那篇提到的工具查一下,确认关闭Privacy Extensions之后地址确实稳定下来了。