2 SNMPエージェント
概要
通常SNMPが有効になっているプリンター、ネットワークスイッチ、ルーター、UPSなどのデバイスでは、完全なオペレーティングシステムや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 を使用)か、サーバー/プロキシを再起動する必要があります。
SNMP監視の設定
SNMPを介してデバイスの監視を開始するには、次の手順を実行する必要があります:
ステップ 1
監視したいアイテムのSNMP文字列(またはOID)を確認します。
SNMP文字列の一覧を取得するには、snmpwalk コマンド(net-snmp ソフトウェアの一部で、Zabbixのインストール時にあわせてインストールされているはずです)または同等のツールを使用します。
snmpwalk -v 2c -c public <host IP> .
ここでの「2c」はSNMPバージョンを表しているため、デバイス上のSNMPバージョン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
文字列の最後の数字は、監視対象のポート番号であることに注意してください。
あわせて参照: 動的インデックス
これにより、次のような結果が得られます。
.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 では、より詳細なオプションが必要です(以下を参照)。
- ネイティブSNMPバルクリクエスト(GetBulkRequest-PDUs)の最大繰り返し値(デフォルト: 10)を指定します。これは、SNMPv2 および v3 の
discovery[]とwalk[]アイテムでのみ使用されます。
この値を高く設定しすぎると、SNMPエージェントのチェックがタイムアウトする可能性があることに注意してください。 - Use combined requests チェックボックスをオンにすると、SNMPリクエストの結合処理が可能になります(ネイティブSNMPバルクリクエストの "walk" および "get" とは無関係です)。
| SNMPv3 parameter | 説明 |
|---|---|
| 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 の認証情報(セキュリティ名、認証プロトコル/パスフレーズ、プライバシープロトコル)が誤っている場合:
- Zabbix は net-snmp から ERROR を受信します。ただし、Privacy passphrase が誤っている場合は、Zabbix は net-snmp から TIMEOUT エラーを受信します。
- SNMPインターフェースの可用性は赤色(利用不可)に切り替わります。
Authentication protocol、Authentication passphrase、Privacy protocol、または Privacy passphrase の変更は、Security name を変更しない限り、通常は対応するSNMPv3インターフェースがZabbixで更新された際に自動的に適用されます。
Security name も変更された場合は、すべてのパラメータが直ちに更新されます。
提供されているSNMPテンプレートのいずれかを使用すると、一連のアイテムが自動的に追加されます。テンプレートを使用する前に、それがホストと互換性があることを確認してください。
Add をクリックしてホストを保存します。
プライバシープロトコルのサポート
使用しているオペレーティングシステムおよび net-snmp の設定によっては、一部のプライバシープロトコルを利用できない場合があります。
-
一部の新しいオペレーティングシステム(例: RHEL9)では、net-snmp パッケージで DES のサポートが廃止されています。
-
RHEL 8、CentOS 8、Oracle Linux 8、Debian 12、Ubuntu LTS 22.04、openSUSE Leap 15.5 より古いオペレーティングシステムでは、暗号化プロトコル AES192 以上はそのままではサポートされていません。
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 server を再コンパイルしてください。
ステップ3
監視用のアイテムを作成します。
それでは、Zabbix に戻り、先ほど作成した SNMP ホストの アイテム をクリックしてください。 ホスト作成時にテンプレートを使用したかどうかによって、ホストに関連付けられた SNMP アイテムの一覧が表示されるか、空の一覧だけが表示されます。 ここでは、snmpwalk と snmpget を使って今収集した情報をもとに、自分でアイテムを作成する前提で進めますので、アイテムの作成 をクリックしてください。
新しいアイテムのフォームで、必要なパラメータを入力します。

| Parameter | Description |
|---|---|
| Name | アイテム名を入力します。 |
| Type | ここでは SNMPエージェント を選択します。 |
| 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]。このオプションでは、ネイティブ SNMP バルクリクエスト(GetBulkRequest-PDUs)を非同期で使用します。 このアイテムのタイムアウト設定は、アイテム設定 フォームで指定できます。デバイスに到達できない場合の長い遅延を避けるため、低めのタイムアウト値を設定することを検討してください。以前の試行がタイムアウトまたは失敗した場合、最大 5 回まで再試行されるためです(例: タイムアウト 3 秒の場合、待機時間が 15 秒になる可能性があります)。 このアイテムはマスターアイテムとして使用でき、前処理を使ってマスターからデータを抽出する依存アイテムを設定できます。 walk[OID1,OID2,...] のように、1 回の snmp walk で複数の OID を指定し、1 つずつ非同期に処理することも可能です。バルクリクエストで結果が返されない場合は、バルクリクエストを使わずに単一レコードの取得が試行されます。 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 が使用されます。バルクリクエストの max repetitions はインターフェースレベルで設定します。 max repetitions パラメータは、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] アイテムは非同期で実行されます。つまり、他のチェックを開始する前に、あるリクエストへの応答を受信する必要はありません。DNS の名前解決も同様に非同期です。非同期チェックの最大同時実行数は 1000 です(MaxConcurrentChecksPerPoller で定義)。非同期 SNMP ポーラーの数は StartSNMPPollers パラメータで定義されます。 どの方法で取得した場合でも、ネットワークトラフィック統計については、前処理 タブで 1秒あたりの変化量 ステップを追加する必要がある点に注意してください。そうしないと、最新の変化量ではなく、SNMP デバイスからの累積値を取得することになります。 |
必須入力フィールドには、赤いアスタリスクが付いています。
次に、アイテムを保存し、SNMP データについて 監視 > 最新データ に移動してください。
例 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 |
| 値の型 | Float |
| 単位 | 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リクエストの結合は、複数のSNMPリクエストをまとめるZabbix独自の方法です(次のセクションを参照)。
SNMPバルクアイテムでは、いずれかのパケットが失われた場合の失敗を回避するため、最大5回の再試行が行われます。
get および walk を使用するSNMPアイテムのタイムアウト(アイテム設定 フォームで設定)は、セッション全体に対して設定されます。
タイムアウトは、データが完全に取得されたかどうかに関係なく適用されます。データが部分的にしか受信されなかった場合(たとえば、複数のOIDのうち1つについてのみ正常にデータが収集された場合)、そのアイテムは "Only partial data received" というメッセージとともに未サポートになります。
タイムアウトに達すると再試行が行われ、タイムアウトはリセットされ、最後のリクエストが再送されます。これにより、単一のパケットが失われた場合や到着が遅すぎた場合でも、最後のリクエストからセッションを継続できます。
デバイスに到達できない場合の長い遅延を避けるため、低めのタイムアウト値を設定することを検討してください。前の試行がタイムアウトまたは失敗した場合、最大5回の再試行が行われるためです(例: タイムアウトが3秒の場合、待機時間が15秒になる可能性があります)。
組み合わせ処理の内部動作
Zabbixサーバーおよびプロキシは、1回のリクエストで複数の値をSNMPデバイスに問い合わせることがあります。 これは、いくつかの種類のSNMPアイテムに影響します。
- 通常のSNMPアイテム
- 動的インデックス付きSNMPアイテム
- SNMPのローレベルディスカバリルール
同一インターフェース上にあり、パラメータが同一のすべてのSNMPアイテムは、同時に問い合わせるようスケジュールされます。 最初の2種類のアイテムは、poller によって最大128アイテムのバッチ単位で処理されます。一方、ローレベルディスカバリルールは、従来どおり個別に処理されます。
より低いレベルでは、値を問い合わせるために実行される操作には2種類あります。複数の指定オブジェクトを取得する方法と、OIDツリーをwalkする方法です。
「取得」では、最大128個の variable binding を持つ 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つあります。 デバイスが応答サイズを制限する際に用いる正確な基準は分かりませんが、Zabbix は変数数を使ってそれを近似しようとします。 したがって、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 中に部分的なデータを受信すると、アイテムが未サポートになることがあります。