# ARP - Address Resolution Protocol _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** ARP отвечает на вопрос «у кого MAC = ?» для конкретного IP в одной сети. Linux хранит результат в neighbor-таблице (`ip neigh`). ## Зачем нужен ARP Сетевая карта думает в [mac-address](/kb/mac-address.md)'ах, не в IP. Чтобы хост A отправил IP-пакет хосту B в **той же подсети**, A должен знать **MAC** B. ARP (RFC 826) - протокол получения этой связки. Алгоритм: 1. A хочет послать на `192.168.1.20`. Смотрит в neighbor-таблицу 2. Если записи нет - A шлёт **ARP request** broadcast'ом: «у кого 192.168.1.20? скажите 192.168.1.10 (мой MAC AA:BB:...)» 3. B видит запрос (адресован ему), отвечает unicast'ом: «192.168.1.20 - это `00:1c:42:...`» 4. A кеширует пару IP↔MAC в neighbor-таблицу 5. Теперь A может слать [ethernet-frame](/kb/ethernet-frame.md) напрямую B ARP работает **только внутри одного broadcast-домена** (одна L2-сеть). Через роутер ARP не проходит - там вступает [routing-table](/kb/routing-table.md). ## ARP в IPv6 В IPv6 ARP заменён на **NDP** (Neighbor Discovery Protocol) - концепция та же, но через ICMPv6 и multicast вместо broadcast. Linux объединяет обе таблицы: ```bash 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 ## Команды ```bash ip neigh ``` Текущая ARP/NDP-таблица - что мы знаем про соседей ```bash ip -s neigh show 192.168.1.20 ``` -s: счётчики (сколько пакетов прошло через эту запись) ```bash ping -c 1 192.168.1.20 && ip neigh | grep 192.168.1.20 ``` Сначала пингуем чтобы заполнить ARP, потом смотрим запись ```bash sudo ip neigh flush all ``` Очистить ARP-кеш (полезно при дебаге flapping) ```bash sudo arping -c 3 192.168.1.1 ``` Послать ARP-запрос напрямую - полезно для проверки L2-связности когда ICMP блокирован ## См. также - [IPv4-адресация и CIDR](/kb/ipv4-addressing.md) - [IPv6 - адресация и базовые концепции](/kb/ipv6-basics.md) - [MAC address](/kb/mac-address.md) - [Ethernet frame](/kb/ethernet-frame.md) - [Broadcast-домен - что это и кто в нём живёт](/kb/broadcast-domain.md)