序章

システム管理者であることの大部分は、サーバーとインフラストラクチャに関する正確な情報を収集することです。 このタイプの情報を収集および処理するためのツールとオプションは多数あります。 それらの多くは、SNMPと呼ばれるテクノロジーに基づいて構築されています。

SNMPは、簡易ネットワーク管理プロトコルの略です。 これは、サーバーが現在の状態に関する情報を共有できる方法であり、管理者が事前定義された値を変更できるチャネルでもあります。 プロトコル自体は非常に単純ですが、SNMPを実装するプログラムの構造は非常に複雑になる可能性があります。

以前のガイドでは、SNMPプロトコルの基本Ubuntu14.04サーバーにSNMPコンポーネントをインストールして構成する方法について説明しました。 このガイドでは、これまで使用してきたnet-snmpスイートに付属する多くのツールの基本的な使用法について説明します。

実際に情報を収集してリモートホストを操作するために、前回のガイドで設定した構成を活用する方法について説明します。 このチュートリアルでは、インストールおよび構成ガイドの最後に2つのホストがセットアップされていることを前提としています。

SNMPクライアントコマンドの使用

これまで使用してきたnet-snmpツールスイートには、リモートホストでOID値を照会または設定するのに役立つユーティリティが多数含まれています。 幸い、ほとんどのツールは一連の共有構文を活用しており、同様の使用パターンを持っています。 以下では、人気のあるものの基本的な使用法について説明します。

このガイドでは、net-snmpコマンドを提供するために必要な認証部分に精通していることを前提としています。 以下のセクションでは、すべての認証情報をauthentication_infoと呼びます。

ここで説明するように、クライアントのsnmp.conf構成を設定している場合は、認証の詳細が構成ファイルから読み取られるため、コマンドのこのセクションを削除できます。

snmp.confファイルがない場合は、各コマンドの「authentication_info」をリモートデーモンへの接続に必要な情報に置き換える必要があります。 このシリーズで設定したdemoアカウントの場合、次の値を使用できます。

-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password

別の環境にいる場合は、これらのコマンドを実行するときに独自の値に置き換えてください。

必要な認証の詳細がわかったので、使用可能なコマンドのいくつかを理解しましょう。

SnmpGetを使用した単一のOID値の取得

これはおそらく、SNMPを使用して情報を照会するための最も基本的なコマンドです。 前に説明した基本認証フラグを使用して、snmpgetコマンドを使用して、ユーザーがアクセスできる任意のOIDの値を読み取ることができます。

基本的な使用法は、既知の数値OIDを指定することです。 たとえば、次のように入力してシステムの説明を取得できます。

snmpget authentication_info host 1.3.6.1.2.1.1.1.0

前回のガイドでマネージャーコンピューターにsnmp-mibs-downloaderパッケージをインストールしたので、一般的なOIDを名前で参照することもできます。 たとえば、次のように入力して同じ情報を取得できます。

snmpget authentication_info host sysDescr.0

SnmpGetNextを使用して次に使用可能なOID値を取得する

このコマンドは、指定された後のOIDの値を取得するために使用されます。 MIBデータベースはウォーク可能な階層であるため、その値を順番に取得できます。 このプロパティを利用することで、ツリー内の任意のオブジェクトから次のオブジェクトの値(およびOIDラベル)を見つけることができます。

たとえば、システムの説明を取得する方法については上記で説明しました。 次のOIDとその値を見つけるために、同じコマンドを呼び出すことができますが、今回はsnmpgetnextコマンドを使用します。

snmpgetnext authentication_info host sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

これにより、ツリー内の次のシーケンシャルオブジェクトであるシステムObjectIDが返されます。 返されたOIDを使用してこれを何度も繰り返し、各シーケンシャルオブジェクトを取得できます。

snmpgetnext authentication_info host sysObjectID.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16

これらは、以前と同様に、文字列OIDまたは数値OIDを使用できます。

SnmpWalkを使用してMIB階層のセクションを取得する

指定されたOIDの下にあるすべてのOIDを取得するには、snmpwalkコマンドを使用できます。 これにより、指定したポイントの下に存在するツリー全体が返されます。

たとえば、次のように入力すると、ツリーのsystem部分のすべての値を取得できます。

snmpwalk authentication_info host system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26
SNMPv2-MIB::sysContact.0 = STRING: [email protected]
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
SNMPv2-MIB::sysServices.0 = INTEGER: 72
. . .

このコマンドは、要求された値の下にツリー全体を構築できるようになるまで、SNMPgetNext要求をホストに自動的に発行することによって機能します。

基本的にMIBツリー全体を取得する場合は、ルートで次のコマンドを発行できます。

snmpwalk authentication_info host .

これにより、指定されたユーザーがアクセスできるツリー全体が返されます。

これをgrepと一緒に使用して、特定のOID名を検索できます。 たとえば、sysUpTime.0 OIDは、SNMPデーモンがリモートホストで動作していた長さを返すことを知っているかもしれませんが、サーバー自体がオンラインであった時間については興味があるかもしれません。

snmpwalkコマンドを使用してOIDの階層全体を取得し、それをgrepでフィルタリングして、名前に「稼働時間」が含まれるものを探すことができます。 -iフラグを使用して、検索で大文字と小文字の区別をオフにします。

snmpwalk authentication_info host . | grep -i uptime

次のような応答が返されます。

DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56
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
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55
NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance
NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime

これらの値のいくつかを試してみると、hrSystemUptime.0OIDに正しい稼働時間の値が含まれていることがわかります。 これで、そのマシンが起動してからどれくらいの時間が経過したかを知りたいときはいつでも、そのOIDを使用できます。

snmpget authentication_info host hrSystemUptime.0
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52

ご覧のとおり、snmpwalkは、値の正しいOIDを見つけるのに非常に役立ちます。

SnmpTranslateを使用した数値OIDと文字列OID間の変換

スイートで最も役立つコマンドの1つは、実際にはリモートホストと通信しません。 代わりに、MIB階層に関する情報を見つけるのに役立ちます。

snmptranslateユーティリティを使用すると、数値結果をテキスト表現に簡単に変換できます。

snmptranslate 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0

これにより、テキスト名とOID自体の名前を定義するMIBモジュールが提供されます。

このツールを使用して、他の方向に翻訳することもできます。 システムの稼働時間(hrSystemUptime.0)のテキストMIBを見つけたとき、定義されたツリーのどこに興味があったのかもしれません。 -Onフラグを渡して、数値アドレスを取得できます。

OIDに関する情報を受け取るたびに提供されるMIBモジュールを含めることを忘れないでください。

snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0
.1.3.6.1.2.1.25.1.1.0

このツールを使用して、任意のポイントに関する他の多くの詳細情報を取得することもできます。 たとえば、-Tdフラグを使用すると、下部にパスを含む完全な説明を取得できます。

snmptranslate -Tp 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
sysDescr OBJECT-TYPE
  -- FROM	SNMPv2-MIB
  -- TEXTUAL CONVENTION DisplayString
  SYNTAX	OCTET STRING (0..255) 
  DISPLAY-HINT	"255a"
  MAX-ACCESS	read-only
  STATUS	current
  DESCRIPTION	"A textual description of the entity.  This value should
            include the full name and version identification of
            the system's hardware type, software operating-system,
            and networking software."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 }

-O_パラメーターを渡すことにより、出力の表示方法を変更できます。ここで、「_」は出力形式に置き換えられます。 完全なリストは、snmpcmdのマニュアルページの「出力オプション」セクションで確認できますが、より一般的な選択肢のいくつかは次のとおりです。

出力フラグ 説明
-Oa ASCII文字列で表示 SNMPv2-MIB :: sysDescr.0
-の OIDへの完全なテキストパスを表示する .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
-の上 OIDへの完全な数値パスを表示する .1.3.6.1.2.1.1.1.0
-Os 終了テキストのOID表現のみを表示します sysDescr.0

上記のフォーマットオプションは、このスイートの他のほとんどのツールにも適用して、出力を希望どおりにフォーマットできることに注意してください。

SnmpTableを使用してフォーマットされた出力で表形式のデータを取得する

SNMPとともに保存される一部の情報は、実際には表形式です。 snmpwalkには関連するすべてのデータを表示する機能がありますが、フォーマットは一部の用途には理想的ではありません。

たとえば、udpTableOIDでsnmpwalkを使用する場合:

snmpwalk authentication_info host udpTable

私たちはこれを得るでしょう:

UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161
UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679

ただし、snmptableで同じリクエストを行うと、次のようになります。

snmptable authentication_info host udpTable

次のように、適切にフォーマットされたテーブルを取得します。

 udpLocalAddress udpLocalPort
         0.0.0.0          161
         0.0.0.0        35679

これは、人間の読者にとってはるかに優れたフォーマットであり、消費しやすいものです。

SnmpSetを使用した値の変更

このコマンドは、値をOIDに書き込むために使用されます。 これまでの他のコマンドは情報を取得するために使用されていましたが、このコマンドはホスト上のデータを変更するために使用されます。

snmpsetコマンドは、その構文のほとんどを他のコマンドから継承しますが、値を設定するにはいくつかの追加情報が必要です。 基本的な構文は次のようになります。

snmpset authentication_info host OID_to_modify data_type new_value

上記のフィールドのほとんどは、かなり自明です。 ただし、データ型にはもう少し説明が必要です。 各タイプは1文字で表されます。 可能なタイプのリストは以下のとおりです。

  • i :整数
  • u :符号なし整数
  • s :文字列
  • x :16進文字列
  • d :10進文字列
  • n :ヌルオブジェクト
  • o :オブジェクトID
  • t :タイムティック
  • a :IPアドレス
  • b :ビット

snmp-mibs-downloaderパッケージをダウンロードしたので、ほとんどの場合、タイプ識別子の代わりに=と入力する必要があります。

このコマンドを示すために、エージェントコンピューターのsnmpd.confファイルに設定されている値の1つをコメントアウトできます。 構成ファイルで値を指定すると、基本的にそれがハードコーディングされ、通常のSNMPメソッドを使用して値を変更できなくなります。

エージェントコンピューターで、/etc/snmp/snmpd.confファイルを開きます。

sudo nano /etc/snmp/snmpd.conf

sysLocationディレクティブをコメントアウトします。

#sysLocation  Sitting on the Dock of the Bay

ファイルを保存して閉じます。 次に、サービスを再起動します。

sudo service snmpd restart

これで、管理マシンから、これを入力してsysLocationOIDを「Earth」に設定できます。 データ型が文字列であることを指定する「s」に注意してください。

snmpset authentication_info host sysLocation.0 s "Earth"
SNMPv2-MIB::sysLocation.0 = STRING: Earth

場所を調整することで、=型指定子が値型を正しく設定するかどうかをテストできます。

snmpset authentication_info host sysLocation.0 = "New York City"
SNMPv2-MIB::sysLocation.0 = STRING: New York City

値を通常の文字列として正しく解釈しました。

SnmpBulkGetおよびSnmpBulkWalkを使用して効率的にリクエストを発行する

snmpgetおよびsnmpwalkリクエストを繰り返し発行すると、繰り返し使用すると非常に多くのネットワークトラフィックが発生する可能性があります。

この問題を減らすために、snmpbulkgetsnmpbulkwalkという2つのコンパニオンコマンドが作成されました。 これらは、返された各OID値のトランザクションではなく、単一のトランザクション内にすべての戻り値をパックします。 一度に複数のOIDを渡すこともできます。

snmpbulkgetを使用するには、1つ以上のOIDまたはブランチを渡すと、パケットに収まるだけの追加のOIDの値が返されます。

snmpbulkget authentication_info host system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91
SNMPv2-MIB::sysContact.0 = STRING: call now
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: New York City
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

注意すべき点の1つは、snmpbulkgetsnmpgetnextコマンドのように動作することです。つまり、引数として指定されたオブジェクトが除外されます。 上記の例では、特定のオブジェクトを提供する代わりに、ブランチを提供しました。 snmpbulkgetsnmpwalk呼び出しと考えることができますが、結果は1つのパケットになります。

snmpbulkwalkコマンドも同様に動作しますが、サブツリー全体が取得されるまでBulkGetコマンドを実行し続けます。

結論

ご覧のとおり、net-snmpスイートを使用すると、さまざまな方法でデータを取得および操作できます。 これらのアクションをスクリプト化するか、アプリケーションでこれらのユーティリティを活用することにより、複雑な監視および管理環境を構築できます。