在我的 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 的两个扩展解决了这个问题:
流行的操作系统至少支持其中一种方法,但越来越多地同时支持这两种方法。
请注意,这些功能是正交的。如果您愿意,可以同时使用两者。
稳定的私有地址
在某些操作系统中,主接口标识符不再由 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_secret
sysctl 中。为了使其持久,可以将其放入/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-address
为stable
为每个网络设置不同的 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 说明进行操作。
-
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 中仍然是可能的。