ARP и с чем его едят

Сам по себе протокол ARP — простой. Но создает много проблем ;) Перед каждым пакетом, посланным в сеть отсылать ARP-запрос — это роскошь. Поэтому создаётся ARP кэш. На какое-то время в этот кэш сохраняется пара IP+MAC, определённая средствами ARP протокола.

Раньше в bercut-et эта запись имела время жизни 9 минут. Поэтому, когда пользователь переходил из одной в другую сеть, где такие же IP-адреса, но MACи (естественно) другие, у него начинались проблемы: в кэше слишком долго хранились записи. Ситуация, конечно, встречается не часто, но всё же допустима.

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

мы же пока поступили просто: уменьшили время жизни каждой записи до 1 минуты и при падении линка стираем кэш полностью. этого вполне достаточно для карманного тестера.

11 комментариев

  1. Антон Фельдман:

    в unix-like системах есть возможность удаления записи из arp-таблицы. реализация такой фичи у нас уже в код не влезает, как я понимаю?

  2. Павел Курочкин:

    кода у нас действительно мало осталось…
    да и так ли это нужно.
    пока пользователь будет удалять запись, придёт время её удалить автоматически, поскольку она постареет ;)

    • Антон Фельдман:

      тоже верно. никогда не понадобится. как обычно ;)

  3. evg_krsk:

    Т.е. по любому встречному-поперечному ARP-запросу/ответу кэш не обновляется, как я понял. Понятно, что это лажа по производительности.

    Однако это может быть и ценной фичей — сделать вручную включаемый режим ARP-сниффинга, чтобы можно было при присоединении к новой сети подсмотреть, какие IP в ней бегают. Как вариант, с фильтрацией по VID-у.

    Был бы трекер, обязательно бы повесил FR :-)

    • Павел Курочкин:

      сделал тестовый образец.
      тут же узнал, кто есть кто в нашей сетке ;)

      осталось оформить покрасивее
      окошко сделать и т.п.

  4. Павел Курочкин:

    Вот такая штука получилась.
    При входе в это окно включается режим ARP Promisc, то есть
    все ARP’ы, гуляющие по сетке принимаются прибором и информация об
    отправителе сохраняется в кэш. А содержимое кэша выводится в виде списка.

    ARP Monitor screenshot

    Включено в 0.2.45 релиз. Сейчас тестируется.

  5. evg_krsk:

    VID игнорируется? К dot1Q-транку цепляться можно?

  6. Павел Курочкин:

    нет. VLAN ID не игнорируется. Будут отслежены только те ARP-запросы которые находятся в VLAN сети, настроенной в параметрах интерфейсов.

    promisc относится только к IP-адресам. То есть в ARP promisc режиме мы принимаем все ARP-пакеты, адресованные не нам (и нам тоже).

    • evg_krsk:

      Понятно.

      Но Vlan promisc это тоже интересно. Иногда не знаешь, какие вланы бегают по шнурку и тут тестер для разборок был бы очень кстати.

      • Павел Курочкин:

        не всё сразу ;)
        пока только ARP promisc

        кстати, он доступен, начиная с версии 0.2.45-7