Giải pháp cho các bẫy SNMP định tuyến / proxy (hoặc Netflow, UDP chung, v.v.) để giám sát mạng?


15

Tôi đang triển khai giải pháp giám sát mạng cho một mạng rất lớn (khoảng 5000 thiết bị mạng). Chúng tôi muốn tất cả các thiết bị trên mạng của mình gửi bẫy SNMP vào một hộp duy nhất (về mặt kỹ thuật, đây có thể sẽ là một cặp hộp HA) và sau đó hộp đó chuyển các bẫy SNMP sang các hộp xử lý thực. Điều này sẽ cho phép chúng ta có nhiều hộp xử lý bẫy và phân phối tải trong số các hộp phía sau đó.

Một tính năng chính mà chúng ta cần là khả năng chuyển tiếp các bẫy đến một hộp cụ thể tùy thuộc vào địa chỉ nguồn của bẫy. Bất kỳ đề xuất cho cách tốt nhất để xử lý này?

Trong số những điều chúng tôi đã xem xét là:

  • Sử dụng snmptrapd để chấp nhận các bẫy và chuyển nó sang một tập lệnh xử lý perl được viết tùy chỉnh để viết lại bẫy và gửi nó vào hộp xử lý thích hợp
  • Sử dụng một số loại phần mềm cân bằng tải chạy trên hộp Linux để xử lý việc này (gặp khó khăn khi tìm nhiều chương trình cân bằng tải sẽ xử lý UDP)
  • Sử dụng Thiết bị cân bằng tải (F5, v.v.)
  • Sử dụng IPTables trên hộp Linux để định tuyến bẫy SNMP với NATing

Hiện tại chúng tôi đã triển khai và đang thử nghiệm giải pháp cuối cùng, với hộp Linux có IPTables được cấu hình để nhận bẫy và sau đó tùy thuộc vào địa chỉ nguồn của bẫy, hãy viết lại bằng đích đến (DNAT) để gói được gửi đến máy chủ phù hợp. Ví dụ:

# 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

Điều này sẽ hoạt động với hiệu quả tuyệt vời cho định tuyến bẫy cơ bản, nhưng nó khiến chúng tôi hoàn toàn bị giới hạn ở những gì chúng tôi có thể gia công và lọc bằng IPTables, vì vậy chúng tôi lo ngại về tính linh hoạt cho tương lai.

Một tính năng khác mà chúng tôi thực sự thích, nhưng không hoàn toàn là "phải có" là khả năng sao chép hoặc nhân bản các gói UDP. Có thể lấy một cái bẫy đến và định tuyến nó đến nhiều điểm sẽ rất hữu ích.

Có ai đã thử bất kỳ giải pháp khả thi nào ở trên cho bẫy SNMP (hoặc Netflow, UDP chung, v.v.) không? Hoặc bất cứ ai có thể nghĩ ra bất kỳ giải pháp thay thế nào khác để giải quyết điều này?

Câu trả lời:


4

Một đồng nghiệp chỉ cho tôi xem mẫu . Công cụ này có vẻ chỉ là một giải pháp hoàn hảo mà tôi đang tìm kiếm. Từ trang web của công cụ:

Chương trình đơn giản này lắng nghe các datagram UDP trên một cổng mạng và gửi các bản sao của các datagram này tới một tập hợp các đích. Tùy chọn, nó có thể thực hiện lấy mẫu, tức là thay vì chuyển tiếp mọi gói, chỉ chuyển tiếp 1 trong N. Tùy chọn khác là nó có thể "giả mạo" địa chỉ nguồn IP, để các bản sao dường như đến từ nguồn ban đầu, thay vì chuyển tiếp . Hiện tại chỉ hỗ trợ IPv4.

Nó có thể được sử dụng để phân phối, ví dụ các gói Netflow, bẫy SNMP (nhưng không thông báo) hoặc Syslog cho nhiều người nhận.


3

Tôi sẽ tự mình thực hiện giải pháp, vì tôi không biết liệu bạn có tìm thấy thứ gì đó cụ thể như bạn muốn không.

Tôi sẽ sử dụng một ngôn ngữ cấp cao như ruby ​​để thực hiện các quy tắc cân bằng và thậm chí cả người nghe bẫy. Ví dụ, sử dụng thư viện này có vẻ dễ dàng .

Nghe bẫy:

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

Bạn nên thêm logic cân bằng trong on_trap_defaultkhối.

Gửi bẫy:

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

Để xây dựng daemon, bạn có thể sử dụng đá quý ruby daemon-kit .

Nếu bạn giữ nó đơn giản và xác định các đối tượng tốt, bạn có thể duy trì phần mềm mà không cần nỗ lực nhiều.


Tôi đánh giá cao câu trả lời, nhưng thành thật nếu tôi tự xây dựng một cái gì đó, nó sẽ dựa trên snmptrapd của Net-SNMP và được triển khai trong Perl, vì snmptrapd đã tích hợp hỗ trợ để chấp nhận bẫy và gọi các mô-đun Perl để xử lý chúng. Điều đó giúp nó đơn giản hơn và được hỗ trợ tốt hơn nhiều (chúng tôi có hàng tá người có thể xử lý Perl cơ bản và một anh chàng (hầu như không) chơi với Ruby).
Christopher Cashell

1

Vấn đề chính của bạn sẽ là, làm thế nào để bạn biết ip thực tế của thiết bị bạn đang nhận bẫy từ đâu?

Nếu bạn đang sử dụng SNMP v1, bạn có thể lấy ip ra khỏi tiêu đề của bẫy. Nếu bạn đang sử dụng bẫy v2 hoặc v3, bạn sẽ cần tương quan id snmpengine với ip mà bạn đã tìm nạp trước đó từ thiết bị. Engineid thường không phải là một mục cấu hình bắt buộc đối với hầu hết các triển khai SNMP và do đó bạn không thể hoàn toàn chỉ dựa vào đó.

Dự phòng là bạn có thể sử dụng ip nguồn từ tiêu đề gói udp. Tất nhiên, điều này sẽ thất bại, nếu bẫy của bạn được chuyển qua một EMS / NMS khác hoặc nếu bạn có NAT giữa thiết bị và ứng dụng mgmt của bạn.

  1. Nếu bạn không cần hỗ trợ bẫy NAT / chuyển tiếp từ NMS khác, thì chỉ cần tạo một bản sao của gói udp và định tuyến dựa trên ip

  2. Nếu bạn cần hỗ trợ điều đó, bạn phải phân tích bẫy SNMP và kiểm tra xem có khớp id động cơ cho v2 / v3 không, đối với v1, bạn có thể đọc nó khỏi trường địa chỉ đại lý trong tiêu đề SNMP.


0

thêm một bản hack dựa trên 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

[giả định - tất cả các bẫy được gửi đến 10.0.0.1, sau đó chuyển hướng chúng thành 10.0.0.2, 10.0.0.3, 10.0.0.4]

miễn là bạn có bẫy snmp dài một gói - điều này sẽ lan truyền tải độc đáo - trong trường hợp này trên 3 máy. [mặc dù tôi đã không kiểm tra nó].


Trên thực tế, chúng tôi rất không muốn tải ngẫu nhiên. Chúng tôi muốn tất cả các bẫy từ một mạng con đã cho vào cùng một máy để chúng tôi có thể tương quan các sự kiện với các trang web cụ thể. Ngay bây giờ các quy tắc IPTables của tôi đặt đích DNAT dựa trên nguồn bẫy.
Christopher Cashell

@Christopher Cashell - sau đó, thay vào đó là giải pháp của bạn, bạn có thể sử dụng mô-đun netfilter u32 để máy chủ đích 'băm' dựa trên địa chỉ ip src. ví dụ: lấy 2 bit cuối của địa chỉ ip src và truyền tải tới 4 snmp 'người tiêu dùng'. netfilter.org/documentation/HOWTO/ từ
pQd

@Christopher Cashell stearns.org/doc/iptables-u32.v0.1.html là hướng dẫn hay cho trận đấu u32. Alternativly - nhìn vào dự án "máy chủ ảo linux" - họ có thể thực hiện cân bằng tải cho các gói udp dựa trên ip src / dst.
pQd

0

Tôi nghĩ rằng câu trả lời từ chmeee là cách đúng đắn để đi. Loại bỏ UDP và SNMP ngay từ đầu trong quá trình bạn có thể, chúng thật kinh khủng để quản lý.

Bây giờ tôi đang xây dựng một hệ thống sẽ đặt tất cả các sự kiện (bao gồm cả bẫy) vào hàng đợi JMS và sau đó sử dụng tất cả các kỳ quan của nhắn tin doanh nghiệp để thực hiện cân bằng tải và chuyển đổi dự phòng.


Tôi nghĩ bạn đang hiểu lầm. . . Tôi không cố gắng xây dựng một hệ thống giám sát đầy đủ, chỉ là một bộ định tuyến bẫy SNMP. Chúng tôi đã có 5000 thiết bị mạng và hàng trăm ngàn cổng chúng tôi đang theo dõi ở đây. Không có cách nào tôi phát minh lại bánh xe đó. . . chỉ cố gắng để làm cho các công cụ chúng ta có công việc tốt hơn.
Christopher Cashell

Tôi hiểu bạn đúng, có lẽ bạn đã không hiểu tôi;) JMS được sử dụng như một phương tiện giao thông vì các nhà môi giới hiện đại có tất cả các tính năng chuyển đổi tốt, bền bỉ và cân bằng. Bạn có thể POST vào một URL, gửi email, SOAP, bất cứ điều gì hoạt động. UDP không bao giờ được xây dựng để đáng tin cậy hoặc cân bằng vì nó không có khái niệm về luồng dữ liệu hoặc kiểm soát luồng. Bạn sẽ bị lừa trong thời gian dài cố gắng làm cho UDP làm những gì nó không được thiết kế để làm.
Aleksandar Ivanisevic

Tôi đánh giá cao đề xuất này, nhưng tôi thực sự hoàn toàn không có ý định hay quan tâm đến việc xây dựng hệ thống giám sát mạng cấp doanh nghiệp của riêng tôi. Có rất nhiều trong số chúng đã có sẵn, và thực hiện một cái với bộ tính năng và khả năng mở rộng mà chúng tôi yêu cầu sẽ cần một đội ngũ tá lập trình viên trong 2-4 năm. Nó không khả thi hoặc không mong muốn. Điều đó khiến tôi tương tác với các hệ thống hiện có và điều đó khiến tôi phải đối phó với rất nhiều SNMP qua UDP.
Christopher Cashell

0

Vấn đề chính của bạn sẽ là, làm thế nào để bạn biết ip thực tế của thiết bị bạn đang nhận bẫy từ đâu?

Để lấy IP của người gửi ban đầu, bạn có thể thử vá snmptrapd bằng bản vá này - https://sourceforge.net/p/net-snmp/patches/1320/#6afe .

Điều đó sửa đổi tải trọng, do đó, các tiêu đề IP sẽ được giữ nguyên, vì vậy chúng không đi vào định tuyến và / hoặc NATting của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.