Зачем нужен ARP
Сетевая карта думает в mac-address'ах, не в IP. Чтобы хост A отправил IP-пакет хосту B в той же подсети, A должен знать MAC B. ARP (RFC 826) - протокол получения этой связки.
Алгоритм:
- A хочет послать на
192.168.1.20. Смотрит в neighbor-таблицу - Если записи нет - A шлёт ARP request broadcast'ом: «у кого 192.168.1.20? скажите 192.168.1.10 (мой MAC AA:BB:...)»
- B видит запрос (адресован ему), отвечает unicast'ом:
«192.168.1.20 - это
00:1c:42:...» - A кеширует пару IP↔MAC в neighbor-таблицу
- Теперь A может слать ethernet-frame напрямую B
ARP работает только внутри одного broadcast-домена (одна L2-сеть). Через роутер ARP не проходит - там вступает routing-table.
ARP в IPv6
В IPv6 ARP заменён на NDP (Neighbor Discovery Protocol) - концепция та же, но через ICMPv6 и multicast вместо broadcast. Linux объединяет обе таблицы:
ip -4 neigh # IPv4 ARP
ip -6 neigh # IPv6 NDP
ip neigh # обе вместе
Состояния neighbor-записи
- REACHABLE - пара IP↔MAC недавно подтверждена
- STALE - давно не подтверждалась, но запись есть
- DELAY / PROBE - переходные, идёт probe чтобы проверить
- FAILED - не ответил, запись помечена как недоступная
Linux сам отмечает STALE → REACHABLE когда видит подтверждающий трафик (например ACK-пакеты от соседа).
ARP-проблемы на проде
- Дубликат IP в одной сети - ARP конфликтует, какие-то хосты пишут
в
dmesg: «duplicate address detected» - Gratuitous ARP при failover (VRRP, keepalived): новый владелец IP шлёт unsolicited ARP чтобы коммутаторы и соседи быстро обновили таблицы
- ARP poisoning - атакующий шлёт фальшивые ARP-replies, перехватывая трафик; защита - статические записи или 802.1x