Зачем смотреть таблицу соседей
Когда два устройства в одной сети не видят друг друга, а адреса и маски выглядят правильно, полезно заглянуть в таблицу соседей. Это список адресов, для которых система уже выяснила аппаратный адрес. Для IPv4 такую работу делает ARP, для IPv6 механизм обнаружения соседей, а результат в Linux хранится в одной таблице и выводится одной командой.
Команда ip neigh входит в пакет iproute2 и считается современной заменой arp из набора net-tools. Старая утилита в свежих дистрибутивах часто не установлена по умолчанию, зато ip есть почти везде. Если вам нужен общий рассказ о том, как адрес сопоставляется с MAC, он есть на странице про ARP, а здесь разбираем именно вывод и практику.
Таблица заполняется сама: запись появляется после первого обращения к адресу в локальной сети и исчезает по истечении времени, если с этим узлом давно не было связи. Поэтому пустая таблица на только что загруженной машине вполне нормальна. Чтобы увидеть записи, достаточно сначала отправить к нужному узлу пару пакетов, например командой ping.
Как читать вывод построчно
Базовая команда выглядит так: ip neigh show. Можно сокращать до ip n. Каждая строка устроена одинаково, пример (условный): 192.168.1.1 dev eth0 lladdr aa:bb:cc:dd:ee:ff REACHABLE.
- первое поле — IP-адрес соседа;
- dev — интерфейс, через который он достижим;
- lladdr — аппаратный адрес соседа (MAC);
- последнее слово — состояние записи.
Для отдельных семейств адресов используйте ip -4 neigh или ip -6 neigh. Чтобы ограничить вывод одним интерфейсом, добавьте dev: ip neigh show dev wlan0. Название интерфейса узнайте командой ip link или ip addr, она разобрана на соседней странице.
Шлюз по умолчанию почти всегда присутствует в таблице, потому что через него идёт любой исходящий трафик. Если строки со шлюзом нет или рядом с ним стоит FAILED, проблема находится ещё до маршрутизации: на уровне кабеля, Wi-Fi или самого роутера.
Состояния записей и что они означают
Состояние показывает, насколько свежа информация о соседе. Не нужно запоминать всё: достаточно различать «хорошо», «ждём» и «плохо».
| Состояние | Смысл | Нужно ли действовать |
|---|---|---|
| REACHABLE | Недавно получено подтверждение, что сосед отвечает | Нет |
| STALE | Запись есть, но давно не подтверждалась | Обычно нет, проверится при следующем обращении |
| DELAY | Система ждёт, придёт ли подтверждение от верхних уровней | Нет, состояние временное |
| PROBE | Идёт активная проверка узла | Нет, если быстро сменяется |
| INCOMPLETE | Запрос отправлен, ответа ещё нет | Да, если держится долго |
| FAILED | Ответа не получено | Да, проверьте связь с узлом |
| PERMANENT | Запись задана вручную и не устаревает | Только если вы её создавали |
| NOARP | Запись не требует разрешения адреса | Нет |
Две строки с одним и тем же MAC для разных IP не обязательно ошибка: так выглядят, например, устройства за одним мостом или роутером, который отвечает за несколько адресов. А вот когда один IP внезапно получает другой MAC, чем раньше, стоит выяснить причину. Это может быть замена устройства, но иногда так проявляется конфликт адресов или подмена, о которой подробнее написано в материале про ARP spoofing.
Правка таблицы: добавить, удалить, очистить
Изменять таблицу нужно редко, но иногда это помогает проверить гипотезу. Все операции записи требуют прав администратора, поэтому перед командой ставят sudo.
- Очистить записи интерфейса: sudo ip neigh flush dev eth0. После этого система заново выяснит адреса при первом же обращении.
- Удалить одну запись: sudo ip neigh del 192.168.1.50 dev eth0.
- Добавить постоянную запись: sudo ip neigh add 192.168.1.50 lladdr aa:bb:cc:dd:ee:ff dev eth0 nud permanent.
- Заменить существующую: sudo ip neigh replace с теми же параметрами.
Постоянные записи используйте осторожно. Если устройство поменяло сетевую карту, а в таблице остался старый MAC, связь с ним пропадёт, и причина будет неочевидна, пока вы не вспомните о ручной записи. После перезагрузки такие записи исчезают, если вы не сохранили их в настройках сети.
Очистка полезна после замены роутера или смены адреса на соседнем устройстве: система не держит устаревшее соответствие и быстрее переходит к актуальному.
Порядок диагностики, когда сосед недоступен
Если ping до узла в локальной сети не проходит, пройдите по шагам и на каждом смотрите таблицу соседей.
- Убедитесь, что у интерфейса есть адрес и он в той же подсети, что и целевой узел.
- Отправьте ping по нужному адресу и сразу выполните ip neigh show. Появилась строка с MAC и состоянием REACHABLE или STALE — уровень связи в порядке, ищите причину выше, например в настройках файервола на самом узле.
- Если строка в состоянии INCOMPLETE или FAILED, ответа на запрос нет: проверьте кабель, порт коммутатора, Wi-Fi, включено ли устройство.
- Если связь есть, но MAC в строке не тот, что вы ожидаете, сверьте его с наклейкой на устройстве или с данными в роутере.
Когда нужен именно список всех устройств сети, а не только тех, с кем вы уже общались, таблица соседей не подойдёт: в ней лишь те, к кому были обращения. Для обнаружения устройств есть отдельные инструменты, например arp-scan. Применяйте их только в своей сети.
Типичные ошибки при чтении таблицы
Новички нередко делают три ошибки. Первая — искать в таблице все устройства сети. Она хранит только тех, с кем компьютер недавно общался, поэтому отсутствие записи не означает, что устройство выключено.
Вторая — считать STALE неисправностью. Это штатное состояние неактивного соседа, а тревогу стоит поднимать лишь при устойчивых FAILED и INCOMPLETE.
Третья — забывать про виртуальные интерфейсы. На машинах с контейнерами и виртуальными машинами в выводе много строк с мостами и виртуальными адаптерами, и они не имеют отношения к вашей физической сети. Фильтруйте вывод по нужному интерфейсу ключом dev, чтобы не тонуть в лишних строках.
Если вы анализируете вывод на удалённой машине по SSH, помните: таблица описывает окружение именно того компьютера, а не вашего. Сравнивайте результаты на обоих концах, когда ищете причину недоступности.