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

Arj*_*jan 147 mac-address privacy ipv6

在我的 Mac 上,每个 IPv6 地址都包含特定计算机(不是我的路由器)的 MAC 地址。诸如ipv6-test.com 之类的网站不仅显示它,而且还告诉我它属于 Apple 计算机。

这感觉就像一个超级 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

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


这个问题是本周超级用户问题
阅读博客条目以了解更多详细信息或自己为博客做出贡献

use*_*686 142

这可以通过 IPv6 的两个扩展来解决:

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

流行的操作系统支持至少一种方法,但越来越多的两种方法都支持。

请注意,这些特征是正交的。如果需要,您可以同时使用两者。

稳定的私有地址

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

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

  • 的Windows开始与Windows Vista使用自定义方案。

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

    Get-NetIPv6Protocol | fl RandomizeIdentifiers
    
    Run Code Online (Sandbox Code Playgroud)

    要启用/禁用该功能:

    Set-NetIPv6Protocol -RandomizeIdentifiers Enabled
    
    Run Code Online (Sandbox Code Playgroud)
    Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
    
    Run Code Online (Sandbox Code Playgroud)

    这也可以使用netsh interface ipv6.

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

    要启用或禁用此功能:

    nmcli con modify "<profilename>" ipv6.addr-gen-mode stable-privacy
    
    Run Code Online (Sandbox Code Playgroud)
    nmcli con modify "<profilename>" ipv6.addr-gen-mode eui64
    
    Run Code Online (Sandbox Code Playgroud)
  • systemd-networkd 样的支持RFC 7217使用此。网络文件选项,但似乎需要你明确地针对该模式下,应使用列表网络前缀:

    [Network]
    IPv6Token=prefixstable:2001:db8:abcd:123::/64
    
    Run Code Online (Sandbox Code Playgroud)

    如果没有前缀匹配,它仍然会回退到 EUI-64 方法。

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

    slaac private
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    密钥是一个 128 位十六进制字符串(形状像 IPv6 地址),您可以使用以下方法生成:

    uuidgen | sed "s/-//g; s/..../:&/g; s/^://"
    
    Run Code Online (Sandbox Code Playgroud)

    该密钥必须存储在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
    
    Run Code Online (Sandbox Code Playgroud)

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

临时私有地址

此功能(在RFC 4941 中定义)提供了随机生成并每隔几个小时轮换一次的附加地址。这些地址仅用于传出连接 - 您仍然保留传入连接的基于 MAC 或基于 RFC7217 的主地址。

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

    要启用/禁用此功能:

    netsh interface ipv6 set privacy state=enabled
    netsh interface ipv6 set privacy state=disabled
    
    Run Code Online (Sandbox Code Playgroud)

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

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

     nmcli con modify <name> ipv6.ip6-privacy 2
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,从 v1.2.0 开始,NetworkManager 现在支持基于 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
    
    Run Code Online (Sandbox Code Playgroud)
  • dhcpcd支持使用slaac ... temporary子选项的临时地址:

     slaac private temporary
    
    Run Code Online (Sandbox Code Playgroud)

    或者

     slaac hwaddr temporary
    
    Run Code Online (Sandbox Code Playgroud)
  • Linux 内核 SLAAC支持临时地址,但默认情况下不使用它们。可以通过设置这些 sysctl 来激活它们:

     sysctl net.ipv6.conf.all.use_tempaddr=2
     sysctl net.ipv6.conf.default.use_tempaddr=2
    
    Run Code Online (Sandbox Code Playgroud)

    alldefault部分可以与特定的接口名称被替换; 例如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
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 自由BSD

     sysctl net.inet6.ip6.use_tempaddr=1
     sysctl net.inet6.ip6.prefer_tempaddr=1
    
    Run Code Online (Sandbox Code Playgroud)
  • 较旧的 NetBSD 版本

     sysctl -w net.inet6.ip6.use_tempaddr=1
    
    Run Code Online (Sandbox Code Playgroud)

    最新的 NetBSD 似乎不再支持内核 SLAAC,在这种情况下,请遵循 dhcpcd 指令。

  • OpenBSD – 在5.2 中添加了支持;在5.3 中默认启用和首选。

     ifconfig em0 autoconfprivacy
    
    Run Code Online (Sandbox Code Playgroud)

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

配置注意事项:

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

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


部分基于IPv6INT.net上的IPv6 操作系统。另请参阅一般 IPv6 说明


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

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

  • @Arjan:类似于`de4d:b33f` 的 IPv6 地址不利于记忆;此外,它们是由它们的所有者设置的,而“whois”垃圾邮件是 a) 烦人和 b) 由无法控制您的域的外部人员引起的。 (6认同)
  • 对我的 Mac 和 FRITZ!Box 7340 路由器有很好的副作用:我在 `ifconfig` 中得到两个地址。传出连接使用随机的“autoconf 临时”地址,该地址不时更改。好的!但是对于传入的连接(在我的路由器中打开时),我仍然可以使用 `autoconf` 地址。我不介意在 DNS 记录中公开它(尽管我什至可以以某种方式为此选择另一个地址)。 (2认同)