前書き

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

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

以前のガイドでは、https://www.digitalocean.com/community/tutorials/an-introduction-to-snmp-simple-network-management-protocol [SNMPプロトコルの基本]およびhttps:// wwwについて説明しました。 digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-client-on-ubuntu-14-04[Ubuntu 14.04サーバーにSNMPコンポーネントをインストールおよび構成する方法]。 このガイドでは、これまで作業してきた `+ net-snmp +`スイートに付属している多くのツールの基本的な使用法について説明します。

実際に情報を収集し、リモートホストを操作するために、最後のガイドで設定した構成を活用する方法について説明します。 このチュートリアルでは、https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-の最後に2つのホストがセットアップされていることを前提としています。 client-on-ubuntu-14-04 [インストールおよび構成ガイド]。

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

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

このガイドの目的上、 `+ net-snmp `コマンドを提供する必要がある認証部分に精通していることを前提としています。 以下のセクションでは、すべての認証情報を「+」と呼びます。

https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-an-snmp-daemon-and-client-on-ubuntu-14-04#CreatingaClientConfigurationFile [セットアップクライアントのsnmp.conf構成]ここで説明したように、認証の詳細が構成ファイルから読み取られるため、コマンドのこのセクションを削除できます。

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

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

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

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

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

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

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

snmpget   1.3.6.1.2.1.1.1.0

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

snmpget   sysDescr.0

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

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

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

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

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

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

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

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

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

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

snmpwalk   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
. . .

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

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

snmpwalk   .

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

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

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

snmpwalk   . | 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

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.0 + OIDに正しいアップタイム値が含まれていることがわかります。 これで、そのマシンが起動してからどれくらいの時間が経過したい場合でも、そのOIDを使用できます。

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

ご覧のとおり、値の正しいOIDを検出するには、「+ snmpwalk +」が非常に役立ちます。

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 +` manページの「OUTPUT OPTIONS」セクションで見ることができますが、より一般的な選択肢は次のとおりです。

Output Flag Description Example

-Oa

Display in ASCII strings

SNMPv2-MIB::sysDescr.0

-Of

Display full textual path to OID

.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0

-On

Display full numerical path to OID

.1.3.6.1.2.1.1.1.0

-Os

Display only the end textual OID representation

sysDescr.0

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

SnmpTableを使用して書式設定された出力で表形式のデータを取得する

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

たとえば、 + udpTable + OIDで `+ snmpwalk +`を使用する場合:

snmpwalk   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   udpTable

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

udpLocalAddress udpLocalPort
        0.0.0.0          161
        0.0.0.0        35679

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

SnmpSetを使用して値を変更する

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

`+ snmpset +`コマンドは他のコマンドからその構文の大部分を継承しますが、値を設定するには追加情報が必要です。 基本的な構文は次のようになります。

snmpset

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

  • * i *:整数

  • * u *:符号なし整数

  • * s *:文字列

  • * x *:16進文字列

  • * d *:10進文字列

  • * n *:NULLオブジェクト

  • * o *:オブジェクトID

  • * t *:タイムティック

  • * a *:IPアドレス

  • * b *:ビット

`+ snmp-mibs-downloader `パッケージをダウンロードしたので、ほとんどの場合、タイプ識別子の1つではなく ` = +`を入力するだけで済みます。

このコマンドを実演するために、エージェントコンピューターの `+ 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

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

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

場所を絞り込むことで、 `+ = +`型指定子が値の型を正しく設定するかどうかをテストできます。

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

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

SnmpBulkGetおよびSnmpBulkWalkを使用したリクエストの効率的な発行

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

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

`+ snmpbulkget`を使用するには、1つ以上のKIDまたはブランチを渡し、追加のOIDの値をパケットに収まるだけ多く取得します。

snmpbulkget   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つは、 `+ snmpbulkget `が ` snmpgetnext `コマンドのように動作することです。つまり、引数として指定されたオブジェクトを除外します。 上記の例では、特定のオブジェクトを提供する代わりに、ブランチを提供しました。 ` snmpbulkget `は ` snmpwalk +`呼び出しと考えることができますが、結果は1つのパケットになります。

`+ snmpbulkwalk `コマンドは同様の方法で動作しますが、サブツリー全体が取得されるまで ` BulkGet +`コマンドを作成し続けます。

結論

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