2013-02-19 8 views
23

Os: RedHat Linux Linux verwalten: 2.6.18.8-1 #Finding ursprüngliche MAC-Adresse aus Hardware selbst

Ist dies möglich, MAC-Adresse Form NIC direkt zu lesen? Ich habe unten Code, aber es nur von oben Schicht lesen, aber nicht die Karte selbst !!!

Ich versuche herauszufinden, wie Sie die ursprüngliche MAC-Adresse eines Ethernet-NIC auf meiner Linux-Box finden. Ich verstehe, wie Sie die aktuelle MAC-Adresse mit ifconfig finden, aber wenn die Adresse geändert wurde, sagen Sie mit 'ifconfig eth0 hw ether uu:vv:ww:yy:xx:zz', oder ich setze "permanent" es mit vi /etc/sysconfig/network-scripts/ifcfg-eth0 .Diese Datei ... Ich kann erfolgreich UP es in REBOOT auch. Wie finde ich das Original? Es muss einen Weg geben, es zu finden, weil es immer noch permanent in die Karte gebrannt wird, aber ich finde kein Werkzeug, um die eingebrannte Adresse zu lesen. gibt es irgendein Dienstprogramm für es oder Befehl dafür? Ich denke, C-Code dafür zu schreiben. aber ich weiß nicht, wie ich das im obigen Fall machen soll.

** Code unten meinen aktuellen MAC gibt aber nicht original MAC

#include <stdio.h>    /* Standard I/O */ 
#include <stdlib.h>    /* Standard Library */ 
#include <errno.h>    /* Error number and related */ 


#define ENUMS 
#include <sys/socket.h> 
#include <net/route.h> 
#include <net/if.h> 
#include <features.h>   /* for the glibc version number */ 
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1 
#include <netpacket/packet.h> 
#include <net/ethernet.h>  /* the L2 protocols */ 
#else 
#include <asm/types.h> 
#include <linux/if_packet.h> 
#include <linux/if_ether.h>  /* The L2 protocols */ 
#endif 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#include <sys/un.h> 
#include <sys/ioctl.h> 
#include <netdb.h> 


int main(int argc, char * argv[]){ 

unsigned char mac[IFHWADDRLEN]; 
int i; 
    get_local_hwaddr(argv[1], mac); 
    for(i = 0; i < IFHWADDRLEN; i++){ 
     printf("%02X:", (unsigned int)(mac[i])); 
    } 

} 


int get_local_hwaddr(const char *ifname, unsigned char *mac) 
{ 
    struct ifreq ifr; 
    int fd; 
    int rv;      // return value - error value from df or ioctl call 

    /* determine the local MAC address */ 
    strcpy(ifr.ifr_name, ifname); 
    fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); 
    if (fd < 0) 
     rv = fd; 
    else { 
     rv = ioctl(fd, SIOCGIFHWADDR, &ifr); 
     if (rv >= 0)   /* worked okay */ 
      memcpy(mac, ifr.ifr_hwaddr.sa_data, IFHWADDRLEN); 
    } 

    return rv; 
} 
+2

Nur weil es dort verbrannt wird, bedeutet es nicht, dass es verfügbar sein muss. Ich weiß nicht, wie Linux und die Karten funktionieren, aber es wäre völlig plausibel, wenn der MAC nur bei einem Neustart wiederhergestellt würde, wenn die Firmware der Karten initialisiert wird. –

+0

Ich möchte nur meine Maschine mit SPOOFED MAC UP und ich kann es erfolgreich machen. aber währenddessen möchte ich meinen originalen MAC für meine Anwendung. Das ist mein Problem. –

+0

Ich denke, dass @AmigableClarkKant schlägt vor, dass ein vollständiger Energiezyklus die NIC initialisieren kann von der Firmware. Starten Sie nicht einfach neu. Herunterfahren, warten, einschalten. Das könnte den NIC mit seiner ursprünglichen MAC-Adresse neu starten. Dann könnten Sie die ursprüngliche MAC-Adresse abrufen und speichern, bevor Sie sie zur Laufzeit ändern. –

Antwort

7

Nun, die alte Ethernet-Adresse bleibt in dem ersten Bytes der Karte eeprom (zumindest für einige Arten von Karten), so ist es möglich, sie zu extrahieren mit ethtool

bash$ sudo ethtool -e eth1 
Offset  Values 
------  ------ 
0x0000  tt uu ww xx yy zz 79 03 
0x.... 

wo tt: uu: ww: xx: yy: zz ist alt mAC-Adresse

+0

Guter Punkt ..... –

+1

Selbstverständlich nimmt das an, dass Sie physischen Zugang zur Netzwerkkarte haben. Als ich dasselbe auf meinem XEN-basierten Fedora 17 [also mit RedHat Linux] versuchte, selbst in der privilegierten Domäne, heißt es "Keine EEPROM-Daten verfügbar". –

+0

Dieses Tool ist nicht nützlich für den allgemeinen Fall, es funktioniert nicht für mich auch und mein anderes Problem ist, ich kann nicht "Sudo" verwenden ... !! –

7

Die einzige Möglichkeit, die ursprüngliche MAC-Adresse zu finden, ist die gleiche Methode wie der Netzwerkkartentreiber - leider glaube ich nicht, dass es eine generische Möglichkeit gibt, dem Treiber mitzuteilen, dass er seine MAC-Adresse zur Verfügung stellen soll. . Natürlich gibt es Fälle, in denen es keine Hardware-Netzwerkkarte für diese bestimmte Schnittstelle gibt - virtuelle Netzwerktreiber für die Virtualisierung und wenn beispielsweise Brücken und Software-Switches verwendet werden.

Und natürlich kann die Hardware so sein, dass Sie nicht wirklich die "ursprüngliche" MAC-Adresse lesen können, wenn sie von Software überschrieben wurde, da es nur einen Satz von Registern für die MAC-Adresse selbst gibt.

Ich hatte einen kurzen Blick auf die pcnet32.c-Treiber (weil es eines der Modelle der Netzwerkkarte ist, dass ich eine ungefähre Ahnung habe, wie es funktioniert und wo die verschiedenen Register usw. sind, damit ich sehen kann, was es tut). Soweit ich sehen kann, unterstützt es keine Methode, um tatsächlich zu fragen, "was ist Ihre PROM-Ethernet-Adresse" - die MAC-Adresse wird während des Abschnitts "Probe1" der Modulinitialisierung ausgelesen und gespeichert. Es wird kein weiterer Zugriff auf diese Hardwareregister vorgenommen.

+0

Die einzige Möglichkeit besteht darin, alle Netzwerktreiber zu patchen. Aber da das sowohl verrückt als auch sudo ist, ist es ein Nein. Kurze Antwort: unmöglich. –

+0

Auch das Patchen aller Netzwerktreiber funktioniert nur für REAL HARDWARE-Netzwerkkarten. Das ist nicht unbedingt, was Ihre "Maschine" hat, wenn es eine virtuelle Maschine ist, oder wenn es etwas exotischere Arten der Netzwerk-Softwareverarbeitung gibt, die eine Software-Netzwerkschnittstelle zum Schalten/Überbrücken/etc. Verwendet. –

+0

Absolut zutreffend. –

37

Sicher in ethtool 3.1 können Sie einfach die Adresse drucken: ethtool -P | --show-permaddr DEVNAME anzeigen permanente Hardware-Adresse

z.B.

ethtool -P eth0 

Permanent-Adresse: 94: de: 80: 6a: 21: 25

+3

Beste Antwort; Um den C-Code zu sehen, suchen Sie 'do_permaddr' in [ethtool.c'] (http://git.kernel.org/cgit/network/ethtool/ethtool.git/tree/ethtool.c). – bufh

+0

Nachdem neue Namensschemata veröffentlicht wurden: ** ethtool -P wlp1s0 ** funktioniert als Ersatz, wenn Sie mit WLAN verbunden sind – user2925949

5

Dies kann nicht die programmatische Art und Weise sein, aber warum nicht dmesg suchen. Alle NICs meiner Maschinen geben die MAC-Adresse zur Erkennungszeit aus.

so etwas wie dieses Versuchen:

dmesg|grep eth0 

Verschiedene NICs unterschiedlich die MAC-Adresse angezeigt werden, aber das Protokoll wird immer den Kernel angegebenen Namen des Adapters enthält (in den meisten Fällen eth0 oder wlan0).

+0

Mein NIC hat nicht einmal einen Schnittstellennamen wie 'eth0'.Der Kernel verwaltet es nicht; Intel DPDK ist. Wie bekomme ich dann die MAC-Adresse? – sudo

14

Versuchen Sie cat /sys/class/net/eth0/address oder cat /sys/class/net/em1/address, wenn Sie Fedora verwenden. Es sollte funktionieren.

Die ursprüngliche Antwort ist hier: Notes of a Systems Admin

+2

Das ist nicht das permanente/Original-Mac (wenn es geändert wurde). Es ist die temporäre oder aktuelle MAC-Adresse. –

-1

Dieser Befehl listet alle Ethernet-Geräte und original HW-Adressen.

dmesg | grep eth | grep IRQ | awk {'print "permanent address of " $5 " " $9'} |tr "," " "