使用 IPv6 时如何避免暴露我的 MAC 地址?

使用 IPv6 时如何避免暴露我的 MAC 地址?

在我的 Mac 上,每个 IPv6 地址包括特定计算机的 MAC 地址(不是我的路由器)。 诸如ipv6-test.com不但展示出来,还告诉我这是一台苹果电脑。

这感觉就像一个超级 cookie,可能也适用于其他操作系统。我如何避免我的 MAC 地址被泄露?

背景:MAC地址是不在显而易见的地方。 像2001:0db8:1:2:60:8ff:fe52:f9d8

  • 取最后 64 位(主机标识符)并添加前导零:0060:08ff:fe52:f9d8
  • 去掉ff:fe中间的部分。如果没有这些字节,然后没有 MAC 地址。
  • 对于第一个字节:对第二个低位进行补码(通用/本地位;如果该位为 1,则将其设为 0,如果为 0,则将其设为 1)。因此:0x00(00000000)变为0x02(00000010)。
  • Presto:60:8ff:fe52:f9d8转换回 MAC 地址02:60:08:52:f9:d8

注:根据 Ars Technica 的说法,自 macOS 10.12 Sierra 起苹果采用了一种不基于 MAC 地址的生成稳定地址的新方法显然,Windows 已经这样做了很多年。


这个问题本周超级用户问题
阅读博客条目了解更多详情或为博客做贡献你自己

答案1

IPv6 的两个扩展解决了这个问题:

  • RFC 4941又名“隐私寻址”允许出站连接使用临时的、随机生成的地址(每隔几个小时轮换一次)。
  • RFC 7217允许从不透露任何信息的不透明哈希生成主要静态地址。

流行的操作系统至少支持其中一种方法,但越来越多地同时支持这两种方法。

请注意,这些功能是正交的。如果您愿意,可以同时使用两者。

稳定的私有地址

在某些操作系统中,主接口标识符不再由 MAC 或 EUI-64 生成,而是使用哈希或随机种子生成(通常根据RFC 7217

这种地址仍然是静态的每个网络– 同一台机器上的同一操作系统在同一个 IPv6 前缀内应该始终生成相同的后缀。它适用于传入连接。

  • 视窗从 Windows Vista 开始使用自定义方案,从 Windows 11 开始使用 RFC 7217 方案(如果我没记错的话)。

    要检查该功能是否处于活动状态,请运行 PowerShell 命令:

    Get-NetIPv6Protocol | fl RandomizeIdentifiers
    

    要启用/禁用该功能:

    Set-NetIPv6Protocol -RandomizeIdentifiers Enabled
    
    Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
    

    这也可以使用来完成netsh interface ipv6

  • Linux 上的 NetworkManager从 NM v1.2.0 开始支持 RFC 7217,使用连接配置文件的 UUID 作为种子的一部分。此功能在最近的 NM 版本中默认处于活动状态。

    要启用或禁用此功能:

    nmcli con modify "<profilename>" ipv6.addr-gen-mode stable-privacy
    
    nmcli con modify "<profilename>" ipv6.addr-gen-mode eui64
    
  • systemd-networkd 有点儿使用此 .network 文件选项支持 RFC 7217,但似乎要求您明确列出应使用此模式的网络前缀:

    [Network]
    IPv6Token=prefixstable:2001:db8:abcd:123::/64
    

    如果没有前缀匹配,它仍将恢复为 EUI-64 方法。

  • Linux/BSD 上的 dhcpcd在 /etc/dhcpcd.conf 中使用此选项支持 RFC 7217:

    slaac private
    

    要禁用此功能并使用传统的 EUI-64 标识符:

    slaac hwaddr
    
  • Linux 内核 SLAAC从 Linux v4.1.0 开始支持 RFC 7217;但是,必须通过 sysctl 存储秘密种子来手动激活它。

    密钥是一个 128 位十六进制字符串(形状类似于 IPv6 地址),您可以使用以下命令生成它:

    uuidgen | sed "s/-//g; s/..../:&/g; s/^://"
    

    此密钥必须存储在net.ipv6.conf.default.stable_secretsysctl 中。为了使其持久,可以将其放入/etc/sysctl.d/50-rfc7217.conf或类似文件中:

    net.ipv6.conf.default.stable_secret = 84a0:d5aa:52b0:4d35:k567:3aa6:7af5:474c
    

    设置密钥会自动为所有网络接口激活此模式。要检查该功能是否处于活动状态,请在 中查找“addrgenmode stable_secret” ip -d link,或在 中查找值“2” sysctl net.ipv6.conf.<ifname>.addr_gen_mode

临时私有地址

此功能(定义在RFC 4941) 规定额外的地址是随机生成的,每隔几个小时轮换一次。这些地址仅用于传出连接 - 您仍将保留基于 MAC 或基于 RFC7217 的主地址用于传入连接。

  • 视窗从 Windows XP SP2 开始支持临时地址。

    要启用/禁用此功能:

    netsh interface ipv6 set privacy state=enabled
    netsh interface ipv6 set privacy state=disabled
    

    请注意,从 Vista 开始,Windows 现在支持基于哈希的主地址生成,因此此功能并不那么重要。

  • Linux 上的 NetworkManager:NetworkManager 的最新版本自行处理 RA,尽管下面两个值与 sysctl 具有相同的含义(2 = 首选隐私地址,1 = 首选主地址):

     nmcli con modify <name> ipv6.ip6-privacy 2
    

    请注意,NetworkManager 现在从 v1.2.0 开始支持基于 RFC7217 的主地址生成,因此此功能并不那么重要。

    附注:从 1.4.0 开始,NM 也允许随机化 MAC 地址本身。设置wifi.cloned-mac-addressstable为每个网络设置不同的 MAC(推荐),或random将其随机化每一个连接(可能会导致问题)。

    在所有情况下,<name>都必须是连接名称,例如 WiFi SSID 或"Wired Connection 1"。用于nmcli con列出全部。

    将其设为默认设置新的连接,从 1.2.0 开始您可以更改/etc/NetworkManager/NetworkManager.conf

     [connection]
     ipv6.addr-gen-mode=stable-privacy
     wifi.cloned-mac-address=stable
    
  • DHCP服务器支持使用slaac ... temporary子选项的临时地址:

     slaac private temporary
    

    或者

     slaac hwaddr temporary
    
  • Linux 内核 SLAAC支持临时地址,但默认不使用它们。可以通过设置这些 sysctl 来激活它们:

     sysctl net.ipv6.conf.all.use_tempaddr=2
     sysctl net.ipv6.conf.default.use_tempaddr=2
    

    all或部分default可以用特定的接口名称替换;例如net.ipv6.conf.eth0.use_tempaddr

    (我曾经ip link set eth0 down && ip link set eth0 up强制分配地址,但您也可以运行rdisc6 eth0或等待几分钟以等待下一个定期路由器通告。)

  • Mac OS X– 自 OS X 10.7 Lion 起默认启用:

     sysctl -w net.inet6.ip6.use_tempaddr=1
    

    如果启用,临时地址将是首选。

  • FreeBSD

     sysctl net.inet6.ip6.use_tempaddr=1
     sysctl net.inet6.ip6.prefer_tempaddr=1
    
  • 较旧的 NetBSD 版本

     sysctl -w net.inet6.ip6.use_tempaddr=1
    

    最新的 NetBSD 似乎不再支持内核 SLAAC,在这种情况下请按照 dhcpcd 说明进行操作。

  • OpenBSD– 增加了支持5.2;默认启用并首选5.3

     ifconfig em0 autoconfprivacy
    

    ifconfig在临时地址旁边显示“autoconfprivacy”。

配置注意事项:

  • 在 Linux、OS X 和所有 BSD 上,编辑/etc/sysctl.conf以使设置永久生效。

  • 在 Windows 上,更改将自动保存。(如果您希望它仅持续到重新启动,则可以将其附加store=active到命令中。)netsh


部分基于IPv6 操作系统请参阅 IPv6INT.net。另请参阅常规 IPv6 注意事项


如果 IPv6 地址中使用了硬件地址,通常意味着您的网络使用 IPv6 无状态自动配置。在这种情况下,您只需选择自己的地址后缀并手动配置 IPv6 即可。

但是,即使手动添加的地址不包含您的硬件信息,它仍然是静态的(与隐私寻址不同,隐私寻址会经常更改地址)。此外,在超过 2-3 个设备的网络中,静态地址可能很麻烦。

答案2

仅供参考,这仅适用于某些 IP 寻址方案。您(或您的 ISP)很可能正在使用 IPv6 自动配置,这首先需要相当大的 IP 块才能完成。解决方案可能是关闭此功能。您的 ISP 可能也会使用 DHCP 来分配地址,这在 IPv6 中仍然是可能的。

相关内容