3 SNMPエージェント
概要
プリンター、ネットワークスイッチ、ルーター、UPS などのデバイスでは、通常 SNMP が有効になっており、完全なオペレーティングシステムや Zabbix エージェントを導入するのが現実的でないため、SNMP 監視を使用したい場合があります。
これらのデバイス上の SNMP エージェントが提供するデータを取得できるようにするには、Zabbix サーバーを --with-net-snmp フラグを指定して 事前に設定 し、SNMP サポートを有効にしておく必要があります。
アイテム値が正しい形式で表示されるようにするため、MIB ファイルのインストール も推奨されます。
MIB ファイルがない場合、HEX で値が表示されるべきところが UTF-8 で表示される、またはその逆といった書式の問題が発生することがあります。
SNMP チェックは UDP プロトコルでのみ実行されます。
Zabbix サーバーおよびプロキシのデーモンは、誤った SNMP 応答を受信した場合、次のような行をログに記録します。
SNMP response from host "gateway" does not contain all of the requested variable bindings
これらはすべての問題ケースを網羅するものではありませんが、複合リクエストを無効にすべき個別の SNMP デバイスを特定するのに役立ちます。
Zabbix サーバー/プロキシは、SNMP walk および get アイテムに対して最大 5 回再試行します(Zabbix 7.0.14 以降)。
この再試行メカニズムは 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 を使用)か、サーバー/プロキシを再起動する必要があります。
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インターフェースを追加します。
- IPアドレス/DNS名とポート番号を入力します。
- ドロップダウンから SNMP version を選択します。
- 選択したSNMPバージョンに応じてインターフェース認証情報を追加します。
- SNMPv1、v2ではコミュニティー名のみが必要です(通常は 'public')。
- SNMPv3ではより詳細なオプションが必要です。SNMPv3 を参照してください。
- ネイティブSNMP bulkリクエスト(GetBulkRequest-PDU)に対する最大繰り返し値(デフォルト: 10)を指定します。これはSNMPv2およびv3の
discovery[]とwalk[]アイテムにのみ適用されます。 この値を高く設定しすぎると、SNMPエージェントチェックのタイムアウトが発生する場合があります。 - Use combined requests チェックボックスをオンにすると、SNMPリクエストのcombined processing を有効にできます(ネイティブSNMP bulkリクエストの "walk" および "get" とは関係ありません)。
提供されているSNMPテンプレートのいずれかを使用すると、アイテムのセットが自動的に追加されます。テンプレートを使用する前に、そのテンプレートがホストと互換性があることを確認してください。
Add をクリックしてホストを保存します。
SNMPv3
SNMPv3 には次のパラメータが必要です。
- Context name - SNMP サブネット上でアイテムを識別するためのコンテキスト名を入力します。
このフィールドではユーザーマクロが解決されます。 - Security name - セキュリティ名を入力します。
このフィールドではユーザーマクロが解決されます。 - Security level - セキュリティレベルを選択します。
- noAuthNoPriv - 認証プロトコルもプライバシープロトコルも使用しません。
- AuthNoPriv - 認証プロトコルを使用し、プライバシープロトコルは使用しません。
- AuthPriv - 認証プロトコルとプライバシープロトコルの両方を使用します。
- Authentication protocol - 認証プロトコルを選択します: MD5、SHA1。net-snmp 5.8 以降では SHA224、SHA256、SHA384、または SHA512 も使用できます。
- Authentication passphrase - 認証パスフレーズを入力します。
このフィールドではユーザーマクロが解決されます。 - Privacy protocol - プライバシープロトコルを選択します: DES、AES128、AES192、AES256、AES192C (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 protocol、Authentication passphrase、Privacy 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+ をサポートしているか確認するには、次のいずれかの方法を使用します。
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)であり、デフォルトではインストールされていない場合があります。
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ホストの Items をクリックしてください。 ホストの作成時にテンプレートを使用したかどうかによって、ホストに関連付けられたSNMPアイテムの一覧が表示されるか、空の一覧だけが表示されます。 ここでは、snmpwalk と snmpget を使って収集した情報をもとに、自分でアイテムを作成する前提で進めます。したがって、Create item をクリックしてください。
新しいアイテムフォームで、必要なパラメータを入力します。

| Parameter | Description |
|---|---|
| Name | アイテム名を入力します。 |
| Type | ここでは SNMP agent を選択します。 |
| Key | 意味の分かるキーを入力します。 |
| Host interface | 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]。このオプションは、native SNMP bulk requests(GetBulkRequest-PDU)を非同期で使用します。 このアイテムのタイムアウト設定は、アイテム設定フォームで指定できます。デバイスに到達できない場合に長時間待たされるのを避けるため、低めのタイムアウト値を設定することを検討してください。前の試行がタイムアウトまたは失敗した場合、最大5回の再試行が行われます(Zabbix 7.0.14以降。たとえば、3秒のタイムアウトでは15秒待つことになります)。 これをマスターアイテムとして使用し、前処理でマスターからデータを抽出する依存アイテムを持たせることができます。 walk[OID1,OID2,...] のように1つのsnmp walkで複数のOIDを指定し、OIDごとに非同期で処理することも可能です。bulk requestで結果が返らない場合は、bulk requestなしで単一レコードの取得が試行されます。 MIB名をパラメータとして指定することもサポートされています。そのため、 walk[1.3.6.1.2.1.2.2.1.2] と walk[ifDescr] は同じ出力になります。複数のOID/MIBを指定した場合、つまり walk[ifDescr,ifType,ifPhysAddress] のように指定した場合は、出力は連結された一覧になります。GetBulkリクエストはSNMPv2およびv3インターフェースで使用され、SNMPv1インターフェースではGetNextが使用されます。bulk requestの最大繰り返し回数はインターフェースレベルで設定されます。 max repetitionsパラメータは、1回のbulk応答で返されるOIDの最大数を決定することで、bulk requestに影響します。 値を大きくすると1回あたりの応答が大きくなり、必要な送信回数を減らせます。ただし、すべてのデバイスが非常に大きな値をサポートしているとは限らず、問題が発生する場合があります。 このアイテムは、snmpwalkユーティリティの -Oe -Ot -On パラメータを付けた出力を返します。このアイテムは、SNMP discovery のマスターアイテムとして使用できます。 get[OID] - 単一の値を非同期で取得します。 例: get[1.3.6.1.2.1.31.1.1.1.6.3]このアイテムのタイムアウト設定は、アイテム設定フォームで指定できます。デバイスに到達できない場合に長時間待たされるのを避けるため、低めのタイムアウト値を設定することを検討してください。前の試行がタイムアウトまたは失敗した場合、最大5回の再試行が行われます(Zabbix 7.0.14以降。たとえば、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 パラメータで定義されます。 いずれの方法で返されるネットワークトラフィック統計についても、Preprocessing タブに Change per second のステップを追加する必要があります。追加しない場合、最新の変化量ではなく、SNMPデバイスからの累積値が取得されます。 |
必須入力フィールドには赤いアスタリスクが付いています。
最後にアイテムを保存し、SNMPデータの Monitoring > Latest data に移動してください。
例 1
一般的な例:
| Parameter | Description |
|---|---|
| OID | 1.2.3.45.6.7.8.0(または .1.2.3.45.6.7.8.0) |
| Key | <トリガーの参照として使用する一意の文字列> 例えば、"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リクエストを実行し、その結果を単一のレスポンスで返します。 これは、通常のSNMPアイテムだけでなく、ネットワーク往復回数を最小限に抑えるためのSNMPディスカバリにも使用できます。
SNMP walk[OID1,OID2,...] アイテムは、1回のリクエストでデータを収集するマスターアイテムとして使用でき、レスポンスは必要に応じて依存アイテムが前処理を使用して解析します。
ネイティブSNMPバルクリクエストの使用は、SNMPリクエストを結合するオプションとは無関係であることに注意してください。これは、複数のSNMPリクエストを結合するZabbix独自の方法です(次のセクションを参照)。
SNMPバルクアイテムでは、1つのパケットが失われた場合の失敗を回避するため、最大5回の再試行(Zabbix 7.0.14以降)が行われます。
get および walk を使用するSNMPアイテムのタイムアウト(アイテム設定 フォームで設定)は、セッション全体に対して設定されます。
タイムアウトは、データが完全に取得されたかどうかにかかわらず適用されます。データが部分的にしか受信されなかった場合(たとえば、複数のOIDのうち1つについてのみ正常にデータが収集された場合)、そのアイテムは「Only partial data received」というメッセージとともに未サポートになります。
タイムアウトに達すると再試行が行われ、タイムアウトはリセットされ、最後のリクエストが再送されます。これにより、1つのパケットが失われた場合や到着が遅すぎた場合でも、最後のリクエストからセッションを継続できます。
デバイスに到達できない場合の長い遅延を避けるため、タイムアウト値は低めに設定することを検討してください。以前の試行がタイムアウトまたは失敗した場合、最大5回の再試行が行われるためです(例: タイムアウトが3秒の場合、待機時間が15秒になる可能性があります)。
組み合わせ処理の内部動作
Zabbixサーバーおよびプロキシは、1回のリクエストで複数の値をSNMPデバイスに問い合わせることがあります。 これは、いくつかの種類のSNMPアイテムに影響します。
- 通常のSNMPアイテム
- 動的インデックス付きSNMPアイテム
- SNMPのローレベルディスカバリルール
同一インターフェース上にあり、同一のパラメータを持つすべてのSNMPアイテムは、同時に問い合わせるようスケジュールされます。 最初の2種類のアイテムは、最大128アイテムのバッチ単位でポーラーによって処理されます。一方、ローレベルディスカバリルールは、従来どおり個別に処理されます。
より低いレベルでは、値を問い合わせるために実行される操作には2種類あります。複数の指定オブジェクトを取得する方法と、OIDツリーをwalkする方法です。
「取得」では、最大128個の変数バインディングを持つGetRequest-PDUが使用されます。 「walk」では、SNMPv1にはGetNextRequest-PDUが使用され、SNMPv2およびSNMPv3には「max-repetitions」フィールドが最大128のGetBulkRequestが使用されます。
したがって、各SNMPアイテムタイプにおける組み合わせ処理の利点は、以下のとおりです。
- 通常のSNMPアイテムは、「取得」の改善による恩恵を受けます。
- 動的インデックス付きSNMPアイテムは、「取得」と「walk」の両方の改善による恩恵を受けます。「取得」はインデックスの検証に使用され、「walk」はキャッシュの構築に使用されます。
- SNMPローレベルディスカバリルールは、「walk」の改善による恩恵を受けます。
ただし、技術的な問題として、すべてのデバイスが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つずつ問い合わせる方式にフォールバックします。 この時点でも失敗する場合は、デバイスが確実に応答しておらず、リクエストサイズは問題ではないことになります。
次に、後続のアイテムバッチに対しては、最後に成功した変数数(この例では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パケットの損失によるものとみなすためです。
ただし、デバイスが別の理由で組み合わせリクエストを適切に処理できず、上記のヒューリスティックが機能しない場合は、各インターフェースにある「Use combined requests」設定を使用して、そのデバイスに対する組み合わせリクエストを無効にできます。
組み合わせリクエストによって部分的または不正な形式の応答が発生し、その結果、1秒あたり(delta)の計算が不正確になる場合(たとえば、インターフェースカウンターに見かけ上のスパイクが発生する場合)は、影響を受けるインターフェースで Use combined requests を無効にして、アイテムごとの個別問い合わせを強制してください。これにより、誤ったスパイクを防げることがよくあります。
または、非同期の get[] または walk[] アイテムの使用を検討してください。これらは非同期に実行され、インターフェースごとの Use combined requests のバッチ処理の対象になりません。そのため、従来の同期OIDチェックの代わりに使用して、組み合わせリクエストに関連する問題を回避できます。
影響を受けるデバイスを特定するには、概要 セクションに示されているものと同様のサーバー/プロキシログエントリを確認してください。
さらに、インターフェースが頻繁に利用不可になる場合は、リクエスト頻度を下げるために、Zabbix server または Zabbix proxy の設定ファイルで UnavailableDelay パラメータを増やす必要がある場合があります。
ディスカバリまたはOID walk中に部分的なデータを受信すると、アイテムが未サポートになることがあります。