いろいろ因果があってSNMPを利用してネットワークの監視を行うことになった。おいらそんなのやったことねーよwwwwwとかいっても仕方がないので、やってみた。
やりたいこと
- 管理下のサーバを監視し異常がおきたらTrapを送信
- Trapを受信したら管理グループにメールを送信
- Trap受信履歴をDBに残し、傾向を追えるようにする
まあ、こんな感じ。以下手順
- NET-SNMP5.4.1のダウンロード
- インストール。特に設定はなし
- /usr/local/share/snmp/snmpd.confの設定。特に難しいところは無い
- snmpd起動
- 起動確認。コミュニティ名とIPはsnmpd.confで定義してある組み合わせ
- 続いてトラップの設定。snmp.confに以下を追記。trap2sinkはTrapの送信先ホスト
- 受信サーバでsnmptrapd.confの設定。とりあえず必要最小限。publicコミュニティで飛んできたTrapに対しLog書き込み、アプリケーションの実行、他ホストへの転送を許可する
- snmptrapd実行
- なんかおかしいのでsyslogを見ると以下のエラーを吐いていた
- いろいろ調べたところ、5.4.1固有のバグでパッチがあたっているので当てて見る。
- 再度configureからインストール、今度はエラーなし。
- trap送信。OIDはnet-snmp(1.3.6.1.4.1.8072)以下の適当な番号
- Trap受信をSyslogで確認
./configure
make
make install
####
# 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
/usr/local/sbin/snmpd -Lsd
# 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
authtrapenable 1
trapcommunity public
trap2sink xxx.xxx.xxx.xxx
authCommunity log,execute,net public
/usr/local/sbin/snmptrapd -Lsd
netsnmp_assert !"registration != duplicate" failed agent_registry.c:535
netsnmp_subtree_load()
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;
}
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"
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のコンパイルが必要なことが問題か。