MAC address spoofing (简体中文)

From ArchWiki

这篇文章文章将会介绍几个修改 MAC 地址的方法。

手动更改

有两种方法可以修改 MAC 地址:安装并配置 iproute2macchanger。下面来说明一下这两种方法。

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
注意: 在更改 MAC 地址的时候,设备将无法使用(无论是以任何方式连接,或是试图启用这个设备)

自动更改

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-networkddhcpcd (简体中文) 启动之前就已经更改好。

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 配置 来续租。

另见