2007年12月21日

今日からネットワークエンジニア

いろいろ因果があってSNMPを利用してネットワークの監視を行うことになった。おいらそんなのやったことねーよwwwwwとかいっても仕方がないので、やってみた。

やりたいこと

  • 管理下のサーバを監視し異常がおきたらTrapを送信
  • Trapを受信したら管理グループにメールを送信
  • Trap受信履歴をDBに残し、傾向を追えるようにする

まあ、こんな感じ。以下手順

  1. NET-SNMP5.4.1のダウンロード
  2. インストール。特に設定はなし
  3. ./configure
    make
    make install
  4. /usr/local/share/snmp/snmpd.confの設定。特に難しいところは無い
  5. ####
    # First, map the community name (COMMUNITY) into a security name
    # (local and mynetwork, depending on where the request is coming
    # from):

    # sec.name source community
    com2sec local localhost private
    com2sec mynetwork xxx.xxx.xxx.0/24 public

    ####
    # Second, map the security names into group names:

    # sec.model sec.name
    group MyRWGroup v1 local
    group MyRWGroup v2c local
    group MyRWGroup usm local
    group MyROGroup v1 mynetwork
    group MyROGroup v2c mynetwork
    group MyROGroup usm mynetwork

    ####
    # Third, create a view for us to let the groups have rights to:

    # incl/excl subtree mask
    view all included .1 80

    ####
    # Finally, grant the 2 groups access to the 1 view with different
    # write permissions:

    # context sec.model sec.level match read write notif
    access MyROGroup "" any noauth exact all none none
    access MyRWGroup "" any noauth exact all all none
  6. snmpd起動
  7. /usr/local/sbin/snmpd -Lsd
  8. 起動確認。コミュニティ名とIPはsnmpd.confで定義してある組み合わせ
  9. # snmpwalk -v 2c -c public 192.168.4.11 .1.3.6.1.2.1.1
    SNMPv2-MIB::sysDescr.0 = STRING: Linux batch_dev 2.6.9-5.ELsmp #1
    SMP Wed Jan 5 19:30:39 EST 2005 i686
    SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
    DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (412263) 1:08:42.63
    SNMPv2-MIB::sysContact.0 = STRING: example@example.com
    SNMPv2-MIB::sysName.0 = STRING: snmp-test
    SNMPv2-MIB::sysLocation.0 = STRING: snmp-test
    SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
    SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
    SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
    SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
    SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB
    SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip
    SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB
    SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
    SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
    SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
    SNMPv2-MIB::sysORDescr.3 = STRING: The management information
    definitions for the SNMP User-based Security Model.
    SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
    SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations
    SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations
    SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations
    SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP.
    SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
    SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
  10. 続いてトラップの設定。snmp.confに以下を追記。trap2sinkはTrapの送信先ホスト
  11. authtrapenable 1
    trapcommunity public
    trap2sink xxx.xxx.xxx.xxx
  12. 受信サーバでsnmptrapd.confの設定。とりあえず必要最小限。publicコミュニティで飛んできたTrapに対しLog書き込み、アプリケーションの実行、他ホストへの転送を許可する
  13. authCommunity log,execute,net public
  14. snmptrapd実行
  15. /usr/local/sbin/snmptrapd -Lsd
  16. なんかおかしいのでsyslogを見ると以下のエラーを吐いていた
  17. netsnmp_assert !"registration != duplicate" failed agent_registry.c:535 
    netsnmp_subtree_load()
  18. いろいろ調べたところ、5.4.1固有のバグでパッチがあたっているので当てて見る。
  19. agent/agent_registry.c 532行目付近
    if (next && (next->namelen == new_sub->namelen) &&
    (next->priority == new_sub->priority)) {
    - netsnmp_assert(!"registration != duplicate"); /* always false */
    + if (new_sub->namelen != 1) /* ignore root OID dups */
    + netsnmp_assert(!"registration != duplicate"); /* always false */
    return MIB_DUPLICATE_REGISTRATION;
    }
  20. 再度configureからインストール、今度はエラーなし。
  21. trap送信。OIDはnet-snmp(1.3.6.1.4.1.8072)以下の適当な番号
  22. snmptrap -v 2c -c public localhost '' .1.3.6.1.4.1.8072.99999 
    .1.3.6.1.4.1.8072.99999.1 s "Test Trap"
  23. Trap受信をSyslogで確認
  24. Dec 21 16:52:59 localhost snmptrapd[32107]: 2007-12-21 16:52:59 
    localhost.localdomain [UDP: [127.0.0.1]:34750]:
    DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (319769615) 37 days, 0:14:56.15
    SNMPv2-MIB::snmpTrapOID.0 = OID: NET-SNMP-MIB::netSnmp.99999
    NET-SNMP-MIB::netSnmp.99999.1 = STRING: "Test Trap"

ここまでで一日仕事でした。これからプログラムで受信を試してみる。PerlでNet-SNMPを使うか、シェルでやっちゃうか、PHPのSNMP関数を使うか悩んでいる。個人的にはもちろんPHPがいいのだが、PHPのコンパイルが必要なことが問題か。

ラベル:SNMP net-snmp
posted by ミラクルさん at 17:09| Comment(0) | TrackBack(0) | その他Web技術 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。