Tips en Trucs 2015

MAC naar IP adres

De DHCP server op uw router zorgt dat elke netwerkkaart een IP adres krijgt, waardoor het toestel automatisch in het netwerk wordt opgenomen. Dit is handig, maar heeft één groot nadeel: eenzelfde netwerkkaart kan bij het opstarten van het apparaat telkens een ander IP adres krijgen. Dit is vooral een probleem als je scripts schrijft om bijvoorbeeld back-ups op een bepaald toestel op te slaan. Elke netwerkkaart heeft echter een uniek MAC adres. M.a.w. als we via het MAC adres het toegewezen IP adres kunnen achterhalen, kunnen we zonder vaste IP adressen te gebruiken toch het IP adres van onze back-up server achterhalen.

MAC adres

MAC staat voor "Media Access Control" en wordt ook wel hardware-adres of fysiek adres genoemd. Het zorgt ervoor dat apparaten in een ethernet-netwerk met elkaar kunnen communiceren. Vrijwel ieder netwerkapparaat heeft een vast, door de fabrikant bepaald MAC-adres.

Om het MAC adres van een netwerkkaart te achterhalen, gebruik je de volgende opdracht:

dany@linux-u6r3:~> ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 64:70:02:11:f2:5f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.4/24 brd 192.168.1.255 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet 192.168.1.7/24 brd 192.168.1.255 scope global secondary enp3s0
       valid_lft forever preferred_lft forever
    inet 192.168.1.8/24 brd 192.168.1.255 scope global secondary dynamic enp3s0
       valid_lft 7098sec preferred_lft 7098sec
    inet 192.168.1.10/24 brd 192.168.1.255 scope global secondary enp3s0
       valid_lft forever preferred_lft forever
    inet6 fe80::6670:2ff:fe11:f25f/64 scope link 
       valid_lft forever preferred_lft forever
3: eno1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 4c:72:b9:62:8f:c4 brd ff:ff:ff:ff:ff:ff
4: wlp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether f4:b7:e2:bf:ff:91 brd ff:ff:ff:ff:ff:ff

Deze computer heeft drie netwerkkaarten. lo (localhost) is namelijk geen fysieke netwerkkaart, maar een virtuele netwerkkaart die vooral gebruikt wordt om binnen het besturingssysteem te communiceren met processen, programma's, enz. De twee verbindingen waarvan de namen beginnen met en zijn twee ethernet netwerkkaarten, waarvan enkel de eerste (enp3s0) op het netwerk is aangesloten. De wlp4s0 netwerkverbinding is een WiFi verbinding die niet met een Access Point is verbonden.

De MAC adressen kan je vinden op de regel die begint met link/ether. Zo heeft de enp3s0 netwerkverbinding het MAC adres 64:70:02:11:f2:5f.

Address Resolution Protocol

ARP (Address resolution Protocol), is een protocol binnen TCP/IP dat computers - die allemaal op hetzelfde netwerk (meer specifiek: LAN) zijn aangesloten - in staat stelt het unieke hardware-adres (MAC-adres) van een andere PC binnen dat netwerk te leren, aan de hand van het IP-adres van deze PC. De implementatie van ARP is gebaseerd op de standaard beschreven in RFC 826 uit 1982. Indien een computer eenmaal met een andere computer een netwerkverbinding heeft opgebouwd, wordt de ARP informatie op beide computers opgeslagen om toekomstige netwerkverbindingen vlotter te laten verlopen. Deze opgeslagen ARP informatie kan je met de arp opdracht opvragen:

dany@linux-u6r3:~> /sbin/arp -an
? (192.168.1.3) at 00:50:b6:6b:4f:28 [ether] on enp3s0
? (192.168.1.1) at 00:26:91:a5:12:34 [ether] on enp3s0
? (192.168.1.5) at e0:69:95:6f:24:e5 [ether] on enp3s0
? (192.168.1.2) at <incomplete> on enp3s0
Tussen haakjes staat het IP adres, na de at het bijhorende MAC adres van de netwerkkaart.

Met elk netwerkapparaat een verbinding opbouwen

Aangezien de ARP tabel enkel informatie bevat van netwerkapparaten waarmee het systeem reeds een netwerkverbinding heeft opgebouwd, moeten we in ons script met elk apparaat een korte netwerkverbinding proberen op te zetten. De meest voor de hand liggende opdracht daarvoor is de ping opdracht. In het script testen we eerst of de ARP informatie ons MAC adres reeds kent. Indien dit niet het geval is, wordt een ping opdracht losgelaten op elk mogelijk IP adres in ons netwerk (192.168.1.2 tot 192.168.1.255). De eerste drie getallen bepalen het netwerk (192.168.1), het laatste cijfer een apparaat. Het apparaat met IP adres 192.168.1.1 is mijn router en moet dus niet getest worden. Indien de ping opdracht een netwerkverbinding heeft opgebouwd naar een netwerkkaart met het betreffende MAC adres, wordt de zoektocht stopgezet en het MAC adres weergegeven.

Het script

Met de nodige filtering (grep, head, awk en sed pipe opdrachten) filteren we de gewenste informatie uit de uitvoer van arp opdracht.

#!/bin/bash
macadres=00:50:b6:6b:4f:28
ipadres=`/sbin/arp -an | grep $macadres | head -1 | awk '{print $2}' | sed 's/[()]//g'`
if [ ${#ipadres} -eq 0 ]; then
  for i in {2..255}
  do
    ping -c 1 192.168.1.$i
    if [ $? == 0 ]; then
      ipadres=`/sbin/arp -an | grep $macadres | head -1 | awk '{print $2}' | sed 's/[()]//g'`
      if [ ${#ipadres} -ne 0 ]; then
	break
      fi
    fi
  done
fi

if [ ${#ipadres} -ne 0 ]; then
  printf "\033[1;32;40mDe netwerkkaart met het MAC adres $macadres is bereikbaar via het IP adres $ipadres.\033[0m\n" # Groene letters op zwarte achtergrond
else
  printf "\033[1;31;40mDe netwerkkaart met het MAC adres $macadres is niet bereikbaar.\033[0m\n" # Rode letters op een zwarte achtergrond
fi
MAC naar IP