Inhaltsverzeichnis

MAC-Adresse einer Netzwerkkarte im NVRAM unter Linux ändern

Es gibt Situationen, da reicht die Änderung der MAC-Adresse in der Laufzeit nicht. Z.B. wenn Lizenzen über die MAC-Adresse im NVRAM der Netzwerkkarte geprüft werden. Für diese Fälle ist diese Anleitung geschrieben.

Diese Anleitung ist Änderung in Hardware und kann zum Totalverlust der Hardware führen. Die Verantwortung liegt absolut beim Nutzer, ob er das hier beschriebene Prozedere durchführt.

Da es relativ einfach und gut dokumentiert ist, wird die Anleitung an einer Intel e1000e Netzwerkkarte beschrieben. Andere Geräte arbeiten ähnlich, aber die notwendigen Informationen muss man sich heraussuchen.

Vorbereitungen

Intel e1000

Intel e1000 und e1000e haben einen NVM Schreibschutz, der beim initialisieren der Netzwerkkarte während des Ladens des Moduls eingeschaltet wird. Das heißt, man kann den nicht im Betrieb ändern, dafür muss die Netzwerkarte Stromlos sein.

  1. fahre den Rechner herunter
  2. starte mit der Kernel Commandline:
    linux e1000e.WriteProtectNVM=0

→ für andere Module/Netzwerkkarten muss man sich die Kernel Dokumentation zu dem Modul anschauen (Im Kernel Source unter Documentation)

Magic Numbers

Wenn Sie in den NVRAM schreiben wollen, benötigen Sie eine MagicNumber, die quasi wie ein Passwort verwendet wird. Diese Nummer wird vom Hersteller der Netzwerkkarte festgelegt und ist im Zweifel ein Geheimnis. Wenn Sie aber ein taugliches Kernel-Modul für Ihre Netzwerkkarte verwenden, also ein solches mit ethtool Interface, dann können Sie die Magic-Number im Kernel Source zur Ihrem Modul finden. Hier der Pfad zu den Treibern: Kernel Source Browser @ GIT.

Magic Numbers werden imm Hexadezimal, daher mit 0x angegeben. Folgend die bekannten Magic-Numbers bzw. ihre Bildungsregel in einer Tabelle.

Hersteller Kartentyp Kernelmodul MagicNumber Beispiel
Intele1000,e1000ee1000,e1000e0x{ProductID}+{VendorID}0x15708086

Vorgang Änderung

  1. Infos über die Netzwerkkarte zwischenspeichern. Darauf achten, dass man in ein schreibbares und permanent abgelegtes (USB-Stick, lokale Platte) Dateisystem schreibt (wenn man z.B. in von einer LiveCD aus arbeitet)
    1. Treiber
      sudo ethtool -i eth0 > /var/log/eth0_info.bup
                 grep -i bus-info /var/log/eth0_info.bup
                 bus-info: 0000:00:1f.6
    2. aktuelle Mac-Adresse zwischenspeichern
      sudo ethtool -P eth0 > /var/log/eth0_MAC.bup
    3. EEPROM-Dump ablegen (hier steht idR (zumindest bei Intel) auch die MAC an Adresse 0x0 in den 1. 6 bytes
      1. lesbar für den Fall das man etwas nachlesen will
        sudo ethtool -e eth0 > /var/log/eth0_eeprom.bup
      2. binär und wiederherstellbar durch direktes schreiben in den NVRAM
        sudo ethtool -e eth0 raw on > /var/log/eth0/eth0_eeprom_raw.bin
    4. zum sichergehen noch einmal das Offset suchen, bei Intel ist von Adresse 0 auszugehen, daher läss man sich mal Adresse 0 anzeigen zum prüfen und Vergleichen mit Punkt b.
      sudo ethtool -e eth0 offset 0x0 length 6
              Offset		Values
              ------		------
              0x0000:		94 c6 91 16 86 de
    5. zum Schreiben in den NVRAM benötigt man eine Magic-Number, ein Passwort sozusagen. Diese ist Herstellerspezifisch. Bei Intel-Karten ist das idR die Kombination 0x(lspci -n :ProduktID+vendorID). Die Magic Number kann dem Treiber Source-Code entnommen werden. FÜr Intel-Karten, die Bus-Nummer aus 1.a mitnehmen und wiefolgt abfragen:
      lspci -n | grep -i 1f.6
              00:1f.6 0200: 8086:1570 (rev 21)
              
      Daher ist die Magic-Number: 0x15708086
  2. nun nur noch eine neue Mac-Adresse aussuchen. Zum Beispiel diese hier 01:02:0a:0b:0c:0d und mit folgendem Befehl auf in den EEProm schrieben. Achte darauf, das du hexadezimale Werte nimmst, sonst zerstörst du das MAC-Format welches später von der KernelFunktion: is_valid_ether_addr() gefressen wird und es wird kein Interface angelegt.
    sudo ethtool -E eth0 magic 0x15708086 offset 0x00 length 1 value 0x01 
    sudo ethtool -E eth0 magic 0x15708086 offset 0x01 length 1 value 0x02 
    sudo ethtool -E eth0 magic 0x15708086 offset 0x02 length 1 value 0x0a 
    sudo ethtool -E eth0 magic 0x15708086 offset 0x03 length 1 value 0x0b 
    sudo ethtool -E eth0 magic 0x15708086 offset 0x04 length 1 value 0x0c 
    sudo ethtool -E eth0 magic 0x15708086 offset 0x05 length 1 value 0x0d

    Es hat sich herausgestellt, dass der Aufruf mit einer Länge von 6 und der kompletten Anzahl der zu ändernden Bits fehlschlägt, daher wird hier jedes Bit einzeln geändert

Hilfe

Bad Address beim Aufruf von ethtool -E

Bis jetzt deutete das immer auf eine fehlerhafte Magic Number hin

Invalid MAC Address

Nachdem man eine neue Mac-Adresse in den NVRAM geschrieben hat und auch keine Fehlermeldung von ethtool bekam, kann es dennoch sein, dass es Quatsch war, was man rein schrieb. Ich „Honk“ hab das auch geschafft und keine Hexadezimalen Werte in den NVRAM geschrieben sondern glatt mal dezimal-Zahlen. Beim nächsten Boot des Systems bemängelte der Kernel: Invalid MAC Address was zur Folge hatte, dass auch kein Interface angelegt wurde, weshalb ich die MAC auch nicht mehr ändern konnte.

Diese Meldung wird von der Methode is_valid_ether_addr() ausgelöst, welche sich in der Datei include/linux/etherdevice.h des Kernels befindet.

Die Lösung sieht wir folgt aus: