MAC-Adresse abfragen und setzen

Aus wiki.archlinux.de
Wechseln zu: Navigation, Suche

Jeder Netzwerkadapter besitzt eine theoretisch weltweit einmalige Media-Access-Control-Nummer, die MAC-Adresse. Diese wird benötigt, damit Netzwerkgeräte auf OSI-Layer #2 (siehe Weblinks) explizit adressiert werden können, um Dienste auf höheren Schichten anbieten zu können.

„Ein Switch benötigt aber eine MAC-Adresse, wenn er selbst über das Rechnernetz administriert wird oder Monitoring-Dienste anbietet (zum Beispiel über Telnet, SNMP oder HTTP). Eine MAC-Adresse wird ebenfalls benötigt, wenn Bridges oder Switches den Spanning Tree Algorithmus zur Vermeidung von Schleifen in redundant ausgelegten Rechnernetzen verwenden.“ (Wikipedia)

MAC-Adresse auslesen

Sämtliche Netzwerkgeräteverwaltung geschieht mittels des Tools ip aus dem Paket iproute2, da ifconfig aus dem Paket net-tools als veraltet angesehen wird (siehe Weblinks für eine Liste mit veralteten Netzwerkbefehlen und deren Ersetzungen). In den Beispielen werden 10.10.0.10 als IP des Systems, und enp0s25 als Netzwerkkartenname verwendet, dies ist an das eigene System anzupassen.

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
    link/ether 00:21:9b:13:c4:13 brd ff:ff:ff:ff:ff:ff

Im Beispiel ist das Netzwerk-Interface enp0s25 mit der (für dieses Beispiel ausgedachten) MAC-Adresse 00:21:9b:13:c4:13 vorhanden.

Mittels ip neigh kann zudem geprüft werden, welche Geräte sich noch in der „Netzwerknachbarschaft“ befinden.

ip neigh
10.10.0.100 dev enp0s25 lladdr 00:51:ac:44:8f:1b REACHABLE
10.10.0.12 dev enp0s25 lladdr 00:11:32:08:89:2d REACHABLE
10.10.0.1 dev enp0s25 lladdr bc:05:43:7b:57:e0 REACHABLE

Hier befinden sich drei weitere Systeme im Netzwerk, das über enp0s25 direkt erreichbar ist. Es wird auch für diese Systeme die MAC-Adresse angegeben.

MAC-Adresse ändern

Man sollte die MAC-Adresse nur ändern, wenn man sich sicher ist, warum man dies muss. Im harmlosesten Fehlerfall kommt das System nicht mehr online, aber es kann auch passieren, dass andere Systeme im Netzwerk ausfallen, oder anderweitig gestört werden, wenn man deren MAC-Adresse einstellt.

Um die MAC-Adresse zu ändern, kann man ip link set verwenden. Folgendes Beispiel zeigt dies.

# ip link show enp0s25 | grep ether
link/ether 00:21:9b:13:c4:13 brd ff:ff:ff:ff:ff:ff

# ip link set dev enp0s25 address de:ad:be:ef:13:37

# ip link show enp0s25 | grep ether
link/ether de:ad:be:ef:13:37 brd ff:ff:ff:ff:ff:ff

Das Beispiel zeigt zuerst die originale MAC-Adresse an, setzt dann die neue MAC-Adresse, und zeigt die MAC-Adresse zur Überprüfung nochmals an. Eventuell muss das Netzwerkinterface vor dem Ändern der MAC-Adresse mittels ip link set dev enp0s25 down deaktiviert, und hinterher mittels … up wieder aktiviert werden.

Dauerhaft speichern

Je nachdem, welches System man verwendet, gibt es mehrere Möglichkeiten, die MAC-Adressänderung dauerhaft zu „speichern“. Da man im Regelfall die MAC-Adresse nicht direkt auf der Netzwerkhardware ändern kann, muss man sie bei jedem Start neu definieren.

netcfg

Wenn man netcfg verwendet, kann man den Änderungsaufruf in eine spezielle Variable schreiben.

/etc/network.d/meintollesnetzwerk
INTERFACE="enp0s25"
CONNECTION="ethernet"
IP='static'
ADDR='10.0.0.1'
PRE_UP='ip link set dev enp0s25 address de:ad:be:ef:13:37'

Damit wird die neue MAC-Adresse bei jedem Start des Profils meintollesnetzwerk durch den befehl in PRE_UP gesetzt. Das aktuellere netctl kann derzeit keine Vor-Start-Befehle ausführen.

systemd explizit

Um die MAC-Adresse netzwerkverbindungstoolunabhängig zu setzen, kann man einen systemd-Service verwenden.

/etc/systemd/system/changemac@.service
[Unit]
Description=Change MAC adress
Before=dhcpcd@%i.service

[Service]
Type=oneshot
ExecStart=/usr/bin/ip link set dev %i address de:ad:be:ef:13:37
ExecStart=/usr/bin/ip link set dev %i up

[Install]
WantedBy=network.target

Das obige Beispiel gilt, wenn man DHCP verwendet, und wird mittels systemctl enable changemac@enp0s25 aktiviert.

systemd integriert

Falls man weder netcfg, noch DHCP verwendet, bietet sich folgender Service an.

/etc/systemd/system/network.service
[Unit]
Description=Wired Static IP Connectivity
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-enp0s25.device
After=sys-subsystem-net-devices-enp0s25.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/ip link set dev enp0s25 address de:ad:be:ef:13:37
ExecStart=/usr/bin/ip link set dev enp0s25 up
ExecStart=/usr/bin/ip addr add 10.10.0.10/24 dev enp0s25
ExecStart=/usr/bin/ip route add default via 10.10.0.1

ExecStop=/usr/bin/ip addr flush dev enp0s25
ExecStop=/usr/bin/ip link set dev enp0s25 down

[Install]
WantedBy=multi-user.target

Dadurch wird mittels systemctl enable network nicht nur das Netzwerk an sich eingerichtet (IP ist ggf. an das eigene Netzwerk anzupassen), sondern auch die MAC-Adresse gesetzt, sobald der Service aktiv wird.

Siehe auch

Weblinks