MAC-Adressen zufällig ändern

Manchmal kann es vorkommen, dass man die MAC-Adressen aller Interfaces ändern muss.
Um dies zu erleichtern, habe ich ein kleines Script geschrieben, was entweder komplett zufällige Hex-Werte für die MAC-Adressen verteilt oder zumindest einen eingetragenen Hersteller vorgaukelt.

Das Script „changemac.sh“ kann entweder ohne Parameter aufgerufen werden, um zufällige MAC-Adressen zu generieren, oder mit dem Parameter -f inklusive dem Pfad der offiziellen Herstellerliste der IEEE, um bekannte Prefixe zu benutzen.

Dafür ist es sinnvoll, erst einmal diese Liste herunter zu laden:

wget -O /opt/vendor_list http://standards.ieee.org/develop/regauth/oui/oui.txt

Das Skript selbst muss als root ausgeführt werden und es empfiehlt sich, den Aufruf zum Beispiel in der /etc/rc.local zu machen, um bei jedem Start neue MAC-Adressen zu erhalten:

/opt/changemac.sh -f /opt/vendor_list

Zum Kopieren gibt es hier das changemac.sh-Skript:

#!/bin/bash

#
# This script is used to change the MAC addresses
# of all the interfaces on your PC.
# 
# The default usage is to use just random hex codes
# for MAC addresses, but if you would like to use
# prefixes from authorized vendors, you can specify the vendor
# list from ieee.org (http://standards.ieee.org/develop/regauth/oui/oui.txt),
# which you have downloaded before, with the option -f.
#
# So the usage is:
#   ./changemac.sh [-f filename]
#
# Written by Timo Sablowski <timo -at- propriacausa -dot- de>
#

REAL_VENDORS=false
VENDOR_FILE=""

while getopts "f:" OPTION; do
    case ${OPTION} in
	f)
	    REAL_VENDORS=true
	    VENDOR_FILE=${OPTARG}
	    ;;
    esac
done

USERID=`id -u`
if [ ${USERID} -ne 0 ]; then
    echo "Please run the script as root"
    echo "Exiting..."
    exit 1
fi

INTERFACES=`ifconfig | grep "Link encap:Ethernet" | sed 's/ .*//'`
if [ "${INTERFACES}X" = "X" ]; then
    echo "No interfaces found"
    echo "Exiting..."
    exit 1
fi

if [ ${REAL_VENDORS} = true ]; then
    VENDOR_COUNT=`grep \(hex\) ${VENDOR_FILE} | wc -l`
    for INTERFACE in ${INTERFACES}; do
	RANDOM_LINE=`shuf -i 1-${VENDOR_COUNT} -n 1`
	PART123=`grep \(hex\) ${VENDOR_FILE} | sed 's/(hex).*//g' | sed 's/-/:/g' | tr -d ' ' | sed -n "${RANDOM_LINE}p"`
	PART4=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART5=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART6=`xxd -l 1 -ps -c 1 /dev/urandom`

	CURRENT_MAC=`ifconfig ${INTERFACE} | grep "Link encap:Ethernet" | awk '{print \$6}'`
	NEW_MAC="${PART123}:${PART4}:${PART5}:${PART6}"
	echo "Interface ${INTERFACE}:"
	echo -e "\tCurrent MAC: ${CURRENT_MAC}"
	echo -e "\tNew MAC: ${NEW_MAC}"
	ifconfig ${INTERFACE} hw ether ${NEW_MAC}
	RET=$?
	if [ ${RET} -ne 0 ]; then
	    echo -e "\tNot able to set MAC address for interface ${INTERFACE}"
	    echo -e "\tPerhaps it is a problem of the hex value."
	    echo -e "\tPlease try it several times to find a value that is allowed."
	fi
    done
else
    for INTERFACE in ${INTERFACES}; do
	PART1=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART2=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART3=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART4=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART5=`xxd -l 1 -ps -c 1 /dev/urandom`
	PART6=`xxd -l 1 -ps -c 1 /dev/urandom`

	CURRENT_MAC=`ifconfig ${INTERFACE} | grep "Link encap:Ethernet" | awk '{print \$6}'`
	NEW_MAC="${PART1}:${PART2}:${PART3}:${PART4}:${PART5}:${PART6}"
	echo "Interface ${INTERFACE}:"
	echo -e "\tCurrent MAC: ${CURRENT_MAC}"
	echo -e "\tNew MAC: ${NEW_MAC}"
	ifconfig ${INTERFACE} hw ether ${NEW_MAC}
	RET=$?
	if [ ${RET} -ne 0 ]; then
	    echo -e "\tNot able to set MAC address for interface ${INTERFACE}"
	    echo -e "\tPerhaps it is a problem of the hex value."
	    echo -e "\tPlease try it several times to find a value that is allowed."
	fi
    done
fi

echo "Done."
echo "Please check the new MAC addresses via \"ifconfig -a\""
exit 0

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.