SNMP エージェント

概要

プリンター、ネットワークスイッチ、ルーター、UPS など、通常は SNMP に対応しており、完全なオペレーティングシステムと Zabbix エージェントを導入するのが現実的ではないデバイスでは、SNMP 監視を使用したい場合があります。

これらのデバイス上の SNMP エージェントが提供するデータを取得できるようにするには、Zabbix サーバーを --with-net-snmp フラグを指定して SNMP サポート付きで 初期設定 する必要があります。 アイテム値が正しい形式で表示されるように、MIB ファイルのインストール も推奨されます。 MIB ファイルがない場合、UTF-8 の代わりに HEX で値が表示される、またはその逆といった書式の問題が発生することがあります。

SNMP チェックは UDP プロトコルでのみ実行されます。

Zabbix サーバーおよびプロキシのデーモンは、誤った SNMP 応答を受信した場合、次のような行をログに記録します。

SNMP response from host "gateway" does not contain all of the requested variable bindings

これらは問題のあるすべてのケースを網羅するものではありませんが、複合リクエストを無効にすべき個別の SNMP デバイスを特定するのに役立ちます。

Zabbix サーバー/プロキシは、SNMP walk および get アイテムに対して最大 5 回再試行します。 この再試行メカニズムは DNS 解決の失敗には適用されません。

従来の SNMP チェック(単一の OID 番号または文字列)では、Zabbix サーバー/プロキシは、クエリの試行が失敗した後に少なくとも 1 回再試行します。これは、SNMP ライブラリの再試行メカニズム、または内部の 複合処理 メカニズムのいずれかによって行われます。

SNMPv3 デバイスを監視する場合、msgAuthoritativeEngineID(snmpEngineID または "Engine ID" とも呼ばれます)が 2 台のデバイス間で共有されないようにしてください。 RFC 2571(3.1.1.1 節)によると、これは各デバイスで一意でなければなりません。

RFC3414 では、SNMPv3 デバイスが engineBoots を永続化することを要求しています。 一部のデバイスはこれを行わず、その結果、再起動後に SNMP メッセージが古いものとして破棄されます。 このような場合、SNMP キャッシュをサーバー/プロキシ上で手動でクリアする(-R snmp_cache_reload を使用する)か、サーバー/プロキシを再起動する必要があります。

Zabbix は SNMPv3 の EngineID → IP マッピングをキャッシュし、毎回プローブを送信する代わりに、後続のチェックでキャッシュされた EngineID を再利用してネットワークトラフィックを削減します。 EngineID を再利用できない場合は、新しい EngineID を検出するためにプローブ付きの再試行が実行されます。

SNMP監視の設定

SNMPを介してデバイスの監視を開始するには、次の手順を実行する必要があります。

ステップ 1

監視したいアイテムの SNMP 文字列(または OID)を確認します。

SNMP 文字列の一覧を取得するには、snmpwalk コマンド(Zabbix のインストール時に一緒にインストールしているはずの net-snmp ソフトウェアの一部)または同等のツールを使用します。

snmpwalk -v 2c -c public <host IP> .

ここで 2c は SNMP バージョンを表すため、デバイス上の SNMP Version 1 を示す 1 に置き換えることもできます。

これにより、SNMP 文字列の一覧とその最後の値が表示されます。 表示されない場合は、SNMP の「community」が標準の public とは異なる可能性があるため、その値を確認する必要があります。

その後、監視したい文字列が見つかるまで一覧を確認します。たとえば、ポート 3 のスイッチに流入するバイト数を監視したい場合は、次の行の IF-MIB::ifHCInOctets.3 という文字列を使用します。

IF-MIB::ifHCInOctets.3 = Counter64: 3409739121

次に、snmpget コマンドを使用して IF-MIB::ifHCInOctets.3 の数値 OID を確認できます。

snmpget -v 2c -c public -On <host IP> IF-MIB::ifHCInOctets.3

文字列の最後の数字は、監視対象のポート番号であることに注意してください。 あわせて参照: Dynamic indexes

すると、次のような結果が得られます。

.1.3.6.1.2.1.31.1.1.1.6.3 = Counter64: 3472126941

ここでも、OID の最後の数字はポート番号です。

よく使用される SNMP OID の一部は、Zabbix により 数値表現へ自動的に変換されます

上の最後の例では値の型は "Counter64" で、内部的には ASN_COUNTER64 型に対応します。 対応している型の完全な一覧は、ASN_COUNTER、ASN_COUNTER64、ASN_UINTEGER、ASN_UNSIGNED64、ASN_INTEGER、ASN_INTEGER64、ASN_FLOAT、ASN_DOUBLE、ASN_TIMETICKS、ASN_GAUGE、ASN_IPADDRESS、ASN_OCTET_STR、ASN_OBJECT_ID です。 これらの型は、snmpget の出力における "Counter32"、"Counter64"、"UInteger32"、"INTEGER"、"Float"、"Double"、"Timeticks"、"Gauge32"、"IpAddress"、"OCTET STRING"、"OBJECT IDENTIFIER" におおむね対応しますが、表示ヒントの有無によっては "STRING"、"Hex-STRING"、"OID" などとして表示されることもあります。

ステップ 2

デバイスに対応するホストを作成します。

ホストにSNMPインターフェースを追加します。

  1. IPアドレス/DNS名とポート番号を入力します。
  2. ドロップダウンから SNMP version を選択します。
  3. 選択したSNMPバージョンに応じてインターフェース認証情報を追加します。
    • SNMPv1、v2ではコミュニティー名のみが必要です(通常は 'public')。
    • SNMPv3ではより詳細なオプションが必要です。SNMPv3 を参照してください。
  4. ネイティブSNMPバルクリクエスト(GetBulkRequest-PDU)に対する最大繰り返し値(デフォルト: 10)を指定します。これはSNMPv2およびv3の discovery[]walk[] アイテムにのみ適用されます。 この値を高く設定しすぎると、SNMPエージェントチェックのタイムアウトが発生する場合があります。
  5. Use combined requests チェックボックスをオンにすると、SNMPリクエストのcombined processing を有効にできます(ネイティブSNMPバルクリクエストの "walk" および "get" とは関係ありません)。

提供されているSNMPテンプレートのいずれかを使用すると、アイテムのセットが自動的に追加されます。テンプレートを使用する前に、そのテンプレートがホストと互換性があることを確認してください。

Add をクリックしてホストを保存します。

SNMPv3

SNMPv3 では、以下のパラメータが必要です。

  • Context name - SNMP サブネット上でアイテムを識別するためのコンテキスト名を入力します。
    このフィールドではユーザーマクロが解決されます。
  • Security name - セキュリティ名を入力します。
    このフィールドではユーザーマクロが解決されます。
  • Security level - セキュリティレベルを選択します。
    • noAuthNoPriv - 認証プロトコルもプライバシープロトコルも使用しません。
    • AuthNoPriv - 認証プロトコルを使用し、プライバシープロトコルは使用しません。
    • AuthPriv - 認証プロトコルとプライバシープロトコルの両方を使用します。
  • Authentication protocol - 認証プロトコルを選択します: MD5SHA1。net-snmp 5.8 以降では SHA224SHA256SHA384、または SHA512 も使用できます。
  • Authentication passphrase - 認証パスフレーズを入力します。
    このフィールドではユーザーマクロが解決されます。
  • Privacy protocol - プライバシープロトコルを選択します: DESAES128AES192AES256AES192C (Cisco)、または AES256C (Cisco)。
    プライバシープロトコルのサポート に関する注意事項を参照してください。
  • Privacy passphrase - プライバシーパスフレーズを入力します。
    このフィールドではユーザーマクロが解決されます。

SNMPv3 の認証情報(security name、authentication protocol/passphrase、privacy protocol)が誤っている場合:

  • Zabbix は net-snmp から ERROR を受け取ります。ただし、Privacy passphrase が誤っている場合は例外で、その場合 Zabbix は net-snmp から TIMEOUT エラーを受け取ります。
  • SNMP インターフェースの利用可否は赤色(利用不可)に切り替わります。

Security name を変更せずに Authentication protocolAuthentication passphrasePrivacy protocol、または Privacy passphrase を変更した場合、通常は対応する SNMPv3 インターフェースが Zabbix で更新されると自動的に適用されます。 Security name も変更された場合は、すべてのパラメータが直ちに更新されます。

プライバシープロトコルのサポート

お使いのオペレーティングシステムと net-snmp の設定によっては、一部のプライバシープロトコルが利用できない場合があります。

  • 一部の新しいオペレーティングシステム(たとえば RHEL9)では、net-snmp パッケージで DES のサポートが削除されています。

  • AES192 およびそれ以上の暗号化プロトコルは、RHEL 8、CentOS 8、Oracle Linux 8、Debian 12、Ubuntu LTS 22.04、openSUSE Leap 15.5 より古いオペレーティングシステムでは、標準ではサポートされていません。

net-snmp ライブラリが AES192+ をサポートしているか確認するには、次のいずれかの方法を使用してください。

  1. net-snmp-config:
net-snmp-config --configure-options

出力に --enable-blumenthal-aes が含まれている場合、AES192+ はサポートされています。

なお、net-snmp-config は SNMP 用の開発パッケージの一部です(Debian/Ubuntu では libsnmp-dev、CentOS/RHEL/OL/SUSE では net-snmp-devel)であり、デフォルトではインストールされていない場合があります。

  1. snmpget:
snmpget -v 3 -x AES-256

出力に Invalid privacy protocol specified after -3x flag: AES-256 が含まれている場合、AES192+ はサポートされていません。 出力に No hostname specified. が含まれている場合、AES192+ はサポートされていません。

お使いの net-snmp ライブラリが AES192 以上のプロトコルをサポートしていない場合は、--enable-blumenthal-aes オプションを指定して net-snmp を再コンパイルし、その後 --with-net-snmp=/home/user/yourcustomnetsnmp/bin/net-snmp-config オプションを指定して Zabbix サーバーを再コンパイルしてください。

ステップ 3

監視用のアイテムを作成します。

ここで、Zabbix に戻り、先ほど作成した SNMP ホストの アイテム をクリックします。 ホストの作成時にテンプレートを使用したかどうかによって、ホストに関連付けられた SNMP アイテムの一覧、または空の一覧が表示されます。 ここでは、snmpwalk と snmpget を使用して収集した情報を基に、自分でアイテムを作成するものとします。そのため、アイテムの作成 をクリックします。

新しいアイテムのフォームで、必須パラメータを入力します。

パラメータ 説明
名前 アイテム名を入力します。
タイプ ここでは SNMPエージェント を選択します。
キー 意味のあるキーを入力します。
ホストインターフェース スイッチやルーターなどの SNMP インターフェースを選択していることを確認します。
SNMP OID OID の値を入力するには、次のいずれかのサポートされている形式を使用します。

walk[OID1,OID2,...] - 値のサブツリーを取得します。
例: walk[1.3.6.1.2.1.2.2.1.2,1.3.6.1.2.1.2.2.1.3]
このオプションは、ネイティブ SNMP バルクリクエスト(GetBulkRequest-PDU)を非同期で使用します。
このアイテムのタイムアウト設定は、アイテム設定フォームで設定できます。デバイスに到達できない場合に長時間待機しないよう、短いタイムアウト値を設定することを検討してください。先行するリクエストがタイムアウトまたは失敗した場合、最大 5 回再試行されます(例えば、3 秒のタイムアウトでは 15 秒待機する可能性があります)。
このアイテムをマスターアイテムとして使用し、前処理によってマスターアイテムからデータを抽出する従属アイテムを設定できます。
1 回の snmp walk で複数の OID を指定できます。例えば walk[OID1,OID2,...] のように指定すると、各 OID が非同期で処理されます。
バルクリクエストが結果を返さない場合は、バルクリクエストを使用せずに単一レコードの取得が試行されます。
MIB 名をパラメータとして使用できます。そのため、walk[1.3.6.1.2.1.2.2.1.2]walk[ifDescr] は同じ出力を返します。
複数の OID/MIB を指定した場合、つまり walk[ifDescr,ifType,ifPhysAddress] の場合、出力は連結されたリストになります。
SNMPv2 および v3 インターフェースでは GetBulk リクエストが、SNMPv1 インターフェースでは GetNext が使用されます。バルクリクエストの最大繰り返し回数は、インターフェースレベルで設定します。
最大繰り返し回数パラメータは、1 回のバルクレスポンスで返される OID の最大数を決定することで、バルクリクエストに影響します。
値を大きくするとバルクレスポンスが大きくなり、必要な送信回数が減少します。ただし、非常に大きな値をサポートしていないデバイスもあり、問題が発生する可能性があります。
このアイテムは、-Oe -Ot -On パラメータを指定した snmpwalk ユーティリティの出力を返します。
このアイテムは、SNMP ディスカバリのマスターアイテムとして使用できます。

get[OID] - 単一の値を非同期で取得します。
例: get[1.3.6.1.2.1.31.1.1.1.6.3]
このアイテムのタイムアウト設定は、アイテム設定フォームで設定できます。デバイスに到達できない場合に長時間待機しないよう、短いタイムアウト値を設定することを検討してください。先行するリクエストがタイムアウトまたは失敗した場合、最大 5 回再試行されます(例えば、3 秒のタイムアウトでは 15 秒待機する可能性があります)。

OID - (レガシー)単一の値を同期的に取得するため、単一のテキスト形式または数値形式の OID を入力します。必要に応じて、他の値と組み合わせることもできます。
例: 1.3.6.1.2.1.31.1.1.1.6.3
このオプションでは、アイテムチェックのタイムアウトはサーバー設定ファイルで設定された値と同じになります。

パフォーマンスを向上させるため、walk[OID] および get[OID] アイテムを使用することを 推奨します。すべての walk[OID] および get[OID] アイテムは非同期で実行されるため、他のチェックを開始する前に 1 つのリクエストへの応答を受信する必要はありません。DNS 解決も非同期で行われます。
非同期チェックの最大同時実行数は 1000 です(MaxConcurrentChecksPerPoller で定義)。非同期 SNMP ポーラーの数は、StartSNMPPollers パラメータで定義します。

いずれかの方法で返されるネットワークトラフィック統計については、前処理 タブで 1 秒あたりの変化量 のステップを追加する必要があります。追加しない場合、最新の変化量ではなく、SNMP デバイスからの累積値が取得されます。

すべての必須入力フィールドには、赤いアスタリスクが付いています。

ここでアイテムを保存し、SNMP データを確認するために 監視 > 最新データ に移動します。

例1

一般的な例:

パラメータ 説明
OID 1.2.3.45.6.7.8.0 (または .1.2.3.45.6.7.8.0)
キー <トリガーの参照として使用する一意の文字列>
例: "my_param"。

OIDは数値または文字列のいずれかの形式で指定できます。 ただし、場合によっては文字列OIDを数値表現に変換する必要があります。 この目的にはsnmpgetユーティリティを使用できます:

snmpget -On localhost public enterprises.ucdavis.memory.memTotalSwap.0

例2

稼働時間の監視:

パラメータ 説明
OID MIB::sysUpTime.0
キー router.uptime
値の型 浮動小数点
単位 uptime
前処理ステップ: カスタム乗数 0.01

ネイティブSNMPバルクリクエスト

walk[OID1,OID2,...] アイテムは、SNMPバージョン2/3で利用可能なバルクリクエスト(GetBulkRequest-PDUs)のネイティブSNMP機能を使用できます。

SNMPのGetBulkリクエストは、複数のGetNextリクエストを実行し、その結果を1つのレスポンスで返します。 これにより、通常のSNMPアイテムやSNMPディスカバリでネットワークの往復回数を最小限に抑えることができます。

SNMPの walk[OID1,OID2,...] アイテムは、1回のリクエストでデータを収集するマスターアイテムとして使用でき、依存アイテムがプリプロセスを使用して必要に応じてレスポンスを解析します。

ネイティブSNMPバルクリクエストの使用は、SNMPリクエストの結合オプションとは関係ありません。これは、複数のSNMPリクエストを結合するZabbix独自の方法です(次のセクションを参照)。

SNMPバルクアイテムでは、パケットの1つが失われた場合の失敗を回避するために最大5回のリトライが行われます。 getおよびwalkのSNMPアイテムのタイムアウト(アイテムの設定フォームで設定)は、セッション全体に設定されます。 タイムアウトは、データが完全に取得されたかどうかに関係なく適用されます。データが部分的に受信された場合(たとえば、複数のOIDのうち1つだけが正常に収集された場合)、アイテムは「部分的なデータのみ受信」とメッセージが表示され、サポート対象外になります。 タイムアウトに達した場合はリトライが行われ、タイムアウトがリセットされ、最後のリクエストが再送信されます。これにより、単一のパケットが失われたり遅れて到着した場合でも、最後のリクエストからセッションを継続できます。 デバイスに到達できない場合に長い遅延を避けるため、タイムアウト値を低く設定することを検討してください。タイムアウトや失敗が発生した場合、最大5回のリトライが行われるためです(例:3秒のタイムアウトの場合、最大15秒待機する可能性があります)。

複合処理の内部動作

Zabbixサーバーおよびプロキシは、1回のリクエストで複数の値をSNMPデバイスに問い合わせることができます。 これは、次の種類のSNMPアイテムに影響します。

同一インターフェース上にあり、パラメータが同一のすべてのSNMPアイテムは、同時に問い合わせるようスケジュールされます。 最初の2種類のアイテムは、ポーラーによって最大128アイテムのバッチ単位で処理されます。一方、ローレベルディスカバリルールは、これまでどおり個別に処理されます。

より低いレベルでは、値を問い合わせるために実行される操作は、「指定された複数のオブジェクトの取得」と「OIDツリーのウォーク」の2種類です。

「取得」では、最大128個の可変バインディングを含むGetRequest-PDUが使用されます。 「ウォーク」では、SNMPv1に対してGetNextRequest-PDUが使用され、SNMPv2およびSNMPv3に対しては、max-repetitionsフィールドが最大128に設定されたGetBulkRequestが使用されます。

したがって、各SNMPアイテムタイプに対する複合処理の利点は、次のようになります。

  • 通常のSNMPアイテムは、「取得」の改善によるメリットを受けます。
  • 動的インデックスを使用するSNMPアイテムは、「取得」と「ウォーク」の両方の改善によるメリットを受けます。「取得」はインデックスの検証に使用され、「ウォーク」はキャッシュの構築に使用されます。
  • SNMPローレベルディスカバリルールは、「ウォーク」の改善によるメリットを受けます。

ただし、すべてのデバイスが1回のリクエストで128個の値を返せるわけではないという技術的な問題があります。 常に適切なレスポンスを返すデバイスもありますが、潜在的なレスポンスが一定の制限を超えると、tooBig(1)エラーを返すか、まったく応答しなくなるデバイスもあります。

特定のデバイスに対して問い合わせるオブジェクト数の最適値を見つけるため、Zabbixは次の戦略を使用します。 まず、慎重に1回のリクエストで1つの値を問い合わせます。 成功した場合は、1回のリクエストで2つの値を問い合わせます。 これも成功した場合は、1回のリクエストで3つの値を問い合わせ、その後も同様に、問い合わせるオブジェクト数を1.5倍にしていきます。その結果、リクエストサイズは次の順序になります: 1、2、3、4、6、9、13、19、28、42、63、94、128。

ただし、デバイスが適切なレスポンスの返却を拒否した場合(たとえば、42個の変数に対して拒否した場合)、Zabbixは2つの処理を行います。

まず、現在のアイテムバッチでは、1回のリクエストに含めるオブジェクト数を半分にし、21個の変数を問い合わせます。 デバイスが稼働している場合、28個の変数が動作することが確認されており、21個はそれより大幅に少ないため、ほとんどの場合は問い合わせが成功します。 それでも失敗する場合、Zabbixは値を1つずつ問い合わせる処理にフォールバックします。 この時点でも失敗する場合、デバイスが応答していないことは明らかであり、リクエストサイズは問題ではありません。

次に、後続のアイテムバッチに対しては、Zabbixは最後に成功した変数数(この例では28個)から開始し、上限に達するまでリクエストサイズを1ずつ増やします。 たとえば、最大レスポンスサイズが32個の変数であるとすると、後続のリクエストサイズは29、30、31、32、33になります。 最後のリクエストは失敗し、Zabbixがサイズ33のリクエストを再び発行することはありません。 この時点以降、Zabbixはこのデバイスに対して最大32個の変数を問い合わせます。

この変数数で大きなリクエストが失敗する場合、2つの可能性があります。 デバイスがレスポンスサイズを制限するために使用している正確な基準を知ることはできませんが、変数数を使用して近似を試みます。 1つ目の可能性は、この変数数が一般的なケースにおけるデバイスの実際のレスポンスサイズ制限付近であることです。レスポンスが制限未満になる場合もあれば、制限を超える場合もあります。 2つ目の可能性は、いずれかの方向のUDPパケットが単純に失われたことです。 このため、Zabbixは問い合わせに失敗すると、デバイスが余裕を持って処理できる範囲のより深いところまで到達できるよう、試行する変数の最大数を減らします。ただし、減らすのは2回までです。

上記の例で、32個の変数を含む問い合わせがたまたま失敗した場合、Zabbixは数を31個に減らします。 それでも失敗した場合、Zabbixは数を30個に減らします。 ただし、Zabbixは数を30個未満には減らしません。これ以上の失敗は、デバイスの制限ではなく、UDPパケットの損失が原因であると判断するためです。

ただし、別の理由でデバイスが複合リクエストを適切に処理できず、上記のヒューリスティックが機能しない場合は、各インターフェースに「複合リクエストを使用」設定があります。この設定を使用すると、そのデバイスに対する複合リクエストを無効にできます。

複合リクエストによって部分的または不正なレスポンスが返され、1秒あたりの値(差分)の計算が不正確になる場合(たとえば、インターフェースカウンターに見かけ上のスパイクが発生する場合)は、影響を受けるインターフェースで複合リクエストを使用を無効にし、アイテムごとに個別の問い合わせを強制してください。これにより、誤ったスパイクを防止できることがよくあります。 または、非同期で実行され、インターフェースごとの複合リクエストを使用のバッチ処理の対象とならない、非同期のget[]またはwalk[]アイテムの使用を検討してください。これらは、複合リクエストに関連する問題を回避するため、従来の同期OIDチェックの代わりに使用できます。 影響を受けるデバイスを特定するには、概要セクションに示されているものと同様のサーバー/プロキシログエントリを確認してください。

さらに、インターフェースが頻繁に使用不可になる場合は、リクエスト頻度を減らすため、ZabbixサーバーまたはZabbixプロキシの設定ファイルにあるUnavailableDelayパラメータの値を増やす必要がある場合があります。 ディスカバリまたはOIDウォーク中に部分的なデータを受信すると、アイテムがサポート対象外になることがあります。