SNMP(Simple Network Management Protocol)はネットワーク管理用に設計されたプロトコルです。SNMPを使って定期的にネットワーク・ルータやスイッチなどネットワーク機器、サーバ等の状態を観察すれば、障害やトラブル発生を事前策を打つことができます。

SNMPには以下3つのバージョンがあります。

  • SNMPバージョン1 RFC1157
  • SNMPバージョン2 RFC1441
  • SNMPバージョン3 RFC3411

最も普及しているのはSNMPバージョン1です。SNMPは「マネージャ」「エージェント」の2要素から構成されます。マネージャからはSNMPに対応した様々な機器の情報や設定を集中管理出来ます。当記事では主にマネージャ側について説明します。

MIB・OID

エージェント側の情報はMIB(Management Information Base)という既定の分類がなされています。MIBにはデータ項目(MIB変数)と、それらに対して出来る処理が決められています。

MIB分類には、system(ホストやルータの名称などシステムの情報), interface(個々のネットワークインタフェース情報), at, ip icmp, tcp, udp, egp, snmp, privateなどがあります。

MIBは沢山のオブジェクトから構成されます。それぞれのオブジェクトにはOIDというピリオドと数字を連続させた番号が設定されています。
個々のMIBには更に、サブツリーがさらに紐づきますが、詳細はここでは割愛します。

SNMPのコミュニティ名

SNMPでは、コミュニティというパスワードを使用します。コミュニティごとに役割や権限を設定できます。

CentOSでSNMPインストール

CentOSでのSNMP機能は、オープンソースのnet-snmpをインストールする事で使用出来るようになります。SNMPには先述の通り「マネージャ」「エージェント」の2要素がありますが、当記事では主にマネージャ側について説明します。マネージャの機能を使用するためには、net-snmp-utilsもインストールする必要があります。

インストールコマンドは以下の通りです。

# yum -y install net-snmp
# yum -y install net-snmp-utils

初期設定

snmpの設定ファイルは以下です。今回はloacalhostからしか受け付けない設定としていますので、設定は適宜変更してください。

# vi /etc/snmp/snmpd.conf

#       sec.name  source          community
#com2sec notConfigUser  default       public # 削除(コメントアウト)
com2sec localgroup  localhost  local_community # ここを追加
# localhost以外からも受け付ける場合はここに追加する(localhostを指定のネットワークに)


#       groupName      securityModel securityName
#group   notConfigGroup v1           notConfigUser  # 削除(コメントアウト)
#group   notConfigGroup v2c           notConfigUser # 削除(コメントアウト)
group   local_group     v1      localgroup   # ここを追加
group   local_group     v2c     localgroup   # ここを追加
group   local_group     usm     localgroup   # ここを追加


# Make at least  snmpwalk -v 1 localhost -c public system fast again.
#       name           incl/excl     subtree         mask(optional)
#view    systemview    included   .1.3.6.1.2.1.1 # 削除(コメントアウト)
#view    systemview    included   .1.3.6.1.2.1.25.1.1 # 削除(コメントアウト)
view    all     included        .1      80  # ここを追加(全てのMIBツリーへのアクセスを許可)
 
 
#       group          context sec.model sec.level prefix read   write  notif
#access  notConfigGroup ""      any       noauth    exact  systemview none none # 削除(コメントアウト)
access  local_group     ""      any     noauth  exact   all     none    none # ここを追加

com2sec

com2sec は、SNMPマネージャに対して、セキュリティグループを決める設定です。エージェントはマネージャをIPとコミュニティ名で識別します。

com2sec <group name> <manager ip> <community>

以下はdefaultというローカルのSNMPマネージャからコミュニティ名publicでアクセスしてきた場合委はセキュリティグループnotConfigUserとして扱う。という設定です。グループの設定は後述します。

com2sec notConfigUser  default       public

外部からエージェントとして接続を許可する場合は、publicのような文字列をそのまま使用するのは不適切です。予測可能なコミュニティ名をそのまま使用すると、外部からシステムの重要な情報を盗み取られる原因となります。

group

セキュリティグループに対して、セキュリティモデルを設定します。

group <group name> <model> <security>
  • v1:SNMPバージョン1で使用する
  • v2:SNMPバージョン2cで使用する
  • usm:SNMPバージョン3で使用する

view

MIBツリーをどこまで参照許可させるかの設定です。

view <view name> <view type> <subtree> <mask>

access

snmpへのアクセス制限を設定します。設定は、com2sec group view を組み合わせで行います。

access <group name> <context> <model> <level> <prefix> <read> <write> <notify>

SNMPの起動・自動起動設定(CentOS7)

# systemctl start snmpd
# systemctl enable snmpd

動作確認

正常に動作するか確認してみます。コマンドは後述しますが、以下のコマンドでサブツリー情報が大量に表示されれば正常に起動しています。

# snmpwalk -v1 localhost -c local_community ucdavis

サブツリー情報が表示されれば問題ありません。以下のメッセージが表示された場合は、コミュニティ名の間違いやバージョンの許可情報の誤りなどを疑ってみてください。

Timeout: No Response from localhost.

SNMPマネージャのコマンドリスト

主なSNMPマネージャのコマンドは以下の通りです。

snmpget

snmpget [-<snmpversion>] <AgentIP> -c <Community> <OID>...
snmpgetは[AgentIP]で指定したSNMPエージェントにリクエストを送り、[OID]の値を取得します。[snmpversion]にはv1,v2c,v3のそれぞれ指定することが出来ますが、省略した場合はv3がデフォルト設定となります。
snmpgetコマンド例
# snmpget -v1 localhost -c local_community system.sysName.0
SNMPv2-MIB::sysName.0 = STRING: hogehoge.com

snmpgetnext

snmpgetnext [-<snmpversion>] <AgentIP> -c <Community> <OID>...
基本的にはsnmpgetと同様です。OIDにインデックスまで指定した場合は、次のオブジェクトに相当するものが表示されます。インデックスの指定が無ければ、当該オブジェクトの最初のインデックスが表示されます。
snmpgetnextコマンド例
# snmpgetnext -v1 localhost -c local_community system.sysDescr
SNMPv2-MIB::sysDescr.0 = STRING: Linux hogehoge.com 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64
# snmpgetnext -v1 localhost -c local_community system.sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

snmpwalk

snmpwalk [-<snmpversion>] <AgentIP> -c <Community> <OID>
<OID>以下のSNMPサブツリーの全情報を取得します。こちらも<snmpversion>を指定できますが、省略した場合はv3がデフォルト設定となります。
snmpwalkコマンド例
# snmpwalk -v1 localhost -c local_community system
SNMPv2-MIB::sysDescr.0 = STRING: Linux hogehoge.com 3.10.0-327.3.1.el7.x86_64 #1 SMP Wed Dec 9 14:09:15 UTC 2015 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (80725) 0:13:27.25
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: hogehoge.com
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
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::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.2 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.3 = STRING: The SNMP Management Architecture MIB.
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::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (3) 0:00:00.03
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (3) 0:00:00.03

snmpdelta

snmpwalk [-<snmpversion>] <AgentIP> -c <Community> -Cp <Nsec> <OID>
snmpdeltaは<OID>の情報を取得し、その差分情報を表示します。
整数値を持つSNMPオブジェクトのOIDでなければ指定できないので注意が必要です。
snmpdeltaコマンド例
# snmpdelta -v1 localhost -c local_community -Cp 3 sysORDescr.1
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0
SNMPv2-MIB::sysORDescr.1 /3 sec: 0

整数値以外のOIDを指定すると以下のようにエラーとなります。

# snmpdelta -v1 localhost -c local_community -Cp 3 sysORID
Failed object: SNMPv2-MIB::sysORID