Linux где хранится arp таблица

Обновлено: 03.07.2024

Аргумент hostname может быть как именем, так и IP адресом в стандарте dotted quad.

Первая строка отображает ARP-запись для IP-адреса, указанного хоста или всех известный хостов, если hostname не задается. Например, вызов arp на vlager может выдать:

Это показывает Ethernet-адреса vlager , vstout и vale .

При использовании опции -t Вы увидите информацию только о том типе аппаратных средств, который укажете. Это могут быть: ether , ax25 или pronet для Ethernet 10Mbps, AMPR AX.25 и IEEE 802.5 token ring, соответственно.

Опция -s используется, чтобы добавить Ethernet-адрес хоста к ARP-таблицам. Аргумент hwaddr определяет адрес аппаратных средств, который по умолчанию предполагается Ethernet-адресом, указанным как шесть шестнадцатиричных байт, разделяемых двоеточиями. Вы можете также устанавливать адреса для других типов аппаратных средств, используя опцию -t .

Одна из проблем, которая может потребовать, чтобы Вы вручную добавили IP-адрес к ARP-таблице, это когда по некоторым причинам ARP-запросы для удаленного хоста не доходят, например, когда есть сбой ARP-драйвера, или имеется другой хост в сети, который ошибочно опознает себя с IP-адресом другого хоста. Твердая установка IP-адреса в ARP-таблице также является мерой защиты себя от хостов в Вашем Ethernet, которые прикидываются кем-то другим.

Вызов arp с использованием ключа -d удаляет все ARP-записи, касающиеся данного хоста. Это может быть необходимо, чтобы вынудить интерфейс повторно получить Ethernet-адрес для данного IP. Это полезно, когда переконфигурированная система имеет неправильную ARP-информацию.

Опция -s может также использоваться, чтобы создать proxy ARP. Это специальная техника когда хост, скажем, gate действует как gateway для другого хоста, назовем его fnord , делая вид, что оба адреса относятся к тому же самому хосту, а именно, gate . Это делается так: на gate создается ARP-запись о fnord , которая указывает на его собственный Ethernet-интерфейс. Теперь, когда хост посылает ARP-запрос о fnord , gate будет возвращать ответ, содержащий собственный Ethernet-адрес. Спрашивающий хост будет посылать все пакеты gate , который перенаправит их к fnord .

Эта схема может быть необходима, например, когда Вы хотите работать с fnord с DOS-машины с нестандартным TCP, которое плохо работает с маршрутизацией. Когда Вы используете proxy ARP, DOS-машине будет казаться, что fnord находится в локальной подсети, так что ей не требуется что-либо знать относительно маршрутов и gateway.

Другое очень полезное применение proxy ARP, когда один из Ваших хостов действует как gateway к некоторому другому хосту только временно, например, по телефону. В предыдущем примере мы уже столкнулись с laptop vlite , который был связан с vlager через PLIP-связь только в небольшом промежутке времени. Конечно, это будет работать только, если адрес хоста, для которого Вы хотите обеспечить proxy ARP, находится в той же самой IP-подсети, что и Ваш gateway. Например, vstout мог бы быть proxy ARP для любого хоста из подсети Brewery ( 172.16.1.0 ), но не для хоста из подсети Winery ( 172.16.2.0 ).

Требуемые действия для обеспечения proxy ARP для fnord приведены ниже. Конечно, Ethernet-адрес должен быть от gate :

Доброго времени суток, дорогие хабраюзеры. Этой статьей я хочу начать цикл повествования о протоколах, которые помогают нам прозрачно, быстро и надежно обмениваться информацией. И начать с протокола ARP.

Как известно, адресация в сети Internet представляет собой 32-битовую последовательность 0 и 1, называющихся IP-адресами. Но непосредственно связь между двумя устройствами в сети осуществляется по адресам канального уровня (MAC-адресам).

Так вот, для определения соответствия между логическим адресом сетевого уровня (IP) и физическим адресом устройства (MAC) используется описанный в RFC 826 протокол ARP (Address Resolution Protocol, протокол разрешения адресов).

ARP состоит из двух частей. Первая – определяет физический адрес при посылке пакета, вторая – отвечает на запросы других станций.

Протокол имеет буферную память (ARP-таблицу), в которой хранятся пары адресов (IP-адрес, MAC-адрес) с целью уменьшения количества посылаемых запросов, следовательно, экономии трафика и ресурсов.

Пример ARP-таблицы.

192.168.1.1 08:10:29:00:2F:C3
192.168.1.2 08:30:39:00:2F:C4

Слева – IP-адреса, справа – MAC-адреса.

Прежде, чем подключиться к одному из устройств, IP-протокол проверяет, есть ли в его ARP-таблице запись о соответствующем устройстве. Если такая запись имеется, то происходит непосредственно подключение и передача пакетов. Если же нет, то посылается широковещательный ARP-запрос, который выясняет, какому из устройств принадлежит IP-адрес. Идентифицировав себя, устройство посылает в ответ свой MAC-адрес, а в ARP-таблицу отправителя заносится соответствующая запись.

Записи ARP-таблицы бывают двух вид видов: статические и динамические. Статические добавляются самим пользователем, динамические же – создаются и удаляются автоматически. При этом в ARP-таблице всегда хранится широковещательный физический адрес FF:FF:FF:FF:FF:FF (в Linux и Windows).

Создать запись в ARP-таблице просто (через командную строку):

arp –s <IP-адрес> <MAC-адрес>

Вывести записи ARP-таблицы:

После добавления записи в таблицу ей присваивается таймер. При этом, если запись не используется первые 2 минуты, то удаляется, а если используется, то время ее жизни продлевается еще на 2 минуты, при этом максимально – 10 минут для Windows и Linux (FreeBSD – 20 минут, Cisco IOS – 4 часа), после чего производится новый широковещательный ARP-запрос.

  • тип сети (16 бит): для Ethernet – 1;
  • тип протокола (16 бит): h0800 для IP;
  • длина аппаратного адреса (8 бит);
  • длина сетевого адреса (8 бит);
  • тип операции (16 бит): 1 – запрос, 2 — ответ;
  • аппаратный адрес отправителя (переменная длина);
  • сетевой адрес отправителя (переменная длина);
  • аппаратный адрес получателя (переменная длина);
  • сетевой адрес получателя (переменная длина).

А вот как происходит определение маршрута с участием протокола ARP.

Пусть отправитель A и получатель B имеют свои адреса с указанием маски подсети.

  1. Если адреса находятся в одной подсети, то вызывается протокол ARP и определяется физический адрес получателя, после чего IP-пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу, соответствующему IP-адресу назначения.
  2. Если нет – начинается просмотр таблицы в поисках прямого маршрута.
  3. Если маршрут найден, то вызывается протокол ARP и определяется физический адрес соответствующего маршрутизатора, после чего пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу.
  4. В противном случае, вызывается протокол ARP и определяется физический адрес маршрутизатора по умолчанию, после чего пакет инкапсулируется в кадр канального уровня и отправляется по указанному физическому адресу.

Главным достоинством проткола ARP является его простота, что порождает в себе и главный его недостаток – абсолютную незащищенность, так как протокол не проверяет подлинность пакетов, и, в результате, можно осуществить подмену записей в ARP-таблице (материал для отдельной статьи), вклинившись между отправителем и получателем.

Бороться с этим недостатком можно, вручную вбивая записи в ARP-таблицу, что добавляет много рутинной работы как при формировании таблицы, так и последующем ее сопровождении в ходе модификации сети.

Существуют еще протоколы InARP (Inverse ARP), который выполняет обратную функцую: по заданному физическому адресу ищется логический получателя, и RARP (Reverse ARP), который схож с InARP, только он ищет логический адрес отправителя.

В целом, протокол ARP универсален для любых сетей, но используется только в IP и широковещательных (Ethernet, WiFi, WiMax и т.д.) сетях, как наиболее широко распространенных, что делает его незаменимым при поиске соответствий между логическими и физическими адресами.

Иногда возникает необходимость узнать какие устройства подключены к локальной сети Linux. Это может понадобиться если вы хотите подключиться к одному из компьютеров и не помните его адрес или хотите убедиться в безопасности вашей сети и найти все скрытые устройства.

Самый надежный способ обнаружить все подключенные к сети Linux устройства, в том числе и скрытые - это ARP сканирование локальной сети. В этой статье мы рассмотрим как его выполнить и какие утилиты для этого нужны.

Как выполнить ARP сканирование локальной сети?

Как вы знаете, у всех компьютеров в сети есть IP адреса. Никогда не задавались вопросом, как сеть определяет, какому компьютеру принадлежит тот или иной адрес? Ведь сети бывают разные, проводные, беспроводные, ppp и т д. И в каждой из этих сетей аппаратный адрес компьютера имеет свой формат, зависящий от конструктивных особенностей сети, а IP адреса одни и те же.

Все очень просто. Для преобразования физических адресов, в ip адреса используется протокол ARP (Address Resolution Protocol), так и расшифровывается - протокол разрешения адресов. Когда компьютеру нужно обратиться к другому компьютеру в локальной сети, он отправляет специальный запрос в котором буквально спрашивает "У кого IP адрес 192.168.1.4", компьютер с таким ip адресом отправляет ответ "У меня, я 11:22:33:44:55", в ответе он передает свой физический адрес в этой сети. Дальше этот адрес заносится в специальную таблицу. но это уже тонкости реализации и они выходят за рамки нашей статьи. Сегодня мы поговорим как самому выполнить ARP сканирование локальной сети linux и найти все подключенные устройства.

Утилита ARP Scan

ARP Scan или еще называемый MAC Scanner - это очень быстрый инструмент для сканирования локальной сети Linux с помощью ARP. Утилита показывает все IPv4 адреса устройств в вашей сети. Поскольку ARP не использует маршрутизацию, то такой вид сканирования работает только в локальной сети.

ARP Scan находит все активные устройства, даже если у них включен брандмауэр. Компьютеры не могут скрыться от ARP также как они скрываются от ping. Но ARP сканирование не подходит для поиска компьютеров за пределами локальной сети, в таких ситуациях используйте ping сканирование.

Установка ARP Scan

Этот arp сканер сети доступен для следующих операционных систем:

  • Debian, поставляется по умолчанию;
  • Ubuntu, можно установить с репозитория Universe;
  • Fedora, официальные репозитории начиная с версии 6;
  • RedHat - доступна начиная с версии 5;
  • Gentoo, официальные репозитории;
  • ArchLinux - официальные репозитории Pacman.

Для установки в Ubuntu выполните:

sudo apt install arp-scan

Сканирование сети

ARP Scan позволяет находить активные компьютеры как в проводных сетях ethernet, так и в беспроводных Wifi сетях. Также есть возможность работать с Token Ring и FDDI. Не поддерживаются последовательные соединения PPP и SLIP, поскольку в них не используется ARP. Программу нужно запускать с правами суперпользователя.

Но сначала надо узнать сетевой интерфейс, который используется для подключения к сети. Для этого можно воспользоваться программой ip:

В данном случае, это enp24s0. Самый простой способ выполнить ARP сканирование и обнаружить все подключенные к локальной сети компьютеры - запустить программу со следующими параметрами:

sudo arp-scan --interface=enp24s0 --localnet


Здесь параметр --interface, задает интерфейс для сканирования, а --localnet, говорит, что нужно использовать все возможные IP адреса для текущей сети.

Первый параметр можно опустить, тогда программа будет искать все узлы для интерфейса с меньшим номером в системе. В нашем примере имя интерфейса - enp24s0.

Вместо параметра --localnet, можно указать маску сети:

sudo arp-scan --interface=enp24s0 10.0.1.0/24

ARP сканирование можно использовать, даже если у вашего интерфейса нет IP адреса. Тогда в качестве исходящего адреса будет использован 0.0.0.0. Правда, на такие запросы могут ответить не все системы. Тогда ARP сканер сети не так эффективен.

ARP спуфинг и ARP прокси

Выводы

ARP Scan это простой, но очень мощный инструмент, с помощью которого можно выполнять сканирование ip адресов в локальной сети linux. Те, кто знаком с Cisco маршрутизаторами и коммутаторами, знают что найти такие устройства можно только с помощью ARP. Это полезный инструмент, возможно, когда-то вам он пригодится.

--- 192.168.1.5 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.539/3.539/3.539/0.000 ms

В это время "за кулисами":

$ sudo tcpdump -ennqti eth1 arp or icmp
00:0c:29:36:c4:e3 > ff:ff:ff:ff:ff:ff, ARP, length 60: Request who-has 192.168.1.5 tell 192.168.1.11, length 46
00:0c:29:1d:5c:e4 > 00:0c:29:36:c4:e3, ARP, length 42: Reply 192.168.1.5 is-at 00:0c:29:1d:5c:e4, length 28
00:0c:29:36:c4:e3 > 00:0c:29:1d:5c:e4, IPv4, length 98: 192.168.1.11 > 192.168.1.5: ICMP echo request, id 19794, seq 1, length 64
00:0c:29:1d:5c:e4 > 00:0c:29:36:c4:e3, IPv4, length 98: 192.168.1.5 > 192.168.1.11: ICMP echo reply, id 19794, seq 1, length 64

ARP cache

Если просто, то к эш ARP - это сохраненное сопоставление IP-адреса с адресом канального уровня. Основное назначение - не производить повторно ARP - запросы (ответы) при каждом обмене IP-па кетами. Недостатком является то, что каждый хост поддерживает свой собственный ARP- кэш, который может устаревать, когда некоторый узе л был и зменен, ил и некоторый IP-ад рес был прис воен другому хосту.
Кэш ARP также известен как таблица соседей ( neighbor table).

Просмотреть содержимое кэша ARP Linux можно с помощью:

$ sudo arp -i eth1
Address HWtype HWaddress Flags Mask Iface
192.168.1.11 ether 00:0c:29:36:c4:e3 C eth1

$ sudo ip neigh sh dev eth1
192.168.1.11 lladdr 00:0c:29:36:c4:e3 STALE

$ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.1.11 0x1 0x2 00:0c:29:36:c4:e3 * eth1

Записи в кэше ARP периодически и автоматически проверяются , если долгое время не используются . Параметр net/ipv4/neigh/$DEV/gc_stale_time (есть много других параметров в net/ipv4/neigh/$DEV) определяет время, по ист ечению которого зап ись в кэше становится устаревшей .

$ sudo sysctl net.ipv4.neigh.default.gc_stale_time
net.ipv4.neigh.default.gc_stale_time = 60

Возможные состояния записи в к эше ARP :

Состояние з аписи Значение
permanentникогда не устаревает и не проверяется
noarpустаревает, но не проверяется
reachableнормально устаревает
staleпродолжает использоваться, нужна проверка
delayпланируется ARP-запрос, нужна проверка
probeотправка ARP-запрроса
incompleteпервый ARP-запрос отправлен
failedне получен ответ на ARP-запрос

Как прои с ходит смена состояния записи в ARP-кэше (хост А хранит запись в своем кэше о хосте В) :

  1. до того момента, пока ист ечет срок хранения записи в к эше, но по сл е того, как узел В отключится от с ети - узел А продолжает о тс ылать Ethernet -ф реймы с назначением "MAC -адрес хоста В "
  2. запись о хосте В считается достоверной в течении времени gc_stale_time , по и с т ечению которого состояни е записи становится s tale
  3. замет ив в таблице запись в с остоянии stale, я дро иници ирует про верку записи ARP-запросом в направлении IP- адреса хоста В
  4. для прове рки ядро сначала отправит ucast_solicit -фреймы до последнего известного адреса хоста В . Если этот ва р и ант не поможет, то ядро отправит ш ироковещательный mcast_solicit-фрейм, прежде чем изменить состояние записи в кэше . П осле того, как все по пыт ки прове рки записи закончатся неудачей, записи присвоится состояние incomplete.

Если после опреде л енного числа m cast_solicit ARP-запрос ов проверка не удалась, то запись переходит в состояние failed.

ARP suppresion

Полное подавление ARP осуществляется легко - для этого достаточно установить флаг noarp при настройке интерфейса. После это потребуется статическая ARP-таблица.
Отключение ARP:

[440]:

$ sudo ip link set eth1 arp off
[441]:

$ sudo ifconfig eth1 -arp

ARP Flux problem

Когда Linux-хост подключен к сегменту сети с помощью нескольких сетевых карт, может возникнуть проблема соответствия IP-адресов адресам канального уровня, т.к. машина может ответить на запросы ARP от обоих интерфейсов Ethernet. Эта проблема более известна как ARP Flux.
С ядра версии 2.4 решение проблемы - включение параметра arp_filter
с помощью sysctl:

[442]:

$ sudo sysctl net.ipv4.conf.all.arp_filter
net.ipv4.conf.all.arp_filter = 0

C помощью оболочки можно включить фильтрацию сразу на всех интерфейсах:

Proxy ARP

ARP-прокси позволяет маршрутизатору отвечать на ARP запросы в одну сеть, в то время как запрашиваемый хост находится в другой сети. С помощью этого средства происходит "обман" отправителя, который отправил ARP запрос, после чего он "думает", что маршрутизатор является хостом назначения, тогда как в действительности хост назначения находится по другую сторону маршрутизатора. Маршрутизатор выступает в роли уполномоченного агента хоста назначения, перекладывая пакеты от другого хоста.
Регулируется параметром proc/sys/net/ipv4/conf/DEV/proxy_arp. Значение по-умолчанию -- 0 (выключено).

2 Убунты на виртуалках, пингую с одной на другую, сразу после этого пишу arp -a. А он мне выводит всего одну строчку с ip адресом компа, с которого проводилось пингование. Я могу ошибаться, конечно, ибо не знаю точно, какая информация должна храниться в этом кэше, но там уж явно должно что-то быть полезное.. Что же делать?


А что именно ты там хочешь увидеть кроме айпишника, мака и интерфейса?

То есть так все и должно быть? А почему тогда запись в кэше почему-то одна всегда? Попинговал я другой комп раза 3-4, еще и себя попинговал для очистки совести - а запись все равно одна, причем одна и та же..


Запусти
nmap 192.168.1.0/24
Или какая у тебя сетка с маской.
И потом уже
arp -a
Сколько будет записей?

Хм, а нет ли другого способа проверить? Виртуалка свежая, nmap не установлен, а установить не получится - ибо айпишник менял по своему усмотрению, чтобы 2 виртуалки были в одной подсети. Поэтому не получается таким образом посмотреть кэш..


>2 Убунты на виртуалках, пингую с одной на другую, сразу после этого пишу arp -a.

А кто сказал, что после пинга другой машины, появится запись в arp-кэше? о_О


Mr_Alone

А кто сказал, что после пинга другой машины, появится запись в arp-кэше? о_О

а кто сказал другое?


Понимаш, arp это морально низкий протокол, ниже почти некуда, так вот мак адрес, это адрес ближайшего к тебе свича\роутера\итп в вируталке соответственно - виртуальный интерфейс хоста, то бишь если там у тебя будет два то это уже ой, хотя может там можно както настроить это, но обычно у тебя хост эмулирует nat и все как я описал.

Читайте также: