Urządzenia w sieci globalnej łączą się używając adresu IP, jednak IP są zmienne i przypisywane do urządzeń na określony czas (za wyjątkiem mechanizmów pozwalających przypiąć na stałe IP do urządzenia, np rezerwując dla danego MAC konkretne IP w ustawieniach routera).
W sieci lokalnej urządzenia również są identyfikowane poprzez IP, tzn komunikują się wg TCP/IP pomiędzy IP, jednak urządzenie samo w sobie nie posiada czegoś takiego jak adres IP.
Adres IP jest nadawany ręcznie lub automatycznie (DHCP), jednak faktyczne połączenie następuje w najniższych warstwach OSI, pomiędzy urządzeniami znającymi swój adres MAC.
Urządzenie, które chce wysłać dane do innego, ale nie zna jego MAC, znając tylko IP, musi dokonać zamiany IP na MAC. Do tego celu służy protokół ARP. Urządzenie, które nie znam MAC odbiorcy, wysyła do wszystkich urządzeń w sieci lokalnej zapytanie, które można by określić kolokwialnie tak: „Hey, które z was ma przydzielony adres IP <konkretny adres>”? Do wszystkich, to znaczy że w miiejsce adresu MAC odbiorcy wpisuje adres rozgłoszeniowy. Dla MAC ma on postać FF:FF:FF:FF:FF:FF .
Każde urządzenie w sieci lokalnej odbiera ten komunikat i porównuje poszukiwany w nim adres IP ze swoim. Jeśli adresy się zgadzają – odpowiada: „Hej, IP o który pytasz to mój IP, zaś mój MAC to <wartość adresu MAC>”.
W ten sposób urządzenie dowiaduje się, że z adresem IP jest skojarzony adres MAC. Zapamiętuje te dane w swojej tabeli ARP, a gdy następny razem chce wysłać pod ten adres IP -korzysta ze swojej tablicy, nie pytając już do kogo ten IP należy.
przykład tablicy ARP w Linux (Ubuntu):
wiks@dellwiks:~$ arp
Address HWtype HWaddress Flags Mask Iface
192.168.0.65 ether 08:11:96:f0:7e:44 C eno1
_gateway ether 00:25:86:a2:a6:60 C eno1
wiks@dellwiks:~$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.0.65 ether 08:11:96:f0:7e:44 C eno1
192.168.0.1 ether 00:25:86:a2:a6:60 C eno1
tablicę ARP możemy nie tylko oglądać w różny sposób (opcje), ale także modyfikować, np dopisując ręcznie skojarzenia IP – MAC:
wiks@dellwiks:~$ arp -s 192.168.0.199 08:08:08:08:08:08
SIOCSARP: Operacja niedozwolona
ale wymagane są do tego uprawnienia root:
wiks@dellwiks:~$ sudo arp -s 192.168.1.199 08:08:08:08:08:08
wiks@dellwiks:~$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.0.65 ether 08:11:96:f0:7e:44 C eno1
192.168.0.199 ether 08:08:08:08:08:08 CM eno1
192.168.0.1 ether 00:25:86:a2:a6:60 C eno1
Możemy również wpisać pary IP – MAC z pliku – opcja -f.
Wpisy do tabeli ARP są dodawane, gdy urządzenie otrzymuje odpowiedź na wysłane pytanie o MAC dla IP, ale także gdy otrzymuje takie pytanie od innego komputera (bo zawiera ono MAC i IP nadawcy -pytającego).
Wpis w tabeli ARP ma czas, po którym 'znika’. Dla linuxa, czas ten (w sekundach) możemy sprawdzić tak:
cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
60
…albo ustawić tak
wiks@dellwiks:~$ sudo sysctl -w net.ipv4.neigh.default.gc_stale_time=99
net.ipv4.neigh.default.gc_stale_time = 99
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
99
aby sprawdzić jakie opcje oferuje komenda arp:
wiks@dellwiks:~$ arp --help
Usage:
arp [-vn] [<HW>] [-i <if>] [-a] [<hostname>] <-Display ARP cache
arp [-v] [-i <if>] -d <host> [pub] <-Delete ARP entry
arp [-vnD] [<HW>] [-i <if>] -f [<filename>] <-Add entry from file
arp [-v] [<HW>] [-i <if>] -s <host> <hwaddr> [temp] <-Add entry
arp [-v] [<HW>] [-i <if>] -Ds <host> <if> [netmask <nm>] pub <-''-
-a display (all) hosts in alternative (BSD) style
-e display (all) hosts in default (Linux) style
-s, --set set a new ARP entry
-d, --delete delete a specified entry
-v, --verbose be verbose
-n, --numeric don't resolve names
-i, --device specify network interface (e.g. eth0)
-D, --use-device read <hwaddr> from given device
-A, -p, --protocol specify protocol family
-f, --file read new entries from file or from /etc/ethers
<HW>=Use '-H <hw>' to specify hardware address type. Default: ether
List of possible hardware types (which support ARP):
ash (Ash) ether (Ethernet) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) rose (AMPR ROSE) arcnet (ARCnet)
dlci (Frame Relay DLCI) fddi (Fiber Distributed Data Interface) hippi (HIPPI)
irda (IrLAP) x25 (generic X.25) eui64 (Generic EUI-64)
tabela ARP ma swój rozmiar, oraz określone wielkości, wpływające na prace związane z jej oczyszczaniem (garbage colector) – dla Ubuntu & Kali Linux:
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh1
128
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh2
512
wiks@dellwiks:~$ cat /proc/sys/net/ipv4/neigh/default/gc_thresh3
1024
wiks@dellwiks:~$ sudo sysctl -w net.ipv4.neigh.default.gc_thresh1=128
net.ipv4.neigh.default.gc_thresh1 = 128
Powyższa zmiana będzie obowiązywała jedynie do ponownego uruchomienia systemu. Aby zachować taką zmianę na dłużej, należy poczyniść odpowiednie wpisy w /etc/sysctl.conf.
Gdy tablica zostanie wypełniona do wartości maksymalnej -tj: gc_thresh3 w logach systemu pojawi się komunikat:
kernel: [138585.922764] IPv4: Neighbour table overflow
Co stanie się gdy z jakiegoś powodu tablica ARP zostanie wypełniona, a nasze urządzenie będzie chciało połączyć się z innym, którego adres IP ma, ale nie przypisany do MAC?
Nasz komputer, nie mogąc uzyskać adresu MAC odbiorcy, będzie wysyłał informacje na adres rozgłoszeniowy FF:FF:FF:FF:FF:FF – czyli do wszystkich.
Podobnie będzie w przypadku przełącznika/switcha. I to jest jeden ze sposobów, aby będąc w jednym z segmentów sieci – rozdzielonym przełącznikiem od innych, uzyskać podgląd /podsłuch ruchu. Przełacznik będzie wysyłała dane do wszystkich, na adres rozgłoszeniowy, jeśli tablica ARP będzie przepełniona, a nie będzie znał MAC odbiorcy. Taki atak nazywa się MAC flooding.