IPv6 Privacy Extensions: What They Are and How to Enable
Most people first learn about IPv6 privacy extensions after noticing their device keeps new IPv6 addresses over time, and that change is by design.
Temporary addresses add a randomized interface identifier on top of your network’s prefix so outbound connections don’t always expose a stable device-specific address, while a non-temporary address remains available for reachability.
We’ll explain how this works, when it helps, the trade-offs to expect, and exactly how to enable and verify it on common platforms without breaking services you care about, noting that defaults vary by operating system so you should verify and tune lifetimes rather than assume they’re ideal.
How IPv6 Privacy Extensions Work
Classic stateless autoconfiguration (SLAAC) builds an address from a router-advertised prefix and an interface identifier; the original identifier often came from the NIC’s MAC via EUI-64, which is stable and easy to correlate across sessions and networks.
Privacy extensions replace that stable identifier with a pseudo-random value and rotate it periodically; the stack still keeps a stable non-temporary address in parallel for inbound reachability, while the temporary one is preferred for new outbound connections unless you change the policy.
Modern guidance targets a preferred lifetime near one day and a valid lifetime near two days for temporary addresses; implementations may differ, so confirm on your host and adjust if needed.
Stable Versus Temporary Addresses (RFC 7217 vs. RFC 8981)
Two complementary ideas ship in modern stacks: stable per-subnet addresses (derived from a secret and context per RFC 7217) and temporary addresses (RFC 8981) for outbound privacy; you can and often do run both at once.
Stable per-subnet identifiers avoid exposing hardware-derived bits and stay constant within a network, which helps for inbound rules and DNS records; temporary addresses change regularly to foil straightforward activity correlation based on a long-lived interface identifier.
When Temporary Addresses Help—and When They Don’t
They help against passive tracking that keys off a long-lived interface identifier on the public Internet; they don’t hide your network prefix, so multiple hosts behind the same connection may still appear related.
They don’t mitigate higher-layer tracking such as cookies or account logins, and they can complicate allow-lists, static ACLs, and logs that expect a single stable source address; consider anchoring controls to device certificates, tokens, or a published stable IPv6 address for inbound workflows.
How to Enable and Verify on Major Platforms
Before changing anything, capture current behavior so rollback is easy; privacy extensions require SLAAC with router advertisements that mark a prefix as autonomous, so networks that run DHCPv6-only without SLAAC won’t produce temporary addresses.
Windows 10/11 and Windows Server
Windows supports randomized interface identifiers and temporary addresses; PowerShell is the authoritative interface for persistent changes, while netsh remains useful for inspection and quick toggles.
- Show current global IPv6 protocol settings:
Get-NetIPv6Protocol | Format-List - Enable randomized IIDs and temporary addresses persistently:
Set-NetIPv6Protocol -RandomizeIdentifiers Enabled -UseTemporaryAddresses Enabled - Classic netsh toggle:
netsh interface ipv6 set privacy state=enabled - Inspect privacy status:
netsh interface ipv6 show privacy - List addresses and spot temporary ones:
Get-NetIPAddress -AddressFamily IPv6 | Where-Object SuffixOrigin -eq 'Random'
If you run services bound to a specific address, bind them to your non-temporary or to a stable per-subnet address while keeping temporary addresses for browsers and other client processes.
Linux (Kernel sysctl and NetworkManager)
Linux controls temporary addressing per interface and globally via sysctl; the use_tempaddr knob governs behavior: 0 = off, 1 = on but prefer the public (stable) address for new connections, 2 = on and prefer temporary addresses for new connections.
- Enable and prefer temporary addresses (runtime):
sudo sysctl -w net.ipv6.conf.all.use_tempaddr=2 net.ipv6.conf.default.use_tempaddr=2 - Persist across reboots: create
/etc/sysctl.d/99-ipv6-privacy.confwithnet.ipv6.conf.all.use_tempaddr=2andnet.ipv6.conf.default.use_tempaddr=2, thensudo sysctl --system - Check or tune lifetimes (seconds): preferred
/proc/sys/net/ipv6/conf/all/temp_prefered_lft(commonly ~86400) and valid/proc/sys/net/ipv6/conf/all/temp_valid_lft(commonly ~172800); change withsysctl -w - Verify addresses:
ip -6 addrand look forscope global temporary
NetworkManager Integration
When NetworkManager manages the link, you can set the policy without touching sysctl directly and also enable stable per-subnet addressing.
- Globally: create
/etc/NetworkManager/conf.d/ip6-privacy.confwith[connection]andipv6.ip6-privacy=2, then reload NetworkManager and reconnect - Per connection: add
ip6-privacy=2under the[ipv6]section of the connection’s.nmconnectionfile; addaddr-gen-mode=stable-privacyto also use RFC 7217-style stable addresses
macOS
macOS typically enables temporary addressing by default; you can inspect or tune with sysctl, and many builds label temporary addresses directly in ifconfig output.
- Show whether privacy addressing is enabled:
sysctl net.inet6.ip6.use_tempaddr(0=off, 1=on) - Enable at runtime:
sudo sysctl -w net.inet6.ip6.use_tempaddr=1 - Tune lifetimes: preferred with
sysctl net.inet6.ip6.temppltime(seconds) and valid withsysctl net.inet6.ip6.tempvltime(defaults often near 86400 and 604800 on older releases; check your current values)
To persist changes across reboots, use a LaunchDaemon or a management profile that applies the desired sysctl values during boot; simple edits to /etc/sysctl.conf are ignored by many recent releases.
Operational Considerations and Best Practices
Temporary addresses change the source address of new outbound flows; that has ripple effects in observability, rate limiting, and filtering, so expect to revisit logging, rules, and monitoring.
- Logging and SIEM: expect more unique source addresses per endpoint; normalize on device identity, hostname, or the stable address when correlating events.
- Allow-lists and API gateways: prefer certificate or token-based controls; if you must allow by IP, bind the application to a stable address while keeping temporary addresses enabled system-wide.
- Inbound services: bind daemons to the stable or link-local/ULA as appropriate; publish that stable address in DNS (AAAA) and monitor for accidental use of a temporary address in listeners.
- Long-lived sessions: rotation “deprecates” an address for new connections but doesn’t drop existing ones; if you see drops, check firewall statefulness and application keepalive intervals.
- SLAAC dependency: privacy extensions require router advertisements with autonomous address configuration; DHCPv6-only addressing without SLAAC won’t yield temporary addresses.
- Routers and firewalls: neighbor cache churn and logging volume will increase slightly; keep ND/RA settings sensible and ensure rate limits aren’t too tight.
Quick Rollback and Troubleshooting
If something breaks, roll back rather than disabling IPv6 entirely: on Windows set -UseTemporaryAddresses Disabled, on Linux set use_tempaddr=0, and on macOS set ip6.use_tempaddr=0.
Confirm the active source address selection by watching a test connection—for example, curl -6 https://example.com -v—and checking which address the stack chose; you can also reconnect an interface to force generation of a fresh temporary address and verify lifetimes after rotation.
