Wielu administratorów sieci LAN wprowadza filtrację adresów MAC i ustawia reguły przydzielania adresów IP w zależności od adresu fizycznego karty sieciowej. W małych sieciach można zrobić to “na piechotę”, jednak tam gdzie pracuje ponad 200 leniwy inżynier stara się ułatwić sobie życie.

Jednym z rozwiązań jest skorzystanie z dobrodziejstw dynamicznych aplikacji internetowych (PHP + HTML). Stworzymy małą stronę www z formularzem, który pobierze od użytkownika chcącego przyłączyć się do sieci potrzebne dane (np. imię, nazwisko, numer pokoju). Resztę, czyli IP oraz MAC wybierze i pobierze za nas skrypt napisany w PHP.

Zacząłem od instalacji usług WWW na serwerze. Dobrym i szybkim rozwiązaniem jest zainstalowanie pakietu XAMPP.

Język PHP udostępnia funkcję exec, dzięki której będziemy w stanie wykonać na serwerze dowolny program. Załatwi to dla nas poniższy skrypt:

$ip = $_SERVER['REMOTE_ADDR'];
exec('ping '.$ip.' -c 1');
exec('sleep 2s');
exec('arp '.$ip, $answer);
$hostinfo = explode(" ", $answer[1]);
$x=0;
while(count($hostinfo)>$x and !isset($mac)){
            if(eregi('([0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2})',$hostinfo[$x])){
                        $mac=$hostinfo[$x];
            }
            $x++;
        }
if(!isset($mac)) print "Blad pobierania adresu MAC";

Użytkownik odwiedzający naszą stronę przekazuje do skryptu w zmiennej globalnej $_SERVER[‘REMOTE_ADDR’] swój adres IP. Na początek wysyłamy jeden pakiet ICMP Echo Request (ping adres_ip -c 1). Aby się poprawnie skomunikować z hostem użytkownika, serwer za pomocą protokołu ARP wysyła broadcastowe zapytanie o adres MAC komputera o adresie (IP), a następnie po odpowiedzi zapisuje go w swojej tablicy ARP. Możemy go łatwo odczytać wykonując polecenie arp adres_ip. Dane zwrócone przez polecenie arp przekazywane są do zmiennej $answer. Polecenie exec zwraca wyniki w postaci tablicy wielowymiarowej. Pozostaje nam tylko poszukać czy istnieje w niej ciąg tekstowy wyglądający podobnie do MAC. Z pomocą przyjdą nam wyrażenia regularne. Uwaga! Polecenie exec może nie działać, jeśli mamy włączony w php.ini tryb bezpieczny (safe mode). Oczywiście polecenie ARP nie wskaże nam adresu MAC komputerów, które działają poza siecią LAN dlatego, że ARP działa tylko w drugiej warstwie modelu OSI.

Zawartość zmiennej $mac możemy wykorzystać do zapisu jej wraz z $ip do bazy SQL lub gotowego pliku tekstowego, skryptu “zjadliwego” dla naszego serwera.

Poniżej udostępniam małą aplikację webową pobierającą od użytkownika imię, nazwisko, numer pokoju, login, hasło oraz niejawnie adres MAC i IP. Dane z poprawnie wypełnionego formularza wstawiane są do bazy MySQL. Zainteresowani takim rozwiązaniem tabelę przygotują sobie sami. Dla niższego skryptu potrzebna będzie tabela users z kolumnami:

  • users_id (int),
  • users_firstname (char(60)),
  • users_surname (char(60)),
  • users_room (int),
  • users_ip (char(16)),
  • users_mac (char(18)),
  • users_date (datetime),
  • users_login (char(45)),
  • users_password (char(100)).

W zależności od stworzonej tabeli trzeba będzie wprowadzić odpowiednie modyfikacje w skrypcie. Kod można przeanalizować tutaj

Niebawem postaram się udostępnić skrypty pomocne do konwersji danych z bazy do odpowiednich skryptów linuksowych.