По крайней мере, в одной реализации существует жесткое ограничение емкости таблицы 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.
- R1 получает пакет, предназначенный для сети 10.1.0.0/16.
- На основе статического маршрута интерфейса R1 ARP для пункта назначения на
iface0
- R2 распознает, что он может достичь пункта назначения, и отвечает на ARP своим собственным MAC.
- 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?»
Ответы:
Изменить 2 :
Как вы упомянули...
Заставляет Brocade использовать proxy-arp для каждого пункта назначения в 10.1.0.0/16, как если бы он был напрямую подключен
iface0
.Я не могу ответить о реализации ARP-кэша Brocade, но я бы просто указал на простое решение вашей проблемы ... настроить свой маршрут по-другому:
Сделав это, вы предотвратите Brocade от ARP-входа для всех 10.1.0.0/16 (обратите внимание, что вам может потребоваться перенумеровать связь между R1 и R2, чтобы она находилась за пределами 10.1.0.0/16, в зависимости от реализации вещей Brocade) ,
Оригинальный ответ :
Маршрутизаторы ЦПУ Cisco IOS ограничены только количеством DRAM в маршрутизаторе, но это, как правило, не является ограничивающим фактором. Некоторые коммутаторы (например, Catalyst 6500) имеют жесткое ограничение на таблицу смежности (которая связана с таблицей ARP); Sup2T имеет 1 миллион смежностей .
Маршрутизаторам ЦПУ Cisco IOS не хватает места в таблице ARP, потому что эти ARP хранятся в DRAM. Предположим, вы говорите о Sup2T. Подумайте об этом, предположим, у вас был Cat6500 + Sup2T и вы настроили все возможные Vlans, технически это
Предположим, вы делаете каждый Vlan / 24 (так что это 252 возможных ARP), и вы упаковываете каждый Vlan полный ... это 1 миллион записей ARP.
Каждый из этих ARP будет занимать определенное количество памяти в самой таблице ARP плюс таблица смежности IOS. Я не знаю, что это такое, но допустим, что общая нагрузка ARP составляет 10 байт ...
Это означает, что вы сейчас потратили 10 МБ на ARP; это все еще не очень много места ... если бы у вас было так мало памяти, вы бы увидели что-то вроде
%SYS-2-MALLOCFAIL
.При таком количестве ARP и четырехчасовом тайм-ауте ARP вам придется обслуживать в среднем почти 70 ARP в секунду; более вероятно, что обслуживание 1 миллиона записей ARP истощит ЦП маршрутизатора (потенциально сообщения CPUHOG).
В этот момент вы можете начать отыгрывать смежность протоколов маршрутизации и иметь IP-адреса, которые просто недоступны, поскольку ЦП маршрутизатора был слишком занят для ARP для IP-адреса.
источник
Единственный реальный опыт, который я имел с этим случаем, был на коммутаторах C3550 (предел MAC 2-8k, в зависимости от шаблона sdm), и там он отбросил самую старую запись из таблицы.
источник
Для IOS, JunOS и других коммерческих стеков вам просто нужно протестировать, к счастью, это не очень сложно.
Но для linux , freebsd, netbsd, openbsd, uIP, lwIP и, возможно, многих других реализаций вы можете просто проверить их исходный код на предмет поведения.
В Linux вам нужно проверить 'net / core / neighbour.c' (начать со строки 'if (records> = tbl-> gc_thresh3' || ') и' net / ipv4 / arp.c '.
В Linux вы, кажется, иметь три полных уровня
Когда gc_thresh3 пытается превысить, он пытается принудительно запустить сборку мусора, если он не был запущен недавно. Сборка мусора, по-видимому, удаляет записи, на которые больше не ссылаются, поэтому это не означает, что они являются самыми старыми или самыми новыми, однако превышение gc_staletime представляется одним из способов разыменования записи, которая снова переводится в самую старую запись.
Если сборщик мусора не может быть запущен, новая запись просто не добавляется. Все эти интервалы gc_threshN и периодического сбора мусора могут быть настроены.
Код не зависит от семейства адресов (ipv4, ipv6), поэтому таблицы IPv6 ND и IPv4 ARP обрабатываются по одному и тому же пути кода, а не по дублированному пути.
источник
Это будет arp для IP-адреса, сохраните его в таблице и в зависимости от реализации следует удалить самую старую запись. Влияние на производительность зависит, если это необычное явление, не большое влияние, но это вектор атаки, так что кто-то может послать много arps, влияющих на загрузку процессора
источник
Коммутатор идет в ARP для того IP-адреса назначения, чтобы получить его MAC-адрес (который также заполнил бы таблицу CAM ответом). Запрос ARP транслируется на все порты. Это требует процессора и включает в себя
ARP Input
процесс. Если запросы ARP направлены на один и тот же IP-адрес из-за частого переполнения таблицы ARP, коммутатор должен ограничить скорость ARP раз в две секунды. Если запросы поступают на случайные IP-адреса достаточно часто, ЦП может резко возрасти, поскольку этот ЦП участвует как в запросах ARP, так и в ответах.источник
Из атак, которые я изучил на коммутаторах Cisco 3550, 3560 и т. Д., Вы можете превратить их в гигантский концентратор, как только вы перегрузите ограничение MAC-адреса. Коммутаторы имеют установленный предел MAC-адреса (около 6000), который может быть сохранен, и как только этот предел будет достигнут, он затопит все данные из своих интерфейсов. Не могу вспомнить, идет ли речь о пакетах 802.1q, потому что мне не приходилось делать это долгое время. Возможно, придется разжечь мою сетевую лабораторию дома, чтобы узнать.
источник