Skip to content

IPv6 Privacy Extensions: How to Stop Your IPv6 Address from Tracking You

By Brandon Visca 14 min read

On this page

Why Your IPv6 Address Is a Tracking Problem

Every time you connect to the internet, your IP address is the primary identifier that links your activity to your location and your identity. Most users are aware that VPNs and proxies can mask their IPv4 address. Fewer realize that even when your IPv4 is hidden, your IPv6 address may be fully exposed, and unlike dynamic IPv4 addresses that change periodically, a native IPv6 address is tied directly to your device’s hardware MAC address, making it a persistent identifier that follows you across every website you visit.

This is not a theoretical concern. In 2026, IPv6 adoption has crossed 50% globally. Most dual-stacked networks (connections that support both IPv4 and IPv6 simultaneously) leak IPv6 addresses even when a VPN is active. A 2024 study by the University of Chicago found that over 70% of VPN users had their real IPv6 address exposed despite having active VPN tunnels. Unless privacy extensions are explicitly enabled, your device generates an IPv6 address that is:

  • Derived from your MAC address, making it globally unique and permanently tied to your hardware
  • Persistent across sessions: websites see the same IPv6 address every time you visit
  • Linkable across websites: the same IPv6 address is a supercookie across the entire web
  • Visible even behind a VPN: IPv6 traffic often bypasses VPN tunnels entirely on dual-stacked networks

IPv6 privacy extensions solve this by generating temporary, random IPv6 addresses that rotate on a schedule, breaking the link between your device and your long-term identity.

How Standard IPv6 Addressing Works, and Why It Tracks You

To understand why privacy extensions matter, you need to understand how standard IPv6 addresses are assigned.

The eui-64 Format and MAC Address Exposure

When a device joins an IPv6 network and needs to auto-configure an address, it commonly uses the eui-64 process. The device takes its own MAC address (a 48-bit identifier burned into every network interface), inserts a fixed 16-bit pattern (0xFFFE) into the middle to expand it to 64 bits, and then combines that with the network’s 64-bit prefix to form a full 128-bit IPv6 address.

The result looks like this:

Prefix:          2001:db8:85a3::           (64-bit network prefix)
Interface ID:    02:1b:63:ff:fe:84:9c:3a  (derived from MAC address)
Full address:    2001:db8:85a3:0000:021b:63ff:fe84:9c3a

Because MAC addresses are assigned by the hardware manufacturer and are globally unique, this IPv6 address is effectively a permanent hardware identifier. It never changes unless you replace your network card. Every website you visit sees the same IPv6 address derived from the same MAC address, creating a persistent identifier that tracks you across the entire web.

The Privacy Problem in Practice

Web analytics platforms, ad networks, and fingerprinting scripts routinely log both IPv4 and IPv6 addresses. While IPv4 addresses often change (especially on residential connections with dynamic DHCP), an eui-64 IPv6 address remains stable for months or years. A user who upgrades their router but keeps the same network interface card will have the same IPv6 address on that device indefinitely.

This makes IPv6 addresses attractive for long-term user tracking. Even if you clear cookies, use private browsing mode, or switch between websites, your IPv6 address persists as a linking identifier. Combined with browser fingerprinting, the stability of a MAC-derived IPv6 address makes de-anonymization significantly easier.

What Are IPv6 Privacy Extensions?

IPv6 privacy extensions (defined in RFC 4941) introduce a mechanism for generating temporary interface identifiers that are randomly generated and changed periodically. Instead of deriving the interface ID from the MAC address, the operating system generates a random 64-bit value, combines it with the network prefix, and uses the resulting address for outgoing connections.

The system maintains two types of addresses simultaneously:

  1. A stable address: derived from the MAC address (eui-64), used for server-style inbound connections and network management. This address is typically not used for outbound client connections.

  2. A temporary address: randomly generated, rotated on a schedule (default: every 24 hours in most operating systems), used for all outbound client connections to external servers.

The temporary address is what websites and services see when you browse. Because it changes regularly, long-term tracking based on IPv6 address becomes significantly harder.

How the Algorithm Works

The privacy extension algorithm generates addresses using the following process:

  1. Generate a random 64-bit value (the interface identifier)
  2. Apply the Universal/Local bit (set to 1 to indicate locally-assigned) per RFC 4291 requirements
  3. Apply a Solicted-Node Multicast prefix (ff02::1:ff00:0/104) using the last 24 bits of the generated address
  4. Combine with the network prefix received from the router (via SLAAC: Stateless Address Autoconfiguration)
  5. Perform Duplicate Address Detection (DAD) to ensure the address is not already in use on the network
  6. Assign the address a preferred lifetime (typically 86400 seconds / 24 hours) and a valid lifetime

When the preferred lifetime expires, the address is still valid but is not used for new outbound connections. When the valid lifetime expires, the address is deprecated and eventually removed. A new temporary address is generated before the old one expires to ensure continuous connectivity.

How to Enable IPv6 Privacy Extensions

Privacy extensions are supported by all major operating systems but are not always enabled by default. Here is how to enable and configure them.

Windows 11 and Windows 10

Windows has supported privacy extensions since Windows Vista, but the default behavior varies. On Windows 11, temporary addresses are typically enabled by default for Wi-Fi connections but may be disabled on Ethernet.

Check current status:

# View IPv6 addresses and their source (eui-64 vs privacy)
netsh interface ipv6 show addresses

# Look for addresses with:
# - Origin: EUI64  → MAC-derived (no privacy)
# - Origin: Privacy (temporary) → privacy extension address

Enable temporary addresses on a specific interface:

# Enable privacy extensions (set to enabled)
netsh interface ipv6 set interface "Wi-Fi" randomizeidentifiers=enabled

# Or for Ethernet:
netsh interface ipv6 set interface "Ethernet" randomizeidentifiers=enabled

Check and set the temporary address lifetime:

# View current prefix policies
netsh interface ipv6 show prefixpolicies

# Modify the preferred lifetime for temporary addresses (in seconds)
# Default is 86400 (24 hours). Setting to 3600 gives hourly rotation.
netsh interface ipv6 set privacy active=enabled maxpreferredlifetime=3600

Persistent configuration via PowerShell:

# Create a scheduled task to ensure privacy extensions are always on
$action = New-ScheduledTaskAction -Execute 'netsh' -Argument 'interface ipv6 set interface "Wi-Fi" randomizeidentifiers=enabled'
$trigger = New-ScheduledTaskTrigger -AtStartup
Register-ScheduledTask -TaskName "IPv6PrivacyExtensions" -Action $action -Trigger $trigger -Description "Enable IPv6 privacy extensions at startup"

macOS

macOS enables privacy extensions by default on modern versions (10.11 El Capitan and later). You can verify and adjust the settings.

Check current addresses:

# Show all IPv6 addresses with their scope and origin
ifconfig | grep -A 5 "inet6"

# Look for:
# - eui64 suffix → MAC-derived address
# - temporary suffix → privacy extension address

Enable or verify privacy extensions:

# Privacy extensions are controlled via sysctl. Check current setting:
# net.ipv6.conf.all.use_tempaddr = 0 (disabled)
# net.ipv6.conf.all.use_tempaddr = 1 (enabled, prefer temp)
# net.ipv6.conf.all.use_tempaddr = 2 (enabled, require temp)

# Check if enabled:
sysctl net.ipv6.conf.all.use_tempaddr

# Enable permanently (add to /etc/sysctl.conf):
echo "net.ipv6.conf.all.use_tempaddr=2" | sudo tee -a /etc/sysctl.conf
echo "net.ipv6.conf.default.use_tempaddr=2" | sudo tee -a /etc/sysctl.conf

# Apply without reboot:
sudo sysctl -w net.ipv6.conf.all.use_tempaddr=2
sudo sysctl -w net.ipv6.conf.default.use_tempaddr=2

Adjust the rotation interval:

# temppltime: preferred lifetime (how long an address is preferred)
# tempvltime: valid lifetime (how long an address remains valid)
# Values in seconds. Default: 604800 (7 days) / 2592000 (30 days)

# Set to shorter interval (1 day preferred, 1 week valid)
sudo sysctl -w net.ipv6.conf.all.temppltime=86400
sudo sysctl -w net.ipv6.conf.all.tempvltime=604800

Linux

Linux has supported privacy extensions since kernel 2.6.12. Most desktop distributions enable them by default for network-manager-managed connections, but headless servers typically do not.

Check current status:

# Show IPv6 addresses and their type
ip -6 addr show

# Or use ifconfig:
ip -6 addr show | grep -E "inet6.*(temp|eui|scope)"

Enable privacy extensions:

# Per-interface (temporary, lost on reboot)
sudo sysctl -w net.ipv6.conf.eth0.use_tempaddr=2

# Make permanent by editing /etc/sysctl.conf:
sudo nano /etc/sysctl.d/99-privacy.conf

Add the following:

# /etc/sysctl.d/99-privacy.conf
# Enable IPv6 privacy extensions
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2

# Preferred lifetime for temporary addresses (seconds)
net.ipv6.conf.all.temp_valid_lifetime = 604800   # 7 days
net.ipv6.conf.all.temp_prefered_lifetime = 86400  # 1 day

# Generate new addresses after this many addresses have been created (prevents address space exhaustion)
net.ipv6.conf.all.max_desync_factor = 600

Apply with:

sudo sysctl -p /etc/sysctl.d/99-privacy.conf

For NetworkManager-managed connections:

If NetworkManager overrides sysctl settings (it often does), you may need to configure it directly:

# For a specific NetworkManager connection
nmcli connection modify "Wired connection 1" ipv6.ip6-privacy 2

# Values:
# 0 = disabled (eui-64 only)
# 1 = enabled, prefer public address over temporary
# 2 = enabled, prefer temporary address (strict mode)

# Restart the connection to apply
nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1"

Android

Android has supported privacy extensions since Android 10 (released 2019), but the implementation is more limited than on desktop operating systems. Android uses privacy extensions for Wi-Fi connections and rotates the temporary address more aggressively.

Check via Termux:

# View IPv6 addresses on Android
ip -6 addr show wlan0

# Android typically uses privacy extensions on Wi-Fi by default from Android 10+
# You can verify by checking for temporary addresses:
ip -6 addr show | grep temporary

Android limitations:

  • Android does not expose sysctl configuration for privacy extensions in the same way desktop OSes do
  • Privacy extensions on Android are managed by the Wi-Fi stack and cannot be easily reconfigured without root access
  • Some Android builds (especially custom ROMs) may have privacy extensions disabled or limited
  • VPN-based solutions (covered below) are more reliable on Android for comprehensive IPv6 privacy

Force-disable IPv6 (fallback if privacy extensions unavailable):

If your Android device does not support privacy extensions and you need to prevent IPv6 tracking, you can disable IPv6 entirely via your router or VPN:

# On a rooted Android device:
# Disable IPv6 on the Wi-Fi interface
echo 1 > /proc/sys/net/ipv6/conf/wlan0/disable_ipv6

This is a blunt instrument (it disables all IPv6 connectivity) but it eliminates the tracking risk entirely at the cost of IPv6 functionality.

Testing Whether Privacy Extensions Are Active

After enabling privacy extensions, verify they are working by checking what address your system is using for outbound connections.

Method 1: Check Your Visible IPv6 from an External Service

# See what IPv6 address you appear to have from the internet
curl -6 https://ifconfig.me

# Or
curl -6 https://api.ipify.org

# Compare to your local interface's eui-64 address
ip -6 addr show | grep "inet6.*link"

If the external address does not match your MAC-derived link-local or global address, privacy extensions are active.

Method 2: Visit an IPv6 Leak Test Page

Visit https://test-ipv6.com in your browser. The test reports:

  • Your IPv4 address
  • Your IPv6 address
  • Whether your IPv6 address appears to be a temporary (privacy extension) address or a MAC-derived address
  • Whether you have an IPv6 leak through your VPN

A clean result shows your VPN’s IPv6 address (or a privacy extension address from your ISP, if no VPN), and the test explicitly labels temporary addresses as such.

Method 3: Scripted Verification

#!/usr/bin/env python3
"""
Verify IPv6 privacy extension status by comparing local and external addresses.
"""
import socket
import urllib.request

def get_local_ipv6():
    """Get the IPv6 address the system would use for outbound connections."""
    try:
        # Create a dummy connection to determine the outbound IPv6 address
        s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
        s.connect(('2001:db8::1', 1))
        local_addr = s.getsockname()[0]
        s.close()
        return local_addr
    except Exception:
        return None

def get_external_ipv6():
    """Fetch the external IPv6 address from a service."""
    try:
        req = urllib.request.urlopen('https://api64.ipify.org', timeout=5)
        return req.read().decode('utf-8')
    except Exception:
        return None

def is_eui64(address: str) -> bool:
    """Heuristic: MAC-derived addresses contain ff:fe in the middle."""
    # MAC-derived eui-64 addresses contain fffe in the interface ID
    parts = address.lower().split(':')
    if len(parts) >= 7:
        # The interface identifier part (last 4 groups) may contain fffe
        interface_id = ''.join(parts[4:])
        return 'fffe' in interface_id or 'ff:fe' in ':'.join(parts[4:])
    return False

def check_privacy_extensions():
    local_ipv6 = get_local_ipv6()
    external_ipv6 = get_external_ipv6()

    print(f"Local outbound IPv6:  {local_ipv6}")
    print(f"External visible IPv6: {external_ipv6}")
    print()

    if local_ipv6 and external_ipv6 and local_ipv6 == external_ipv6:
        if is_eui64(local_ipv6):
            print("⚠️  WARNING: IPv6 address is MAC-derived (eui-64). Privacy extensions NOT active.")
        else:
            print("✅ IPv6 address does not appear to be MAC-derived.")
    else:
        print("ℹ️  Addresses differ: this may indicate a VPN, proxy, or privacy extension in use.")

if __name__ == "__main__":
    check_privacy_extensions()

The VPN IPv6 Leak Problem

Even with privacy extensions enabled, using a VPN on a dual-stacked network introduces a specific vulnerability: IPv6 leak. Standard VPN tunnels were designed for IPv4 and often do not carry IPv6 traffic at all, or carry it without encryption. On networks that advertise both IPv4 and IPv6 prefixes via SLAAC, the operating system may send IPv6 traffic directly to the ISP router: bypassing the VPN tunnel entirely.

This is distinct from the privacy extension issue but is compounded by it. A device with a MAC-derived IPv6 address, connected to a VPN that does not handle IPv6, will have both:

  1. An unencrypted, MAC-derived IPv6 address visible to websites
  2. That address remaining stable across sessions (no privacy extension rotation)

To fully close the IPv6 tracking vector when using a VPN:

  1. Enable privacy extensions on your operating system (as described above)
  2. Ensure your VPN handles IPv6: either by tunneling it (IPv6-in-IPv4) or by blocking IPv6 at the tunnel interface
  3. Test for IPv6 leaks at test-ipv6.com with your VPN active
  4. Consider VPN kill-switch configurations that block all non-VPN traffic (including IPv6) if the tunnel drops

Most reputable VPN providers now support IPv6 in their tunnel protocols, but it is worth verifying in your VPN’s settings. Some providers explicitly disable IPv6 at the adapter level to prevent leaks.

The Limits of IPv6 Privacy Extensions

Privacy extensions significantly reduce IPv6-based tracking but are not a complete solution.

They do not hide your network prefix. The 64-bit prefix identifies your ISP and typically your geographic region. Even with random interface identifiers, the network portion of your IPv6 address still reveals your approximate location and ISP. Privacy extensions protect against MAC-derived device tracking, not network-level surveillance.

They are per-interface. If your device has both Wi-Fi and Ethernet, each interface generates its own set of addresses. A determined tracker could potentially link these by observing other signals (browser fingerprint, cookies, login state) rather than the IP address itself.

They are not enabled on all devices. Mobile phones, IoT devices, and many embedded systems may not support privacy extensions. These devices will always have MAC-derived IPv6 addresses on networks that support SLAAC.

IPv6 can be disabled entirely at the operating system level or at the router level, which eliminates the tracking vector entirely at the cost of losing IPv6 connectivity. On an IPv4-dominant internet, this is rarely a practical limitation.

Best Practices Summary

PlatformDefault StatusHow to VerifyHow to Enable
Windows 11Often enabled on Wi-Finetsh interface ipv6 show addressesnetsh interface ipv6 set interface "Wi-Fi" randomizeidentifiers=enabled
macOSEnabled by default (10.11+)ifconfig | grep "inet6"Add to /etc/sysctl.conf: net.ipv6.conf.all.use_tempaddr=2
LinuxOften disabled on serversip -6 addr showsysctl -w net.ipv6.conf.eth0.use_tempaddr=2 or NetworkManager
Android 10+Enabled on Wi-Fiip -6 addr show wlan0Not configurable; relies on system Wi-Fi stack
iOSLimited supportNot easily verifiableEnable “Limit IP Address Tracking” in Settings → Wi-Fi

Why Enable Them

Unlike cookie-based or fingerprint-based tracking, IPv6 address tracking operates at the network level, making it invisible to browser-based privacy tools. Enabling privacy extensions closes a tracking vector that most users are completely unaware of.

If you are concerned about IPv6-based tracking more broadly, also consider using IPPriv’s IP lookup tool to see what information your current IPv6 address is exposing, and check our VPN detection guide for understanding how different network configurations affect your visibility online.

For related reading, see our guides on how websites track your IP address, understanding IP geolocation, and how to prevent IP leaks.

IP Addresses

What Is IP Spoofing and How Attackers Use It

IP spoofing is a network attack technique where a sender falsifies their IP address. Learn how it works, why it matters for privacy, and the defenses that actually stop it.

11 min read

Security

What Is a Port Probe and Why Does It Threaten Your Privacy?

Port probes are a quiet but powerful reconnaissance technique used by websites, advertisers, and attackers to fingerprint your network, bypass VPNs, and track you across sessions. Learn how they work and how to protect yourself.

10 min read