MAC address spoofing (简体中文)
这篇文章文章将会介绍几个修改 MAC 地址的方法。
手动更改
有两种方法可以修改 MAC 地址:安装并配置 iproute2 或 macchanger。下面来说明一下这两种方法。
iproute2
首先,你可以用下面的命令来检查当前的 MAC 地址
# ip link show interface
interface
是你的 网卡 的名字
我们现在要关注的是跟在“link/ether”后面的那一串带冒号的十六进制字节。它看起来可能是这样:
link/ether 00:1d:98:5a:d1:3a
修改 MAC 地址的第一步是禁用网卡,它可以通过下面的命令来完成:
# ip link set dev interface down
接下来,我们要开始修改我们的 MAC 地址。只要每个字节都是十六进制值就可以,但有的网络运营商可能会拒绝为不正确的 MAC 分配 IP 地址。所以,除非你是你连接的网络的管理员,否则你应该使用真实的 MAC 地址前缀(一般是前三个字节),剩下三个字节可以随便设置(只要是十六进制值)。如果想了解更多内容,请访问 Wikipedia:Organizationally unique identifier.
要更改 MAC 地址,我们要运行这个命令:
# ip link set dev interface address XX:XX:XX:XX:XX:XX
这6位 XX:XX:XX:XX:XX:XX
就是你要设置的 MAC 地址。
最后一步是重新启用网卡,输入这行命令:
# ip link set dev interface up
如果你想验证你的 MAC 地址是否成功修改,只需要再次运行 ip link show interface
,然后检查“link/ether”后面的值。如果成功修改,“link/ether”后面应该跟着你刚刚设置的 MAC 地址。
macchanger
另一个方法是通过 macchanger (a.k.a., the GNU MAC Changer)。它有一些方便的功能,比如改变 MAC 地址以匹配某个运营商,或者完全随机化地址。
从官方仓库里安装 这个包 macchanger .
由于更改 MAC 地址基于网卡,我们需要用 网卡名 来替换每行命令中的 interface
。
用这行命令我们可以将 MAC 地址完全随机化:
# macchanger -r interface
要随机化当前 MAC 地址的后三位字节 (这样运营商会认为这个 MAC 地址是注册过的 MAC 地址,就可以避免被断网的风险),你可以运行这个命令
# macchanger -e interface
要把 MAC 地址改成指定的值,请运行:
# macchanger --mac=XX:XX:XX:XX:XX:XX interface
把 XX:XX:XX:XX:XX:XX
改成你想要的 MAC 地址。
最后,如果想把 MAC 地址恢复成出厂值,运行这个:
# macchanger -p interface
自动更改
systemd-networkd
systemd-networkd 支持通过 link files 设置 MAC 地址(细节请查看 systemd.link(5)).
要设置一个静态 MAC 地址,修改这个文件为:
/etc/systemd/network/00-default.link
[Match] MACAddress=原始 MAC [Link] MACAddress=更改后的 MAC NamePolicy=kernel database onboard slot path
如要在每次启动时随机化 MAC 地址,把 MACAddress=更改后的 MAC
改成 MACAddressPolicy=random
。
systemd-udevd
udev (简体中文) 允许你创建 udev 规则 来更改 MAC 地址。使用 address
参数来用原始 MAC 地址来匹配设备,然后用 ip 命令来更改 MAC 地址:
/etc/udev/rules.d/75-mac-spoof.rules
ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="XX:XX:XX:XX:XX:XX", RUN+="/usr/bin/ip link set dev %k address YY:YY:YY:YY:YY:YY"
其中,XX:XX:XX:XX:XX:XX
是原始 MAC 地址,YY:YY:YY:YY:YY:YY
是目标 MAC 地址
systemd 单元
创建单元
下面写了两个用 Systemd (简体中文) 来在启动时更改 MAC 地址的例子,其中一个用 ip 来设置静态 MAC,另一个用 macchanger 来设置随机 MAC。systemd 的 network-pre.target
可以确保 MAC 地址在网络管理器如 netctl (简体中文)、NetworkManager (简体中文)、systemd-networkd 或 dhcpcd (简体中文) 启动之前就已经更改好。
iproute2
设置静态 MAC 地址的 Systemd (简体中文) 单元:
/etc/systemd/system/[email protected]
[Unit] Description=MAC Address Change %I Wants=network-pre.target Before=network-pre.target BindsTo=sys-subsystem-net-devices-%i.device After=sys-subsystem-net-devices-%i.device [Service] Type=oneshot ExecStart=/usr/bin/ip link set dev %i address 36:aa:88:c8:75:3a ExecStart=/usr/bin/ip link set dev %i up [Install] WantedBy=multi-user.target
macchanger
设置随机 MAC 地址的 Systemd (简体中文) 单元,同时保留原始的运营商字节。请确保您已安装了 macchanger:
/etc/systemd/system/[email protected]
[Unit] Description=macchanger on %I Wants=network-pre.target Before=network-pre.target BindsTo=sys-subsystem-net-devices-%i.device After=sys-subsystem-net-devices-%i.device [Service] ExecStart=/usr/bin/macchanger -e %I Type=oneshot [Install] WantedBy=multi-user.target
或者用 -r
选项来使 MAC 地址完全随机化,参见 #macchanger。
启用服务
将所需的网络接口 (如:eth0
) 附加到服务名称后面 (如[email protected]
),然后启用服务.
重启,或者按照适当的顺序重启依赖的服务。如果你是局域网管理员,请通过路由器检查其中的静态或 DHCP 地址表,验证 MAC 是否已成功修改。
netctl 接口
你可以使用 netctl hook 来在每次启动或重启网卡的时候运行特定命令。把 interface
替换为你的网络接口:
/etc/netctl/interfaces/interface
#!/usr/bin/env sh /usr/bin/macchanger -r interface
使脚本可执行:
chmod +x /etc/netctl/interfaces/interface
来源: akendo.eu
NetworkManager
参见 NetworkManager#Configuring MAC address randomization.
故障排除
连接到 DHCPv4 网络失败
如果您无法连接到 DHCPv4网络,而且您使用的是 NetworkManager 默认的 dhcpcd,你可能需要 修改 dhcpd 配置 来续租。
另见
- Wikipedia:MAC spoofing
- Macchanger GitHub page
- DebianAdmin 上的文章 with more macchanger options