Я реализую решение для мониторинга сети для очень большой сети (примерно 5000 сетевых устройств). Мы хотели бы, чтобы все устройства в нашей сети отправляли ловушки SNMP в один блок (технически это, вероятно, будет пара блоков высокой доступности), а затем этот блок передавал ловушки SNMP на реальные блоки обработки. Это позволит нам иметь несколько серверных блоков, обрабатывающих ловушки, и распределять нагрузку между этими серверными блоками.
Одна из ключевых функций, которая нам нужна, - это возможность пересылать прерывания в конкретный ящик в зависимости от исходного адреса прерывания. Есть предложения, как лучше всего справиться с этим?
Среди прочего мы рассмотрели:
В настоящее время мы реализовали и тестируем последнее решение с ящиком Linux с IPTables, настроенным для приема ловушек, а затем, в зависимости от исходного адреса ловушки, переписываем его с назначением nat (DNAT), чтобы пакет отправлялся в правильный сервер. Например:
# Range: 10.0.0.0/19 Site: abc01 Destination: foo01
iptables -t nat -A PREROUTING -p udp --dport 162 -s 10.0.0.0/19 -j DNAT --to-destination 10.1.2.3
# Range: 10.0.33.0/21 Site: abc01 Destination: foo01
iptables -t nat -A PREROUTING -p udp --dport 162 -s 10.0.33.0/21 -j DNAT --to-destination 10.1.2.3
# Range: 10.1.0.0/16 Site: xyz01 Destination: bar01
iptables -t nat -A PREROUTING -p udp --dport 162 -s 10.1.0.0/16 -j DNAT --to-destination 10.3.2.1
Это должно работать с превосходной эффективностью для базовой маршрутизации прерываний, но оставляет нас полностью ограниченными тем, что мы можем обрабатывать и фильтровать с помощью IPTables, поэтому мы обеспокоены гибкостью в будущем.
Еще одна функция, которую мы действительно вроде бы, но не совсем обязательной, так это возможность дублировать или зеркалировать UDP-пакеты. Было бы очень полезно иметь возможность принимать одну входящую ловушку и направлять ее в несколько пунктов назначения.
Кто-нибудь пробовал какое-либо из возможных решений выше для балансировки нагрузки ловушек SNMP (или Netflow, общего UDP и т.д.)? Или кто-нибудь может придумать какие-либо другие альтернативы для решения этой проблемы?
Сотрудник только что показал мне сампликатор. Этот инструмент кажется идеальным решением того, что я искал. С веб-сайта инструмента:
Эта простая программа прослушивает дейтаграммы UDP на сетевом порту и отправляет копии этих дейтаграмм в набор пунктов назначения. Необязательно, он может выполнять выборку, то есть вместо пересылки каждого пакета, пересылать только 1 в N. Другой вариант состоит в том, что он может «подделать» IP-адрес источника, так что копии будут исходить из исходного источника, а не ретранслятора. . В настоящее время поддерживает только IPv4.
Его можно использовать для распространения, например, Пакеты Netflow, ловушки SNMP (но не информирующие) или сообщения системного журнала для нескольких получателей.
Я бы сам реализовал решение, так как не знаю, найдете ли вы что-то настолько конкретное, насколько хотите.
Я бы использовал язык высокого уровня, такой как ruby, для реализации правил баланса и даже прослушивателя ловушек. Например, используя эти библиотеки кажется легко.
Слушайте ловушки:
m = SNMP::TrapListener.new(:Port => 1062, :Community => 'public') do |manager|
manager.on_trap_default { |trap| p trap }
end
m.join
Вы должны добавить логику баланса в on_trap_default
блок.
Отправить ловушки:
Manager.open(:Version => :SNMPv1) do |snmp|
snmp.trap_v1(
"enterprises.9",
"10.1.2.3",
:enterpriseSpecific,
42,
12345,
[VarBind.new("1.3.6.1.2.3.4", Integer.new(1))])
end
Для создания демона вы можете использовать демон-комплект рубиновый камень.
Если вы сохраните простоту и определите хорошие объекты, вы сможете поддерживать программное обеспечение без особых усилий.
Ваша основная проблема будет в том, как узнать реальный IP-адрес устройства, с которого вы получаете ловушки?
Если вы используете SNMP v1, вы можете убрать ip из заголовка ловушки. Если вы используете ловушки v2 или v3, вам нужно будет сопоставить идентификатор snmpengine с IP, который вы ранее получили с устройства. Engineid обычно не является обязательным элементом конфигурации для большинства реализаций SNMP, и, следовательно, вы не можете полностью полагаться только на него.
Резервный вариант заключается в том, что вы можете использовать исходный ip из заголовка пакета udp. Конечно, это не удастся, если ваша ловушка маршрутизируется через другой EMS / NMS или если у вас есть NAT между устройством и вашим приложением MGMT.
Если вам не нужно поддерживать NAT / перенаправленные ловушки от других NMS, просто сделайте копию пакета udp и выполните маршрутизацию на основе ip.
Если вам нужно это поддержать, вы должны проанализировать ловушку SNMP и проверить соответствие идентификатора механизма для v2 / v3, для v1 вы можете прочитать его из поля адреса агента в заголовке SNMP.
Я думаю, что ответ от chmeee - правильный путь. Избавьтесь от UDP и SNMP как можно раньше, с ними ужасно управлять.
Сейчас я создаю систему, которая будет помещать все события (включая ловушки) в очередь JMS, а затем использовать все чудеса корпоративного обмена сообщениями для балансировки нагрузки и аварийного переключения.
еще один взлом на основе netfilter:
iptables -t nat -A PREROUTING -d 10.0.0.1 -p udp --dport 162 -m random --average 33 -j DNAT --to-destination 10.0.0.2:162
iptables -t nat -A PREROUTING -d 10.0.0.1 -p udp --dport 162 -m random --average 33 -j DNAT --to-destination 10.0.0.3:162
# everything else goes to other consumer
iptables -t nat -A PREROUTING -d 10.0.0.1 -p udp --dport 162 -j DNAT --to-destination 10.0.0.4:162
[предположение - все ловушки отправляются на 10.0.0.1, который затем перенаправляет их на 10.0.0.2, 10.0.0.3, 10.0.0.4]
если у вас есть ловушки snmp длиной в один пакет - это должно хорошо распределять нагрузку - в данном случае на 3 машины. [хотя я не тестировал].
Ваша основная проблема будет в том, как узнать реальный IP-адрес устройства, с которого вы получаете ловушки?
Чтобы получить исходный IP-адрес отправителя, вы можете попробовать исправить snmptrapd этим патчем - https://sourceforge.net/p/net-snmp/patches/1320/#6afe.
Это изменяет полезную нагрузку, поэтому заголовки IP останутся нетронутыми, чтобы они не попали в вашу маршрутизацию и / или NAT.