在 Ubuntu 16.04 下随机化你的 WiFi MAC 地址

在 Ubuntu 16.04 下随机化你的 WiFi MAC 地址

你的设备的 MAC 地址可以在不同的 WiFi 网络中记录你的活动。这些信息能被共享后出售,用于识别特定的个体。但可以用随机生成的伪 MAC 地址来阻止这一行为。

每一个诸如 WiFi 或者以太网卡这样的网络设备,都有一个叫做 MAC 地址的唯一标识符,如:b4:b6:76:31:8c:ff。这就是你能上网的原因:每当你连上 WiFi,路由器就会用这一地址来向你接受和发送数据,并且用它来区别你和这一网络的其它设备。

这一设计的缺陷在于唯一性,不变的 MAC 地址正好可以用来追踪你。连上了星巴克的 WiFi? 好,注意到了。在伦敦的地铁上? 也记录下来。

如果你曾经在某一个 WiFi 验证页面上输入过你的真实姓名,你就已经把自己和这一 MAC 地址建立了联系。没有仔细阅读许可服务条款、你可以认为,机场的免费 WiFi 正通过出售所谓的 ‘顾客分析数据’(你的个人信息)获利。出售的对象包括酒店,餐饮业,和任何想要了解你的人。

我不想信息被记录,再出售给多家公司,所以我花了几个小时想出了一个解决方案。

MAC 地址不一定总是不变的

幸运的是,在不断开网络的情况下,是可以随机生成一个伪 MAC 地址的。

我想随机生成我的 MAC 地址,但是有三个要求:

  1. MAC 地址在不同网络中是不相同的。这意味着,我在星巴克和在伦敦地铁网络中的 MAC 地址是不相同的,这样在不同的服务提供商中就无法将我的活动系起来。
  2. MAC 地址需要经常更换,这样在网络上就没人知道我就是去年在这儿经过了 75 次的那个人。
  3. MAC 地址一天之内应该保持不变。当 MAC 地址更改时,大多数网络都会与你断开连接,然后必须得进入验证页面再次登陆 - 这很烦人。

操作网络管理器NetworkManager

我第一次尝试用一个叫做 macchanger 的工具,但是失败了。因为网络管理器NetworkManager会根据它自己的设置恢复默认的 MAC 地址。

因为我使用的是 Ubuntu 16.04,网络管理器版本为 1.2,不能直接使用高版本这一新功能。可能网络管理器有一些随机化方法支持,但我没能成功。所以我编了一个脚本来实现这一目标。

幸运的是,网络管理器 1.2 允许模拟 MAC 地址。你在已连接的网络中可以看见 ‘编辑连接’ 这一选项。

网络管理器也支持钩子处理 —— 任何位于 /etc/NetworkManager/dispatcher.d/pre-up.d/ 的脚本在建立网络连接之前都会被执行。

分配随机生成的伪 MAC 地址

我想根据网络 ID 和日期来生成新的随机 MAC 地址。 我们可以使用网络管理器的命令行工具 nmcli 来显示所有可用网络:

  1. > nmcli connection
  2. NAME UUID TYPE DEVICE
  3. GladstoneGuest618545ca-d81a-11e7-a2a4-271245e11a45802-11-wireless wlp1s0
  4. DoESDinky6e47c080-d81a-11e7-9921-87bc56777256802-11-wireless --
  5. PublicWiFi79282c10-d81a-11e7-87cb-6341829c2a54802-11-wireless --
  6. virgintrainswifi 7d0c57de-d81a-11e7-9bae-5be89b161d22802-11-wireless --

因为每个网络都有一个唯一标识符(UUID),为了实现我的计划,我将 UUID 和日期拼接在一起,然后使用 MD5 生成 hash 值:

  1. # eg 618545ca-d81a-11e7-a2a4-271245e11a45-2017-12-03
  2. >echo-n "${UUID}-$(date +%F)"|md5sum
  3. 53594de990e92f9b914a723208f22b3f-

生成的结果可以代替 MAC 地址的最后八个字节。

值得注意的是,最开始的字节 02 代表这个地址是自行指定的。实际上,真实 MAC 地址的前三个字节是由制造商决定的,例如 b4:b6:76 就代表 Intel。

有可能某些路由器会拒绝自己指定的 MAC 地址,但是我还没有遇到过这种情况。

每次连接到一个网络,这一脚本都会用 nmcli 来指定一个随机生成的伪 MAC 地址。

最后,我查看了 ifconfig 的输出结果,我发现 MAC 地址 HWaddr 已经变成了随机生成的地址(模拟 Intel 的),而不是我真实的 MAC 地址。

  1. >ifconfig
  2. wlp1s0 Link encap:EthernetHWaddr b4:b6:76:45:64:4d
  3. inet addr:192.168.0.86Bcast:192.168.0.255Mask:255.255.255.0
  4. inet6 addr: fe80::648c:aff2:9a9d:764/64Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1500Metric:1
  6. RX packets:12107812 errors:0 dropped:2 overruns:0 frame:0
  7. TX packets:18332141 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:11627977017(11.6 GB) TX bytes:20700627733(20.7 GB)

脚本

完整的脚本也可以在 Github 上查看

  1. #!/bin/sh
  2. # /etc/NetworkManager/dispatcher.d/pre-up.d/randomize-mac-addresses
  3. #Configure every saved WiFi connection inNetworkManagerwith a spoofed MAC
  4. # address, seeded from the UUID of the connection and the date eg:
  5. #'c31bbcc4-d6ad-11e7-9a5a-e7e1491a7e20-2017-11-20'
  6. #This makes your MAC impossible(?) to track across WiFi providers,and
  7. #for one provider to track across days.
  8. #For craptive portals that authenticate based on MAC, you might want to
  9. # automate logging in:)
  10. #Note that NetworkManager>=1.4.1(Ubuntu17.04+) can do something similar
  11. # automatically.
  12. export PATH=$PATH:/usr/bin:/bin
  13. LOG_FILE=/var/log/randomize-mac-addresses
  14. echo"$(date): $*"> ${LOG_FILE}
  15. WIFI_UUIDS=$(nmcli --fields type,uuid connection show |grep802-11-wireless |cut'-d '-f3)
  16. for UUID in ${WIFI_UUIDS}
  17. do
  18. UUID_DAILY_HASH=$(echo"${UUID}-$(date +F)"|md5sum)
  19. RANDOM_MAC="02:$(echo -n ${UUID_DAILY_HASH} | sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5/')"
  20. CMD="nmcli connection modify ${UUID} wifi.cloned-mac-address ${RANDOM_MAC}"
  21. echo"$CMD">> ${LOG_FILE}
  22. $CMD &
  23. done
  24. wait

更新:使用自己指定的 MAC 地址可以避免和真正的 intel 地址冲突。感谢 @_fink


via: https://www.paulfurley.com/randomize-your-wifi-mac-address-on-ubuntu-1604-xenial/

作者:Paul M Furley 译者:wenwensnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

猜你喜欢

转载自www.linuxidc.com/Linux/2017-12/149379.htm