Назад | Перейти на главную страницу

Решение для маршрутизации / прокси-ловушек SNMP (или Netflow, общего UDP и т. Д.) Для мониторинга сети?

Я реализую решение для мониторинга сети для очень большой сети (примерно 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.

  1. Если вам не нужно поддерживать NAT / перенаправленные ловушки от других NMS, просто сделайте копию пакета udp и выполните маршрутизацию на основе ip.

  2. Если вам нужно это поддержать, вы должны проанализировать ловушку 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.