Estou implementando uma solução de monitoramento de rede para uma rede muito grande (aproximadamente 5000 dispositivos de rede). Gostaríamos que todos os dispositivos em nossa rede enviassem traps SNMP para uma única caixa (tecnicamente provavelmente será um par de caixas HA) e, em seguida, essa caixa passasse os traps SNMP para as caixas de processamento reais. Isso nos permitirá ter várias caixas de back-end lidando com traps e distribuir a carga entre essas caixas de back-end.
Um recurso importante de que precisamos é a capacidade de encaminhar os traps para uma caixa específica, dependendo do endereço de origem do trap. Alguma sugestão para a melhor maneira de lidar com isso?
Entre as coisas que consideramos estão:
- Usando o snmptrapd para aceitar os traps, e enviá-los para um script personalizado do manipulador de perl escrito, para reescrever o trap e enviá-lo para a caixa de processamento adequada
- Usando algum tipo de software de balanceamento de carga em execução em uma caixa Linux para lidar com isso (tendo alguma dificuldade em encontrar muitos programas de balanceamento de carga que manipularão UDP)
- Usando um appliance de balanceamento de carga (F5, etc)
- Usando IPTables em uma caixa Linux para rotear os traps SNMP com NATing
No momento, implementamos e estamos testando a última solução, com uma caixa Linux com IPTables configurada para receber os traps e, dependendo do endereço de origem do traps, reescreva-o com um destino NAT (DNAT) para que o pacote seja enviado para o servidor apropriado. Por exemplo:
# 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
Isso deve funcionar com excelente eficiência no roteamento básico de armadilhas, mas nos deixa completamente limitados ao que podemos trabalhar e filtrar com o IPTables, por isso estamos preocupados com a flexibilidade para o futuro.
Outro recurso que realmente gostaríamos, mas que não é "obrigatório", é a capacidade de duplicar ou espelhar os pacotes UDP. Ser capaz de pegar uma armadilha de entrada e encaminhá-la para vários destinos seria muito útil.
Alguém já tentou alguma das soluções possíveis acima para balanceamento de carga de traps SNMP (ou Netflow, UDP geral, etc.)? Ou alguém pode pensar em outras alternativas para resolver isso?
fonte
Seu principal problema será: como você sabe o IP real do dispositivo do qual você está recebendo os traps?
Se você estiver usando o SNMP v1, poderá tirar o IP do cabeçalho da armadilha. Se você estiver usando traps v2 ou v3, precisará correlacionar o ID do snmpengine ao ip que você buscou anteriormente no dispositivo. Engineid normalmente não é um item de configuração obrigatório para a maioria das implementações SNMP e, portanto, você não pode confiar totalmente nisso sozinho.
O fallback é que você pode usar o IP de origem no cabeçalho do pacote udp. Obviamente, isso falhará, se sua armadilha for roteada através de outro EMS / NMS ou se você tiver um NAT entre o dispositivo e o aplicativo mgmt.
Se você não precisar dar suporte a traps NAT / encaminhados de outros NMS, faça uma cópia do pacote udp e faça a rota com base no ip
Se você precisar dar suporte a isso, precisará analisar a interceptação SNMP e verificar a correspondência de ID do mecanismo para v2 / v3. Na v1, você pode lê-lo no campo de endereço do agente no cabeçalho SNMP.
fonte
mais um hack baseado em filtro de rede:
[suposição - todos os traps são enviados para 10.0.0.1, que os redireciona para 10.0.0.2, 10.0.0.3, 10.0.0.4]
contanto que você tenha traps snmp de um pacote - isso deve espalhar a carga muito bem - nesse caso, em três máquinas. [embora eu não tenha testado].
fonte
Eu acho que a resposta de chmeee é o caminho certo a seguir. Livre-se do UDP e do SNMP o mais cedo possível, pois eles são horríveis de gerenciar.
Agora estou construindo um sistema que colocará todos os eventos (incluindo traps) em uma fila JMS e, em seguida, use todas as maravilhas do sistema de mensagens corporativo para fazer o balanceamento de carga e o failover.
fonte
Para obter o IP do remetente original, você pode tentar corrigir o snmptrapd com este patch - https://sourceforge.net/p/net-snmp/patches/1320/#6afe .
Isso modifica a carga útil, para que os cabeçalhos IP sejam mantidos intactos, para que eles não entrem no seu roteamento e / ou NAT.
fonte