Script/Hardware: Netzwerkports beschriften

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 30.03.2021 15:32:10

Hallo zusammen,

ich würde gerne meine Netzwerkports der Server so beschriften, dass ich auch vom OS aus die Beschriftung der Netzwerkkarte ermitteln kann.

Also sprich: Ich klebe aussen auf der Netzwerkkarte einen Aufkleber mit Etikett XY dran und kann dann vom OS ermitteln, welche Schnittstelle welche Beschriftung hat.

Man kann das natürlich alles manuell machen und sich eine Liste dieser Art machen...

Code: Alles auswählen

IF-Name    Etikett
enp4s0f0   #1
enp4s0f1   #2
enp4s1f0   #3
...
...aber das ist ja manuelle Arbeit.

Meine Idee ist, dazu die MAC-Adresse heranzuziehen. Vielleicht berechne ich einen Hash über die MAC-Adresse und nehme dann die letzten beiden Stellen davon als Beschriftung. Dann habe ich ein generisches Script, dass ich auf jedem Server ausführen kann, dass mir die Beschriftungen der Netzwerkschnittstellen ausgibt. Die Möglichkeit dass die Ausgaben mal kollidieren und mehrere Schnittstellen gleiche Ausgaben erzeugen ist da, aber ich denke gering genug.

Habt Ihr noch eine Idee dazu, wie man so etwas besser machen kann, oder eine Anmerkung, dass da irgend ein Problem dabei ist?
Zuletzt geändert von heisenberg am 30.03.2021 16:23:43, insgesamt 2-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 30.03.2021 15:56:46

So ungefähr...

Code: Alles auswählen

#!/bin/bash

 LC_ALL=C
     IP=/sbin/ip
ETHTOOL=/usr/sbin/ethtool

NEEDED_PROGS=($IP $ETHTOOL awk md5sum)

export LC_ALL IP ETHTOOL NEEDED_PROGS

get_interfaces() {

        local if
        for if in $($IP a | awk -F: '$1>0 {printf "%s",$2} END {print ""}' );do 
                echo $if
        done 

}

get_physical_interfaces() {
        local if
        for if in $(get_interfaces|sort);do
                # Every physical network port must have at least one Port-Type listed in the line "Supported ports" output from ethtool
                $ETHTOOL $if 2>&1 | awk -vifname=$if '/Supported ports:\s+\[\s+[^\s\[]+\s+\]/ { print ifname }'
        done
}

get_mac_address() {
        local if="$1"
        $ETHTOOL -P $if | awk '{print $NF}'
}

script_init() {

        local prog
        local err=0

        for prog in ${NEEDED_PROGS[@]};do 
                if ! type $prog &>/dev/null; then
                        echo "needed prog $prog can not be found"
                        ((err++))
                fi
        done
        if [ $err -gt 0 ] ;then
                echo -e "aborting\n"           
                exit 1
        fi

}

main() {

        local mac
        local compact_mac
        local label

        script_init

        echo
        printf "%-12s %-17s  %2s\n" Interface MAC-Adresse Label
        echo -e "-------------------------------------\n"
        for if in $(get_physical_interfaces);do
                mac=$(get_mac_address $if)
                compact_mac=${mac//:/}
                label=$(echo -n "$compact_mac" | md5sum | awk '{print substr($1,length($1)-1,2)}' )
                printf "%-12s %17s  %2s\n" "$if" "$mac" "$label"
        done
        echo
}

main
Ausgabe

Code: Alles auswählen

# iflist

Interface    MAC-Adresse        Label
-------------------------------------

enp5s0f0     00:15:17:a5:2f:75  ea
enp11s0f0    00:30:48:f3:6d:ce  1b
enp5s0f1     00:15:17:a5:2f:74  0e
enp11s0f1    00:30:48:f3:6d:cf  4a
enp4s0f0     00:15:17:a5:2f:77  25
enp4s0f1     00:15:17:a5:2f:76  f0
EDIT: MAC-Adresse jetzt aus ethtool ermittelt, weil /sbin/ip die aktiv zugewiesene zurückliefert und die kann manchmal geändert worden sein - z. B. bei Bonding.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 30.03.2021 16:37:27

Man könnte auch seine eigene Hashingfunktion basteln. md5sum nutzt ja nur Ziffern und Hex-Kleinbuchstaben. Mit dem kompletten Alphabet und evtl. Groß- und Kleinschreibung hätte man da 62 Zeichen statt 16 und hätte weniger wahrscheinlich Kollisionen.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von reox » 30.03.2021 17:31:49

MAC Adressen sind ja 48bit lang, Die frage ist zB ob dich die OUI auch interessiert - da könntest die Hälfte einsparen.
Mit b64 kommst du von 12 (6) hex chars auf 8 (4) ASCII runter.
heisenberg hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 16:37:27
Man könnte auch seine eigene Hashingfunktion basteln
Ja, vermutlich ähnlich dem Prinzip wie es bei IPv6 link-local addressen angewendet wird. Was du brauchst wäre ein Verfahren, welches bei einer Kollision einen der beiden variiert - und zwar deterministisch.

Was mir aber noch einfallen würde, wäre ein 2D code.

Statt MD5+Abschneiden würde sich vllt auch CRC16 (o.ä.) anbieten.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 30.03.2021 17:35:11

reox hat geschrieben: ↑ zum Beitrag ↑
30.03.2021 17:31:49
Was du brauchst wäre ein Verfahren, welches bei einer Kollision einen der beiden variiert - und zwar deterministisch.
Das mit der Kollision vorher herausfinden wäre aber sehr aufwändig. Da müsste ich ja dann alle Werte für alle MAC-Adressen durchrechnen, verrmutlich öfters im Verlauf des erarbeitens.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von reox » 31.03.2021 08:09:15

Ne vorher brauchst du das ja nicht.
Als einfaches Beispiel:
du hast Adresse A und erhälst, sagen wir Hash 0x23. Jetzt erkennt dein Tool aber, dass es schon ein 0x23 gibt (durch Adresse B). Dann musst du jetzt einen Mechanismus haben, der deterministisch eine der beiden ersetzt.

Allerdings funktioniert das nur solange nicht später eine neue dazu kommt... Dann hast du das Problem, dass du die Etiketten schon dran hast aber sich ggf ein Name ändert. dH du müsstest das "Alter" der Karte auch irgendwie reinkodieren...

Andererseits, was spricht dagegen die predictable network interface names zu verwenden? Die sind ja meist sehr kurz und sollten die Karte auch eindeutig beschreiben?

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 31.03.2021 12:03:03

reox hat geschrieben: ↑ zum Beitrag ↑
31.03.2021 08:09:15
Allerdings funktioniert das nur solange nicht später eine neue dazu kommt... Dann hast du das Problem, dass du die Etiketten schon dran hast aber sich ggf ein Name ändert.
Das ist so der erwartbare Normalfall, dass Karten gegen andere Karten ausgetauscht werden, oder auch mal neue Karten dazu kommen. Aber gut, wenn das passiert, dann ist der Server ohnehin offen. D. h. es wäre dann nicht so schlimm ggf. die Labels zu erneuern.
Andererseits, was spricht dagegen die predictable network interface names zu verwenden? Die sind ja meist sehr kurz und sollten die Karte auch eindeutig beschreiben?
Die Namen sind zu lang. Am liebsten hätte ich gerne 1 Zeichen. 2 Zeichen gehen gerade noch so. Da ist üblicherweise sehr wenig Platz zum kleben. Weiterhin sind predictable interface names nicht unter jedem eingesetzten OS vergeben.

reox
Beiträge: 2515
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von reox » 31.03.2021 21:21:56

Ich frag mich grad ob nicht das letzte Byte der MAC nicht schon ausreicht. Wie viele NICs erwartest du dir denn so im Mittel?

Aber zu dem CRC:
Ich hab zum testen mal eine Liste von allen MACs die mein DHCP Server noch in den leases hatte angeschaut und von der MAC einen CRC8 ausgerechnet und mit base85 in zwei Zeichen umgebaut. (ok Hex würde da eh auch gehen...)
damit komm ich bei 78 MACs auf 69 unique CRC - also gute 10% Kollision.

Mit CRC16 kommt man auf 3 Zeichen (da ist eine Einsparung von einem zeichen gegenüber HEX) aber da hab ich soagar 10 Kollisionen.

Benutzeravatar
heisenberg
Beiträge: 4123
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Script/Hardware: Netzwerkports beschriften

Beitrag von heisenberg » 01.04.2021 15:55:20

reox hat geschrieben: ↑ zum Beitrag ↑
31.03.2021 21:21:56
Ich frag mich grad ob nicht das letzte Byte der MAC nicht schon ausreicht. Wie viele NICs erwartest du dir denn so im Mittel?
Normalerweise sind es so 2-4. Es können schon aber auch mal 10 sein.

Danke für Dein Engagement bisher!

Antworten