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


在我的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)。
  • 普雷斯托: 60:8ff:fe52:f9d8 轉換回MAC地址 02:60:08:52:f9:d8

注:根據Ars Technica的說法,自macOS 10.12 Sierra以來 Apple採用了一種新方法來生成不基於MAC地址的穩定地址Windows顯然已經做了多年。


這個問題是一個 本週超級用戶問題
  閱讀 博客文章 了解更多詳情或 為博客做貢獻 你自己


135
2018-02-09 17:26


起源


哇我不知道關於IPV6,很好找。 - Not Kyle stop stalking me
好吧,當然它顯示了一台Apple電腦。畢竟,這是一個MAC地址。 - Graeme Perrow
@Kronos,博客文章中缺少圖片; blog.superuser.com/2011/02/11/... 在URL中添加“.stack”有助於: i.stack.imgur.com/RNXoA.png - Arjan
...但是,@ KronoS,添加“.stack”實際上使另一個圖像形式相同的博客文章消失了,就像 i.imgur.com/vjK73.png (好的)vs i.stack.imgur.com/vjK73.png (不行)。換句話說:也許吧 所有 博客上當前沒有使用的圖片 .stack 應該重新上傳......? - Arjan
@Arjan我不確定。我將不得不檢查這個。我想要一個功能,即上傳到博客的所有圖像都會自動上傳到堆棧的imgur帳戶。與常規網站目前的情況類似 - KronoS


答案:


這是通過對IPv6的兩個擴展來解決的:

  • RFC 4941 又名“隱私尋址”允許出站連接使用臨時的,隨機生成的地址(每隔幾小時輪換一次)。
  • RFC 7217 允許從不透明的哈希生成主靜態地址,該哈希不會洩露任何信息。

流行的操作系統支持至少一種但是越來越多的方法。

請注意,這些功能是正交的。如果您願意,可以同時使用兩者。

穩定的私人地址

在某些操作系統中,MAC(EUI-48)地址不再用於接口標識符。相反,通常根據RFC 7217使用隨機或基於散列的標識符。

  • 視窗 默認情況下,從Windows Vista開始使用自定義方案。

    要檢查該功能是否處於活動狀態,請運行PowerShell命令:

    Get-NetIPv6Protocol | fl RandomizeIdentifiers
    

    要啟用/禁用該功能:

    Set-NetIPv6Protocol -RandomizeIdentifiers Enabled
    Set-NetIPv6Protocol -RandomizeIdentifiers Disabled
    
  • Linux(NetworkManager) 從NetworkManager 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
    
  • Linux(內核SLAAC) 從內核v4.1.0開始支持RFC 7217;但是,必須通過sysctl存儲秘密種子來手動激活它。

    密鑰是128位十六進製字符串(形狀類似於IPv6地址),必須存儲在 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中所定義,臨時隱私地址是隨機生成的,每隔幾小時輪換一次。

  • 視窗 從Windows XP SP2開始支持臨時地址。

    要啟用/禁用此功能:

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

    請注意,Windows不再使用從Windows Vista開始的基於MAC地址的主地址。

  • Linux(NetworkManager):最近版本的NetworkManager自己處理RA,雖然下面的兩個值與sysctl具有相同的含義(2 =更喜歡隱私地址,1 =更喜歡主地址):

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

    此外,從1.2.0開始,一個更好的模式變得可用,這改變了 主要 地址不再是基於MAC的,而是對每個網絡都是唯一的(RFC 7217):

    (請注意,隱私尋址與addr-gen-mode正交;可以同時使用兩者。)

    附註:從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
    
  • Linux(內核SLAAC) 支持臨時地址,但默認情況下不使用它們。它們可以通過sysctls激活。

    啟用臨時地址並製作它們 首選 用於傳出連接:

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

    要啟用臨時地址生成,請將靜態SLAAC地址保留為首選:

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

    all 要么 default part可以用特定的接口名稱替換;例如 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
    

    臨時地址偏好?我不知道。 autoconf地址似乎是首選。 ifconfig 似乎沒有列出任何地址屬性。

  • 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個設備的網絡中的痛苦。


129
2018-02-09 18:48



對我的Mac和FRITZ!Box 7340路由器的好副作用:我得到兩個地址 ifconfig。傳出連接使用隨機 autoconf temporary 地址,不時變化。好!但是對於傳入連接(在我​​的路由器中打開),我仍然可以使用 autoconf 地址。我不介意在DNS記錄中公開它(雖然我甚至可能以某種方式為此選擇另一個地址)。 - Arjan
啊,之後 域名註冊,垃圾郵件 我們現在收到IPv6垃圾郵件: dig -t AAAA www.v6.facebook.com ;-) - Arjan
@Arjan:IPv6地址沿襲 de4d:b33f 記憶並不是那麼糟糕;此外,他們是由他們的主人,而是 whois 垃圾郵件是a)令人煩惱和b)由無法控制您域名的外人造成的。 - grawity
暫且不說:看起來(某些)上述內容可能會告訴操作系統 比較喜歡 臨時地址, 但應用程序仍然可以覆蓋此首選項。 - Arjan
使用臨時地址(IPv6隱私)的AFAICS實際上不能用於某些ISP,因為路由器通告的荒謬的最短生命週期為40秒,這會覆蓋內核設置。 Linux見 ip a 對於 preferred_lft。所以 ssh 如果啟用此功能,連接將中斷每40秒。它甚至不適用於普通的網絡衝浪者,因為每次下載也必須在40秒內完成。 - Tino


僅供參考,這僅適用於某些IP尋址方案。您(或您的ISP)很可能正在使用IPv6自動配置,這需要首先完成相當大的IP塊。解決方案可能是關閉此功能。您的ISP也可能使用DHCP來分配地址,這仍然可以通過IPv6實現。


1
2018-02-09 20:49



至於大塊:根據 到維基百科 在“一般分配”中: RIR為ISP分配較小的塊,然後將這些塊分配給/ 48個大小的部分給它們的客戶端。實際上,我的ISP還為消費級用戶分配了/ 48前綴。那不是很奇怪嗎? - Arjan
然後責怪維基百科和阿林的選秀 IPv6尋址計劃: 所有客戶都獲得一個/ 48,除非他們能夠證明他們需要超過65k的子網。 但是也: 如果您有許多消費者客戶,您可能希望將/ 56s分配給私人住宅網站  - 這仍然比我多 曾經 需要。 ;-)但是,事情可能會改變:我的ISP永遠不會 許諾 雖然很明顯他們的客戶已經基於此配置了調製解調器/路由器。 - Arjan
我認為當Arin說“客戶”時他們的意思是“ISP”。任何ISP(包括非常非常大的ISP)都可以為整個網絡分配一個/ 64,並完成它。無需進一步的路由。但是,將數万億的IP地址分配給數百萬的喬等普通住宅用戶是非常愚蠢的。 - Ernie Dunbar
顯然, 分配至少一個的一個原因 /56: “只提供單一的ISP /64 完全阻止你進行任何子網劃分。如果說 /64 在WAN接口上,你的LAN上永遠不會得到像樣的IPv6。這是ISP的錯誤,他們應該通過提供相當數量來解決這個問題(/48 要么 /56地址。“ - Arjan
A / 64不是“相當大的塊”;它是 最少 子網的合理分配塊。幾個IPv6功能要求子網為/ 64,並且您已經忘記(或沒有意識到)IPv6的設計在很大程度上是為了防止任何人 曾經 再次耗盡地址。你必須讓自己的思想擺脫需要保存珍貴地址的舊思想;它在IPv6中沒有地位。 - Michael Hampton