Ağ izleme için SNMP Tuzaklarını (veya Netflow, genel UDP vb.) Yönlendirmek / proxy yapmak için çözüm mü?


15

Çok büyük bir ağ (yaklaşık 5000 ağ cihazı) için bir ağ izleme çözümü uyguluyorum. Ağımızdaki tüm cihazların tek bir kutuya SNMP tuzakları göndermesini istiyoruz (teknik olarak bu muhtemelen bir HA kutu çifti olacak) ve daha sonra bu kutunun SNMP tuzaklarını gerçek işleme kutularına geçirmesini istiyoruz. Bu, tuzakları işleyen birden fazla arka uç kutusuna sahip olmamızı ve yükü bu arka uç kutuları arasında dağıtmamızı sağlayacaktır.

İhtiyacımız olan anahtar özelliklerden biri, tuzağın kaynak adresine bağlı olarak tuzakları belirli bir kutuya iletebilmesidir. Bunu halletmenin en iyi yolu için herhangi bir öneriniz var mı?

Düşündüğümüz şeyler arasında:

  • Tuzakları kabul etmek için snmptrapd kullanma ve tuzağı yeniden yazmak ve uygun işleme kutusuna göndermek için bunları özel bir yazılı perl işleyici komut dosyasına geçirmesini sağlamak
  • Bunu yapmak için bir Linux kutusunda çalışan bir çeşit yük dengeleme yazılımı kullanmak (UDP'yi işleyecek birçok yük dengeleme programı bulmakta zorluk çekmek)
  • Yük Dengeleme Aracını (F5 vb.) Kullanma
  • SNMP tuzaklarını NATing ile yönlendirmek için Linux kutusunda IPTables kullanma

Şu anda son çözümü uyguladık ve test ediyoruz, tuzakları almak için yapılandırılmış IPTable'lı bir Linux kutusu ve tuzağın kaynak adresine bağlı olarak, paketin gönderilmesi için bir hedef nat (DNAT) ile yeniden yazın uygun sunucu. Örneğin:

# 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

Bu, temel tuzak yönlendirmesi için mükemmel verimlilikle çalışmalıdır, ancak IPTable'larla makineyi ve filtreleyebileceğimizle tamamen sınırlı kalmamızı sağlar, bu nedenle gelecek için esneklikle ilgileniyoruz.

Gerçekten istediğimiz , ancak "olması gereken" olmayan bir başka özellik de UDP paketlerini çoğaltma veya yansıtma yeteneğidir. Gelen bir tuzağı alıp birden fazla hedefe yönlendirmek çok yararlı olacaktır.

SNMP tuzakları (veya Netflow, genel UDP, vb.) Yük dengelemesi için yukarıdaki olası çözümlerden herhangi biri denendi mi? Veya bunu çözmek için başka alternatifler düşünebilir mi?

Yanıtlar:


4

Bir meslektaşım bana örnekleyici gösterdi . Bu araç, aradığım şey için mükemmel bir çözüm gibi görünüyor. Aracın web sitesinden:

Bu basit program, bir ağ bağlantı noktasındaki UDP datagramlarını dinler ve bu datagramların kopyalarını bir dizi hedefe gönderir. İsteğe bağlı olarak, örnekleme gerçekleştirebilir, yani her paketi iletmek yerine, yalnızca N'de 1 iletin. . Şu anda yalnızca IPv4'ü desteklemektedir.

Netflow paketleri, SNMP tuzakları (ancak bilgilendirme değil) veya Syslog mesajlarını birden fazla alıcıya dağıtmak için kullanılabilir.


3

Çözümü kendim uygulamaya giderdim, çünkü istediğiniz kadar özel bir şey bulabileceğinizi bilmiyorum.

Denge kurallarını ve hatta tuzak dinleyicisini uygulamak için yakut gibi üst düzey bir dil kullanırdım. Örneğin, bu kütüphaneleri kullanmak kolay görünüyor .

Tuzakları dinle:

m = SNMP::TrapListener.new(:Port => 1062, :Community => 'public') do |manager|
  manager.on_trap_default { |trap| p trap }
end
m.join

Denge mantığını on_trap_defaultbloğa eklemelisiniz .

Tuzakları gönder:

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

Daemon oluşturmak için daemon -kit yakut taş kullanabilirsiniz.

Basit tutar ve iyi nesneler tanımlarsanız, yazılımı fazla çaba harcamadan koruyabilirsiniz.


Cevabı takdir ediyorum, ancak dürüst olmak gerekirse, kendim bir şey inşa edersem, Net-SNMP'nin snmptrapd'sine dayanacak ve snltrapd tuzakları kabul etmek ve bunları işlemek için Perl modüllerini çağırmak için yerleşik desteğe sahip olduğundan Perl'de uygulanacaktır. Bu daha basit ve daha iyi destekleniyor (temel Perl ile başa çıkabilen bir düzine adamımız ve Ruby ile neredeyse hiç oynamamış bir adamımız var).
Christopher Cashell

1

Temel probleminiz olacak, tuzakları aldığınız cihazın gerçek ipini nasıl biliyorsunuz?

SNMP v1 kullanıyorsanız, ip'i tuzağın başlığından alabilirsiniz. V2 veya v3 tuzakları kullanıyorsanız, snmpengine kimliğini daha önce cihazdan getirdiğiniz ip ile ilişkilendirmeniz gerekir. Engineid, çoğu SNMP uygulaması için genellikle zorunlu bir yapılandırma öğesi değildir ve bu nedenle tek başına tam olarak ona güvenemezsiniz.

Yedek, udp paket başlığından kaynak ip'i kullanabilmenizdir. Tabii ki, tuzağınız başka bir EMS / NMS üzerinden yönlendirilirse veya cihaz ile mgmt uygulamanız arasında bir NAT varsa bu başarısız olur.

  1. Diğer NMS'den NAT / iletilen tuzakları desteklemeniz gerekmiyorsa, udp paketinin bir kopyasını alın ve ip tabanlı rota

  2. Bunu desteklemeniz gerekiyorsa, SNMP tuzağını ayrıştırmanız ve v2 / v3 için motor kimliği eşleşmesini kontrol etmeniz gerekir, v1 için SNMP başlığındaki ajan-adres alanından okuyabilirsiniz.


0

bir tane daha netfilter tabanlı kesmek:

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

[varsayım - tüm tuzaklar 10.0.0.1'e gönderilir ve daha sonra bunları 10.0.0.2, 10.0.0.3, 10.0.0.4'e yönlendirir]

tek paket uzunluğunda snmp tuzaklarına sahip olduğunuz sürece - bu yükü güzelce yaymalıdır - bu durumda 3 makineye yayılmalıdır. [ben test etmedim rağmen].


Aslında, yükün rastgele yayılmasını istemiyoruz. Belirli bir alt ağdaki tüm tuzakların aynı makineye çarpmasını istiyoruz, böylece olayları belirli sitelerle ilişkilendirebiliriz. Şu anda IPTables kurallarım tuzağın kaynağına göre DNAT hedefini ayarladı.
Christopher Cashell

@Christopher Cashell - daha sonra alternatif olarak çözümünüze src ip adresine dayalı 'hash' hedef sunucusuna u32 netfilter modülünü kullanabilirsiniz. örneğin, src ip adresinin son 2 bitini alın ve yükü 4 snmp 'tüketiciye' dağıtın. netfilter.org/documentation/HOWTO/…
pQd

@Christopher Cashell stearns.org/doc/iptables-u32.v0.1.html u32 maçı için güzel bir öğreticidir. alternatif olarak - "linux sanal sunucusu" projesine bakın - src / dst ip tabanlı udp paketleri için yük dengeleme yapabilirler.
pQd

0

Bence chmeee'nin cevabı doğru yol. Sürece olabildiğince erken UDP ve SNMP kurtulun, onlar yönetmek korkunç.

Şimdi bir JMS kuyruğuna tüm olayları (tuzaklar dahil) koymak ve daha sonra yük dengeleme ve yük devretme yapmak için kurumsal mesajlaşma tüm harikalarını kullanacak bir sistem inşa ediyorum.


Sanırım yanlış anlıyorsun. . . Tam bir izleme sistemi kurmaya çalışmıyorum, sadece bir SNMP tuzak yönlendiricisi. Burada izlediğimiz 5000 ağ cihazımız ve yüz binlerce portumuz var. O tekerleği yeniden icat etmenin bir yolu yok. . . sadece sahip olduğumuz araçları daha iyi yapmaya çalışıyoruz.
Christopher Cashell

Seni doğru anladım, muhtemelen beni anlamadın;) JMS bir ulaşım aracı olarak kullanılır, çünkü modern brokerlerin tüm bu güzel yük devretme, kalıcılık ve dengeleme özellikleri vardır. Bir URL'ye POST gönderebilir, e-posta gönderebilir, SOAP, ne olursa olsun. UDP hiçbir zaman veri akışı veya akış kontrolü kavramına sahip olmadığı için güvenilir veya dengelenecek şekilde inşa edilmemiştir. Sadece uzun vadede UDP'nin tasarlanmadığı şeyi yapmasını sağlamaya çalışacaksınız.
Aleksandar Ivanisevic

Öneriyi takdir ediyorum, ancak kendi kurumsal düzey ağ izleme sistemimi oluşturmaya kesinlikle hiçbir niyetim veya ilgim yok. Bunların birçoğu zaten mevcut ve ihtiyaç duyduğumuz özellik seti ve ölçeklenebilirliği ile bir tane uygulamak 2-4 yıl boyunca bir düzine programcıdan oluşan bir ekibe ihtiyaç duyacaktır. Uygulanabilir veya arzu edilebilir değil. Bu beni mevcut sistemlerle etkileşime sokuyor ve bu da beni UDP üzerinden bir sürü SNMP ile uğraşmamı sağlıyor.
Christopher Cashell

0

Temel probleminiz olacak, tuzakları aldığınız cihazın gerçek ipini nasıl biliyorsunuz?

Orijinal gönderenin IP adresini almak için, snmptrapd'yi bu yama ile yamayı deneyebilirsiniz - https://sourceforge.net/p/net-snmp/patches/1320/#6afe .

Bu yükü değiştirir, böylece IP başlıkları bozulmadan kalır, böylece yönlendirme ve / veya NATting'inize girmezler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.