Back in 2017, my Linode box stopped getting the correct IPv6 address from SLAAC. I opened a support ticket, but nothing ever came of it. I’ve been simply re-adding the correct IP after each reboot. That’s a hassle, but I don’t reboot often enough to work up the motivation to fix it.
That finally changed today. I rebooted a couple of days ago and forgot to re-add my public IPv6 address, so things have been acting weird ever since. When I finally realized the problem, it had been so long since my last reboot that the correct command wasn’t in my command history any more. This is exactly why one should automate things!
But now for the solution: The box runs CentOS 7, so it uses NetworkManager for network configuration. It turns out that at some point NetworkManager enabled IPv6 privacy extensions by default. The machine was still doing SLAAC as it’s supposed to, but it was allocating a temporary IP instead of its correct public IP. Here’s the magic incantation to turn that off:
sudo nmcli c modify "Wired connection 1" ipv6.addr-gen-mode eui64
This is actually fairly well documented once you know what to look for, but it’s a surprise that CentOS would have changed the default mid-release.