Jak przypisać losowy adres MAC do interfejsu

Spis treści

Interfejsy kart sieciowych, które są instalowane w komputerach, posiadają adres MAC (Media Access Control). Jest to unikalny identyfikator, który wyróżnia nasz komputer spośród tłumu. Na podstawie tego adresu można nie tylko określić markę sprzętu, którą się posługujemy ale także można sklasyfikować cały nasz ruch sieciowy. W ten sposób bardzo prosto możemy zostać zidentyfikowani wymieniając dane przez darmowe hotspoty sieci bezprzewodowych WiFi. Niemniej jednak, jesteśmy się w stanie obronić przed tego typu inwigilacją zmieniając adres MAC naszego komputera. Nie jest to zbytnio trudne ale trzeba uważać, by znowu nie przesadzić w drugą stronę i czasem nie zostać zidentyfikowanym przez naszą "odmienność". W tym wpisie postaramy się wypracować taki mechanizm, który zmieni nam adres MAC przy każdym podłączeniu do sieci i przy zachowaniu zdroworozsądkowych zasad.

Jak wygląda adres MAC i gdzie go szukać

Zanim zmienimy adres MAC naszego komputera, musimy pierw poznać go nieco dokładniej. Przede wszystkim, musimy ustalić jakim adresem posługuje się maszyna, którą podłączamy do sieci. Na linux'ie służą do tego zwykle dwa narzędzia ifconfig oraz ip . Oczywiście można ten MAC odczytać również z narzędzi graficznych, jak np. network-manager. My tutaj ograniczymy się jednak tylko do narzędzi konsolowych wymienionych wyżej. Poniżej jest fotka przedstawiająca szereg interfejsów sieciowych. Widnieją tam także adresy MAC:

statystyki-interfejsow-sieciowych-adres-mac

Adresy MAC są zaraz obok link/ether . I tak dla przykładu, interfejs eth0 dysponuje adresem MAC f6:3a:37:fa:20:40 , natomiast interfejs wwan0 ma przypisany adres f2:f5:ed:74:0b:18 . Wyżej widzimy, że trzy interfejsy mają ten sam MAC. Nie jest to błąd, a jedynie specyfikacja konfiguracji, która jest używana na tej maszynie, konkretnie bonding.

Adres MAC ma 6 bajtów, czyli 48 bitów. Pierwsze trzy oktety określają producenta sprzętu. Natomiast ostatnie trzy są losowo przypisywane do konkretnego urządzenia. Obecnie powoli odchodzi się od tych 48-bitowych adresów, na rzecz 64-bitowych, gdzie w dalszym ciągu identyfikator producenta ma taką samą długość (24 bity) ale identyfikator urządzenia ma już tych bitów 40.

Na necie można się spotkać z licznymi sposobami generowania losowych adresów MAC. Problem w tym, że te rozwiązania często generują również całą masę niewłaściwych adresów, których system nie chce zaakceptować. Jeśli spróbowalibyśmy taki adres wskazać systemowi, ten zwróci nam komunikat: RTNETLINK answers: Cannot assign requested address . Poniżej znajduje się fotka, która rozjaśni nam nieco sytuację i wyjaśni dlaczego nie wszystkie adresy się nadają do wykorzystania (źródło):

specyfikacja-adres-mac

Pierwsze dwa bity decydują o tym, czy dany adres MAC jest do wykorzystania, czy też nie. Bit 1 odpowiada za określenie czy ten adres jest typu rozgłoszeniowego (broadcast). Wszystkie adresy MAC stosowane w komputerach powinny być unicast'owe. Dlatego też pierwszy bit musi być ustawiony na 0 . Z kolei drugi bit informuje czy adres MAC jest zarządzany lokalnie, tj. czy administrator systemu/sieci go przypisał. Jeśli tak, to może on nie być unikatowy. Ten bit możemy ustawić zarówno na 0 jak i 1 . Niemniej jednak, jeśli chcemy ustawić losowy adres, to dobrze jest przestawić ten bit na 1 .

Wady i zalety losowego MAC

Jeśli chcemy korzystać z losowego adresu MAC, to musimy zdawać sobie sprawę, że niesie to ze sobą pewne następstwa. Przede wszystkim, jeśli w danej sieci lokalnej, do której jesteśmy podłączeni, znajdzie się druga maszyna o takim samym MAC, to wystąpią problemy z komunikacją. Na szczęście, taki schemat jest bardzo mało prawdopodobny. Idąc dalej, trzeba wziąć pod uwagę serwer DHCP. Te z reguły przypisują statyczne lease w zależności od przesłanego adresu MAC. Może się zdarzyć taka sytuacja, że nie będziemy mogli zwyczajnie otrzymać adresacji, bo ten adres MAC nie został uwzględniony na serwerze DHCP. Ta sytuacja też raczej nam nie grozi, no chyba, że logujemy się do jakiejś sieci prywatnej. Niemniej jednak, przeznaczeniem losowych adresów MAC są zwykle darmowe sieci WiFi, do których może się zalogować każdy i tam nie powinniśmy takich problemów w ogóle napotkać. Trzeba pamiętać też, że jeśli będziemy się łączyć w swojej sieci domowej, to również tutaj zostanie przydzielony inny adres MAC, co nie zawsze jest pożądane. Dobrze jest zatem zmienić adres MAC tylko w stosunku do określonych interfejsów, np. wwan0 . Przykładowo, modemy LTE zwykle udostępniają połączenie po interfejsie ppp0 lub wspomnianym wwan0 . Przy pomocy takiego modemu LTE zawsze będziemy logowani do BTS'a operatora GSM i w takim przypadku, bez problemu możemy posługiwać się losowym adresem MAC.

Jak wygenerować losowy adres MAC

Ten adres MAC, który za moment wygenerujemy, będzie czysto losowy ale zostanie też na niego nałożony filtr uwzględniający te powyższe założenia. W efekcie wynikowy MAC będzie nieco inny od tego wygenerowanego losowo. Niemniej jednak, można powiedzieć, że ten adres będzie w znacznym stopniu losowy. Przede wszystkim, musimy utworzyć sobie skrypt i wrzucić do niego tę poniższą zawartość:

#!/bin/sh

[ "$IFACE" != "lo" ] || exit 0

macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/:::::/')

lastfive=$( echo "$macaddr" | cut -d: -f 2-6 )
firstbyte=$( echo "$macaddr" | cut -d: -f 1 )

firstbyte=$( printf '%02x' $(( 0x$firstbyte & 254 | 2)) )

newmac="$firstbyte:$lastfive"

echo "Setting a new MAC address $newmac ..."

ip link set dev $IFACE address $newmac

exit 0

Na samym początku mamy warunek, który omija tworzenie losowego adresu MAC dla pętli zwrotnej, tj. interfejsu lo . Następnie generujemy losowy adres i umieszczamy go w zmiennej $macaddr . Kolejne dwie linijki kroją ten adres, w taki sposób, by wyselekcjonować pierwszy bajt. Dalej odbywa się całą magia. Mamy dwie operacje na bitach. Pierwsza z nich to logiczny AND z wartością 254. Natomiast druga to logiczny OR z wartością 2. Dla przykładu załóżmy, że pierwszy bajt adresu MAC to 07 . Wartość binarna, to 00000111 z kolei 254 binarnie, to 11111110 . Przeprowadzamy operację AND, czyli jeśli mamy dwa bity o wartości 1 , to w wyniku również będzie 1 . W każdym innym przypadku będzie 0:

11111110
00000111
-------- AND
00000110

Tak otrzymaną wartość poddajemy operacji OR z wartością 2, binarnie 00000010 . Tutaj z kolei tylko wartości dwóch bitów wskazujących na 0 dadzą w wyniku 0 . W każdym innym przypadku mamy mamy 1 :

00000110
00000010
-------- OR
00000110

W rezultacie otrzymujemy wartość 06 i to jest pierwszy bajt naszego losowego MAC. Więcej informacji o operacjach logicznych można znaleźć tutaj.

Aplikowanie nowego adresu MAC przy podłączeniu do sieci

Wyżej zaprojektowaliśmy sobie milusi skrypt, który możemy wykorzystać w procesie nawiązywania połączenia. W zależności od wykorzystywanego oprogramowania, ten powyższy plik będzie trzeba umieścić w innym miejscu. Na debianie przy korzystaniu z pakietu ifupdown , skrypt wrzucamy do katalogu /etc/network/if-pre-up.d/ . Jak nazwa wskazuje, skrypty w tym katalogu wykonają się tuż przed podniesieniem interfejsu sieciowego i pobraniem adresacji. Tylko w takim stanie interfejsu można zmienić jego adres MAC.

Należy pamiętać, by skrypt nie posiadał żadnego rozszerzenia, typu .sh , bo wtedy nie zostanie wzięty pod uwagę. Podobnie trzeba pilnować odpowiednich praw, zwłaszcza upewnić się, że skrypt ma atrybut wykonywalności oraz, że jego właścicielem jest root. Dobrze jest sprawdzić przy pomocy poniższego polecenia, czy skrypt zostanie wykonany. Wszystkie skrypty, które zostaną wyszczególnione po wykonaniu tego polecenia, zostaną także uruchomione przy podnoszeniu interfejsów sieciowych:

# run-parts --test /etc/network/if-pre-up.d/

W zależności od konfiguracji, taki interfejs może się uaktywnić automatycznie po podłączeniu przewodu sieciowego. Można także podnieść go ręcznie przy pomocy ifup eth0 . Za każdym razem, gdy się rozłączymy i połączymy ponownie, adres MAC ulegnie zmianie.

Generowanie losowego MAC za pomocą macchanger

Istnieje także możliwość wykorzystania puli adresów MAC, która jest przypisana do poszczególnych znanych producentów sprzętu. Niemniej jednak, to przedsięwzięcie wymaga dodatkowego oprogramowania w postaci macchanger . Debian dysponuje tym pakietem, zatem nie powinno być problemów z jego instalacją jeśli chcielibyśmy tego typu adresy uzyskać.

Adres MAC, który jest przypisany do urządzenia zawsze będzie widoczny i nigdy nie uda nam się wymazać tej informacji. Możemy jedynie zmylić system i sprawić, by taką błędną informację przesyłał w komunikatach sieciowych. Oryginalny adres można podejrzeć w poniższy sposób:

# macchanger wwan0
Current MAC:   00:1e:10:1f:00:00 (ShenZhen Huawei Communication Technologies Co.,Ltd.)
Permanent MAC: 00:1e:10:1f:00:00 (ShenZhen Huawei Communication Technologies Co.,Ltd.)

Narzędzie macchanger dysponuje kilkoma ciekawymi przełącznikami:

  • -r -- ustawia w pełni losowy adres MAC.
  • -e -- przy ustawianiu MAC, część odpowiedzialna za identyfikację producenta nie zmienia się.
  • -a -- ustawia adres tego samego rodzaju, np. przydzielane będą jedynie adresy MAC kart WiFi.
  • -A -- ustawia adres dowolnego rodzaju.
  • -b -- ma znaczenie tylko przy generowaniu losowego adresu i gdy ta flaga nie zostanie określona, adres MAC będzie miał ustawiony bit lokalnego administrowania.
  • -p -- przywraca fabryczny MAC interfejsu.

Widzimy zatem, że macchanger potrafi nieco lepiej dobrać losowy adres MAC i w sporej części opcja -a lub -A powinna nam zapewnić dostateczne ukrycie. W przypadku korzystania z macchanger naturalnie nie potrzebujemy wyżej omawianego skryptu. Zamiast niego musimy edytować plik /etc/network/interfaces i przy interfejsie sieciowym dopisać dwie dyrektywy: pre-up oraz post-down . Pierwsza z nich zostanie wykonana przed podniesieniem interfejsu, druga zaś po jego położeniu. Poniżej przykład konfiguracji interfejsu wwan0 :

allow-hotplug wwan0
iface wwan0 inet dhcp
    pre-up macchanger -a $IFACE
    ...
    post-down macchanger -p $IFACE

Poniżej fotka obrazująca działający mechanizm zmiany MAC w oparciu o oprogramowanie macchanger :

automatyczna-zmiana-adres-mac-polaczenie

Więcej informacji na temat sposóbu zmiany adresów MAC przy pomocy różnych narzędzi można znaleźć na wiki ArchLinux'a, jak i również na stronie riseup.

Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.