Что происходит при переполнении кэша ARP?

14

По крайней мере, в одной реализации существует жесткое ограничение емкости таблицы ARP. Что происходит, когда кэш ARP заполнен и пакет предлагается с пунктом назначения (или следующим переходом), который не кэшируется? Что происходит под капотом и как влияет на качество обслуживания?

Например, маршрутизаторы Brocade NetIron XMR и Brocade MLX имеют максимум настраиваемой ip-arpсистемы . Значением по умолчанию в этом случае является 8192; размер подсети а / 19. Из документации не ясно, относится ли это к интерфейсу или ко всему маршрутизатору, но для целей этого вопроса можно предположить, что это для интерфейса.

Немногие сетевые узлы специально настроили бы подсеть / 19 на интерфейсе, но этого не произошло. Мы переносили основной маршрутизатор с модели Cisco на Brocade. Одно из многих различий между Cisco и Brocade заключается в том, что Cisco принимает статические маршруты, которые определены как с исходящим интерфейсом, так и с адресом следующего перехода, но Brocade настаивает на том или ином. Мы удалили адрес следующего перехода и сохранили интерфейс. Позже мы узнали ошибку наших путей и переключились с интерфейса на адрес следующего перехода, но изначально все казалось работающим.

+----+ iface0    +----+
| R1 |-----------| R2 |---> (10.1.0.0/16 this way)
+----+.1       .2+----+
      10.0.0.0/30

До миграции R1 был Cisco и имел следующий маршрут.

ip route 10.1.0.0 255.255.0.0 iface0 10.0.0.2

После миграции R1 был парчой и имел следующий маршрут.

ip route 10.1.0.0 255.255.0.0 iface0

R2 является маршрутизатором Cisco, и маршрутизаторы Cisco по умолчанию выполняют прокси-ARP . Это (неправильная) конфигурация в производстве, которая подготовила почву для того, что оказалось переполнением кэша ARP.

  1. R1 получает пакет, предназначенный для сети 10.1.0.0/16.
  2. На основе статического маршрута интерфейса R1 ARP для пункта назначения на iface0
  3. R2 распознает, что он может достичь пункта назначения, и отвечает на ARP своим собственным MAC.
  4. R1 кэширует результат ARP, который объединяет IP-адрес в удаленной сети с MAC-адресом R2.

Это происходит для каждого отдельного пункта назначения в 10.1.0.0/16. Следовательно, несмотря на то, что / 16 правильно подключен к сети за пределами R2, и в канале, примыкающем к R1 и R2, имеется только два узла, R1 испытывает перегрузку ARP-кэша, поскольку заставляет R2 вести себя так, как будто все 65k-адреса напрямую связаны.

Причина, по которой я задаю этот вопрос, заключается в том, что я надеюсь, что он поможет мне разобраться в сообщениях о проблемах сетевых служб (через несколько дней), которые в конечном итоге привели нас к переполнению ARP-кэша. В духе модели StackExchange я попытался выяснить, что, на мой взгляд, является четким, конкретным вопросом, на который можно объективно ответить.

РЕДАКТИРОВАТЬ 1 Для ясности, я спрашиваю о части связующего слоя между каналом передачи данных (уровень 2) и сетью (уровень 3), а не о таблице пересылки MAC в канальном уровне. Хост или маршрутизатор создает первый для сопоставления IP-адресов с MAC-адресами, а коммутатор создает последний для сопоставления MAC-адресов с портами.

РЕДАКТИРОВАТЬ 2 Хотя я ценю усилия, которые приложили респонденты, чтобы объяснить, почему некоторые реализации не подвержены переполнению кэша ARP, я чувствую, что для этого вопроса важно ответить на те, которые есть. Вопрос заключается в том, «что происходит, когда», а не « подвержен ли поставщик Х ». Я сделал свою часть сейчас, описав конкретный пример.

РЕДАКТИРОВАТЬ 3 Другой вопрос, который это не так: «Как я могу предотвратить переполнение кэша ARP?»

neirbowj
источник
Вы ищете информацию о переполнении таблицы mac-address или таблицы ARP?
Майк Пеннингтон
не могли бы вы уточнить, как, по вашему мнению, таблица arp будет переполнена? это связано с реальной проблемой или чисто гипотетически? в любом случае, нам нужны подробности о том, на какой точный сценарий мы отвечаем
Майк Пеннингтон,
@MikePennington Это настоящая проблема. Кэш ARP может переполниться, если, например, большое количество IP-адресов или действуют так, как если бы они присутствовали в одной ссылке.
neirbowj
Cisco IOS не кэширует ARP на маршрутизаторе, пока ARP не получен из подсети, настроенной на маршрутизаторе. Когда я говорю «настоящая проблема», я имею в виду проблему, с которой вы столкнулись ... не проблема, которую вы можете себе представить
Майк Пеннингтон
Спасибо за переписывание вопроса, потому что, когда я думаю о коммутаторах (уровень 2), у вас нет таблицы ARP. ARP имеет отношение к TCP / IP, и коммутатор уровня 2 так не думает, но когда вы переходите на уровень три, у вас может появиться таблица ARP. Однако, если я правильно помню, интерфейс на коммутаторе уровня 3 должен иметь IP-адрес, который будет отображаться в таблице ARP. Поначалу не очень поняла, о чем ты говоришь, гостья ранним утром грустит на меня. Мой программист думает, что, как только таблица ARP
заполнится,

Ответы:

4

Изменить 2 :

Как вы упомянули...

ip route 10.1.0.0 255.255.0.0 iface0

Заставляет Brocade использовать proxy-arp для каждого пункта назначения в 10.1.0.0/16, как если бы он был напрямую подключен iface0.

Я не могу ответить о реализации ARP-кэша Brocade, но я бы просто указал на простое решение вашей проблемы ... настроить свой маршрут по-другому:

ip route 10.1.0.0 255.255.0.0 CiscoNextHopIP

Сделав это, вы предотвратите Brocade от ARP-входа для всех 10.1.0.0/16 (обратите внимание, что вам может потребоваться перенумеровать связь между R1 и R2, чтобы она находилась за пределами 10.1.0.0/16, в зависимости от реализации вещей Brocade) ,


Оригинальный ответ :

Я ожидаю, что в большинстве или даже во всех реализациях существует жесткое ограничение емкости таблицы ARP.

Маршрутизаторы ЦПУ Cisco IOS ограничены только количеством DRAM в маршрутизаторе, но это, как правило, не является ограничивающим фактором. Некоторые коммутаторы (например, Catalyst 6500) имеют жесткое ограничение на таблицу смежности (которая связана с таблицей ARP); Sup2T имеет 1 миллион смежностей .

Итак, что происходит, когда кэш ARP заполнен и пакет предлагается с пунктом назначения (или следующим переходом), который не кэшируется?

Маршрутизаторам ЦПУ Cisco IOS не хватает места в таблице ARP, потому что эти ARP хранятся в DRAM. Предположим, вы говорите о Sup2T. Подумайте об этом, предположим, у вас был Cat6500 + Sup2T и вы настроили все возможные Vlans, технически это

4094 total Vlans - Vlan1002 - Vlan1003 - Vlan1004 - Vlan1005 = 4090 Vlans

Предположим, вы делаете каждый Vlan / 24 (так что это 252 возможных ARP), и вы упаковываете каждый Vlan полный ... это 1 миллион записей ARP.

4094 * 252 = 1,030,680 ARP Entries

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

Это означает, что вы сейчас потратили 10 МБ на ARP; это все еще не очень много места ... если бы у вас было так мало памяти, вы бы увидели что-то вроде %SYS-2-MALLOCFAIL.

При таком количестве ARP и четырехчасовом тайм-ауте ARP вам придется обслуживать в среднем почти 70 ARP в секунду; более вероятно, что обслуживание 1 миллиона записей ARP истощит ЦП маршрутизатора (потенциально сообщения CPUHOG).

В этот момент вы можете начать отыгрывать смежность протоколов маршрутизации и иметь IP-адреса, которые просто недоступны, поскольку ЦП маршрутизатора был слишком занят для ARP для IP-адреса.

Майк Пеннингтон
источник
2

Единственный реальный опыт, который я имел с этим случаем, был на коммутаторах C3550 (предел MAC 2-8k, в зависимости от шаблона sdm), и там он отбросил самую старую запись из таблицы.


источник
1
Похоже, вы говорите о таблице пересылки MAC, а не о кеше ARP. Пожалуйста, смотрите мое редактирование.
neirbowj
1
Я понимаю вашу точку зрения. Однако в данном конкретном случае эффект был таким же, поскольку эти коммутаторы были также оконечным устройством L3 для ряда очень больших IP-подсетей. В итоге решается заменой переключателей. На L2 коммутатор заполняет кадры, для которых он не может кэшировать MAC, но на L3 он должен отбрасывать более старые записи ARP и / или ARP для каждого пакета, который быстро исчерпает ЦП на них.
2

Для IOS, JunOS и других коммерческих стеков вам просто нужно протестировать, к счастью, это не очень сложно.

Но для linux , freebsd, netbsd, openbsd, uIP, lwIP и, возможно, многих других реализаций вы можете просто проверить их исходный код на предмет поведения.

В Linux вам нужно проверить 'net / core / neighbour.c' (начать со строки 'if (records> = tbl-> gc_thresh3' || ') и' net / ipv4 / arp.c '.
В Linux вы, кажется, иметь три полных уровня

  1. gc_thresh1 - пока ничего не сделано, ничего не делается
  2. gc_thresh2 - это может быть мгновенно
  3. gc_thresh3 - этот размер не может быть превышен

Когда gc_thresh3 пытается превысить, он пытается принудительно запустить сборку мусора, если он не был запущен недавно. Сборка мусора, по-видимому, удаляет записи, на которые больше не ссылаются, поэтому это не означает, что они являются самыми старыми или самыми новыми, однако превышение gc_staletime представляется одним из способов разыменования записи, которая снова переводится в самую старую запись.
Если сборщик мусора не может быть запущен, новая запись просто не добавляется. Все эти интервалы gc_threshN и периодического сбора мусора могут быть настроены.
Код не зависит от семейства адресов (ipv4, ipv6), поэтому таблицы IPv6 ND и IPv4 ARP обрабатываются по одному и тому же пути кода, а не по дублированному пути.

ytti
источник
1

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

fredpbaker
источник
1

Коммутатор идет в ARP для того IP-адреса назначения, чтобы получить его MAC-адрес (который также заполнил бы таблицу CAM ответом). Запрос ARP транслируется на все порты. Это требует процессора и включает в себя ARP Inputпроцесс. Если запросы ARP направлены на один и тот же IP-адрес из-за частого переполнения таблицы ARP, коммутатор должен ограничить скорость ARP раз в две секунды. Если запросы поступают на случайные IP-адреса достаточно часто, ЦП может резко возрасти, поскольку этот ЦП участвует как в запросах ARP, так и в ответах.

generalnetworkerror
источник
Где вы нашли ограничение «раз в две секунды»?
Марко Марзетти
«Запросы ARP для одного и того же IP-адреса ограничены скоростью одного запроса каждые две секунды» - cisco.com/en/US/products/hw/routers/ps359/…
generalnetworkerror
Разве это не специфическое значение C7500? Например, C6500 может использовать команду «mls qos protocol arp Police <bps>» или CoPP.
Марко Марзетти
1

Из атак, которые я изучил на коммутаторах Cisco 3550, 3560 и т. Д., Вы можете превратить их в гигантский концентратор, как только вы перегрузите ограничение MAC-адреса. Коммутаторы имеют установленный предел MAC-адреса (около 6000), который может быть сохранен, и как только этот предел будет достигнут, он затопит все данные из своих интерфейсов. Не могу вспомнить, идет ли речь о пакетах 802.1q, потому что мне не приходилось делать это долгое время. Возможно, придется разжечь мою сетевую лабораторию дома, чтобы узнать.

SysEngT
источник
Похоже, вы также говорите о таблице пересылки MAC, а не о кеше ARP. Пожалуйста, смотрите мое редактирование.
neirbowj