This is a translation of the original English documentation page. Help us make it better.

2 SNMPエージェント

概要

SNMPモニタリングは、プリンター、ネットワークスイッチ、UPSなど、通常SNMPが有効なデバイスで使用することができます。
OSとZabbix agent のセットアップを行うことは現実的ではありません。

これらの機器のSNMPエージェントが提供するデータを取得することができます。
Zabbix server でinitially configuredを行い、SNMPをサポートする必要があります。

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

Zabbix server とproxy デーモンは、SNMPデバイスに1回のリクエストで複数の値を問い合わせます。
これは全ての種類のSNMP item(通常のSNMP item、動的インデックスを持つSNMP item、SNMP ローレベルディスカバリ)に影響し、
SNMP処理をより効率的に行えるようになります。
詳しくは、bulk processingセクションを参照してください。
バルクリクエストは、各インターフェイスの ”Use bulk requests" 設定を使用して、
適切に処理できないデバイスのために無効にすることもできます。

Zabbix server と proxy デーモンが不正なSNMPレスポンスを受信した場合、以下のようなログが記録されます。

ホスト "gateway" からのSNMPレスポンスには、要求されたすべての変数バインディングが含まれていません。

このログは、すべての問題となるケースをカバーしているわけではありませんが、バルクリクエストを無効にすべき
個々のSNMPデバイスを特定するのに役立ちます。

Zabbix server / proxy は、SNMPライブラリの再試行メカニズム、または内部のbulk processingメカニズムにより、クエリに失敗した後、少なくとも1回再試行します。

SNMPv3デバイスを監視する場合、以下のことを確認してください。
msgAuthoritativeEngineID (snmpEngineID または "Engine ID" とも呼ばれる) が 2 つのデバイスで
共有されていないことを確認してください。RFC2571 (セクション 3.1.1.1)の規定により、
各デバイスで一意である必要があります。

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

SNMPモニタリングの設定

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

Step1

監視する item のSNMPストリング(またはOID)を見つけます。

SNMPストリングのリストを取得するには、snmpwalkコマンドを使用します
net-snmp ソフトウェア(Zabbixの一部としてインストールされているはずです)を使用します。
または同等のツールを使用します。

shell> snmpwalk -v 2c -c public <ホストIP>

2cはSNMPのバージョンを表し、次のように置き換えることもできます。
'1' に置き換えて、デバイスの SNMP バージョン 1 を表します。

これにより、SNMP文字列とその最後の値のリストが表示されるはずです。
もしSNMPの 'community' が標準の 'public' と異なっている可能性があり、その場合、それが何であるかを確認する必要があります。

例えば、ポート3のスイッチに入ってくるパケットを監視したい場合、次の行から IF-MIB::ifInOctets.3 という文字列を使用します。 この行にある

IF-MIB::ifInOctets.3 = Counter32: 3409739121

これで、snmpgetコマンドを使用して、「IF-MIB::ifInOctets.3」の数値OIDを確認することができます。
'IF-MIB::ifInOctets.3'の数値OIDを調べるために、snmpgetコマンドを使用します。

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

これにより、以下のようなものが得られるはずです。

.1.3.6.1.2.1.2.1.10.3 = Counter32: 3472126941

繰り返しますが、OIDの最後の数字がポート番号です。

3COM は3桁のポート番号を使うようです。
例えばポート1 =ポート101、ポート3=ポート103のように3桁のポート番号を使うようですが、
Ciscoはポート3=3のように普通の数字を使います。

最もよく使用されるSNMP OIDのいくつかは、Zabbix によって
translated automatically to a numeric representationで定義されています。

上記の例では、値のタイプは "Counter32" であり、これは内部的にはASN_COUNTERタイプに相当します。
サポートされるタイプの完全なリストは以下のとおりです。
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 and ASN_OBJECT_ID (バージョン 2.2.8, 2.4.3から)
これらのタイプは、おおよそsnmpget のアウトプットの
"Counter32" , "Counter64", "UInteger32", "INTEGER", "Float", "Double", "Timeticks",
"Gauge32", "IpAddress", "OCTET STRING", "OBJECT IDENTIFIER"に対応しますが、"STRING"、"Hex-STRING", "OID "などと
表示されることもあります。これらは表示ヒントの有無によって異なります。

Step 2

Create a host は、デバイスに対応します。

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

  • IPアドレス/DNS名とポート番号を入力します。
  • ドロップダウンからSNMPバージョンを選択します。
  • 選択したSNMPのバージョンに応じて、インターフェイスの認証情報を追加します。
    • SNMPv1, v2 community のみが必要です(一般的には 'public')
    • SNMPv3 より多くの情報が必要です (下記をご参照ください)
  • SNMPリクエストのバルクリクエストを可能にするため、Use bulk requestsのチェックボックスをマークしたままにします。
SNMPv3 パラメータ 説明
コンテキスト名 SNMPサブネット上のアイテムを識別するためのコンテキスト名を登録します。
コンテキスト名はZabbix2.2からSNMPv3アイテムでサポートされています。
このフィールドではユーザーマクロが解決されます。
セキュリティ名 セキュリティ名を登録します。
このフィールドではユーザーマクロが解決されます。
セキュリティ名 セキュリティレベルを選択します。
noAuthNoPriv - 認証プロトコルもプライバシープロトコルも使用しない
AuthNoPriv - 認証プロトコルを使用し、プライバシープロトコルは使用しない
AuthPriv - 認証プロトコルとプライバシープロトコルを使用する
認証プロトコル 認証プロトコルを選択します。 MD5, SHA1, SHA224, SHA256, SHA384, SHA512から選択可能です。
認証パスフレーズ 認証パスフレーズを登録します。
このフィールドではユーザーマクロが解決されます。
プライバシープロトコル プライバシープロトコルを選択します。DES, AES128, AES192, AES256, AES192C (Cisco), AES256C (Cisco)から選択可能です。
プライバシーパスフレーズ プライバシーパスフレーズを登録します。
このフィールドではユーザーマクロが解決されます。

SNMPv3の認証情報(security name , authentication protocol/passphrase , privacy protocol)が間違っている場合、
Zabbixはnet-snmpからERRORを受け取ります。
ただし、Privacy passphraseが間違っている場合、Zabbixはnet-snmpからTIMEOUTエラーを受信します。

Authentication protocolAuthentication passphrasePrivacy protocolPrivacy passphraseを変更します。
server / proxy 上のキャッシュが有効になった後、キャッシュが手動でクリアされた後(-R snmp_cache_reload)、server/proxyが再起動された場合、 または
Security name が変更された場合、すべてのパラメータが即座に更新されます。

提供されているSNMPテンプレート(Template SNMP Deviceなど)を使用すると、
一連の項目が自動的に追加されます。ただし、テンプレートはホストと互換性がない場合があります。
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+ をサポートしているかどうかを確認するには、次のいずれかのオプションを使用します。

  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

出力に-3x フラグの後に無効なプライバシープロトコルが指定されました: AES-256と表示される場合、AES192+ はサポートされていません。 出力にホスト名が指定されていません。と表示される場合、AES192+ はサポートされていません。

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

Step 3

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

Zabbixに戻り、先ほど作成したSNMPホストの item をクリックします。
ホストを作成する際にテンプレートを使用したかどうかによって、ホストに関連するSNMPアイテムのリストが表示されます。
または空のリストが表示されます。ここでは、snmpwalk と snmpget を使用して収集した情報を使用して、
自分でアイテムを作成することを前提に作業を進めますので、Create item をクリックします。

新しいアイテムのフォームで:

  • item 名を入力します。
  • 'Type'フィールドを 'SNMP agent' に変更します。
  • 'Key' に何か意味のあるもの、例えば SNMP-InOctets-Bps を入力します。
  • 'Host interface' フィールドにお使いのスイッチ/ルーターがあることを確認します。
  • 'SNMP OID'フィールドに、先ほど取得したテキストまたは数値のOIDを入力します(例: .1.3.6.1.2.1.2.1.10.3)
  • 'Type of information' をNumeric (float)に設定します。
  • '更新間隔' と '履歴の保存期間' をデフォルトと異なる値にしたい場合は、入力します。
  • Preprocessing* タブで、Change per second のステップを追加します。
    (重要。さもないと、SNMPデバイスから最新の変更ではなく、累積値を取得することになります)
    必要な場合は、カスタム乗数を選択します。

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

アイテムを保存して、MonitoringLatest data でSNMPのデータを確認します。

例1

一般的な例 :

パラメータ 説明
OID 1.2.3.45.6.7.8.0 (or .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
Key router.uptime
Value type Float
Units uptime
Preprocessing step: Custom multiplier 0.01

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

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

SNMPのGetBulkリクエストは、複数のGetNextリクエストを実行し、結果を単一のレスポンスで返します。これは、通常のSNMPアイテムだけでなく、ネットワークのラウンドトリップを最小限に抑えるためのSNMP検出にも使用できます。

SNMP walk[OID1,OID2,...]アイテムは、必要に応じて前処理を使用してレスポンスを解析する従属アイテムとともに、1つのリクエストでデータを収集するマスターアイテムとして使用できます。

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

SNMPバルクアイテムは、パケットの1つが失われた場合、失敗を回避するために再試行されます。 get および walk を使用した SNMP アイテムのタイムアウト(アイテム設定 フォームで設定)は、セッション全体に対して設定されます。 タイムアウトに達すると再試行が発生し、タイムアウトがリセットされて最後のリクエストが再送信されます。これにより、1 つのパケットが失われたり、到着が遅れたりした場合でも、最後のリクエストからセッションを続行できます。 デバイスが到達不能な場合、長い遅延を回避するために、タイムアウト値を低く設定することを検討してください。以前の再試行がタイムアウトまたは失敗した場合、最大 5 回(Zabbix 7.0.14 以降)再試行が行われます(例:3 秒のタイムアウトは 15 秒の待機時間になる可能性があります)

バルクリクエストの内部動作

Zabbix 2.2.3以降 Zabbix server と proxy は、SNMP機器に対して1回のリクエストで複数の値を問い合わせることができます。
これはいくつかのタイプのSNMP item に影響します。

同一のパラメータを持つ単一インターフェース上のすべてのSNMPアイテムが
同時にクエリされるようにスケジュールされます。
最初の2種類のアイテムは、ポーラーによって最大128アイテムのバッチで取得されますが、
ローレベルディスカバリ発見ルールは、従来通り個別に処理されます。

下位レベルでは、以下の2種類のオペレーションが実行されます。
複数の指定されたオブジェクトを取得することと、OIDツリーを walk することです。

"get" については、最大128個の変数バインディングを持つGetRequest-PDUが使用されます。
walking では、SNMPv1ではGetNextRequest-PDUを、SNMPv2およびSNMPv3では、
最大128の "max-repetitions" フィールドを持つGetBulkRequestを使用します。

各SNMP item タイプにおけるバルクリクエストのメリットを示します。

  • 通常のSNMPアイテムの場合、"get" の改善によるメリットがあります。
  • 動的インデックスを持つSNMPアイテムの場合、"get"と "walk" の両方の改善効果があります。
    "get"はインデックスの検証に、"walk" はキャッシュの構築に使用されます。
  • SNMPのローレベルディスカバリールールは、"walk"の改善により恩恵を受けます。

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

特定のデバイスに対して問合せを実行する最適なオブジェクト数を見つけるために、
Zabbixは次のような戦略をとっています。慎重に開始し1つのリクエストで1つの値を問合せます。
それが成功した場合、リクエストで2つの値を問合せます。再び成功した場合、リクエストで3つの値を問合せます。
というように、問い合わせるオブジェクトの数を1.5倍にしていきます。その結果、リクエストの大きさは次のようになります。
1,2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 128

しかし、デバイスが適切なレスポンスを拒否した場合(例えば、42変数の場合)、Zabbixは2つのことを実行します。

まず、現在の item バッチでは、1回のリクエストでオブジェクトの数を半分にし、21個の変数を問合せます。
デバイスが生きている場合、28変数が動作することが知られており、21はそれよりもかなり少ないからです。
しかし、それでも失敗した場合、Zabbixは値を1つずつクエリすることに戻ります。
この時点でまだ失敗する場合、デバイスは確実に応答しておらず、リクエストサイズは問題ではありません。

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

この変数のサイズで大きな問合せが失敗する場合、次の2つの意味があります。
デバイスが応答サイズを制限するために使用する正確な基準を知ることはできませんが、
私たちは変数のサイズを使用してそれを近似しようとします。
つまり、第1の可能性は、この変数のサイズが一般的な場合、デバイスの実際のレスポンスサイズ制限の範囲ギリギリであること。
2つ目の可能性は、どちらかの方向のUDPパケットが単に紛失した可能性です。
これらの理由から、Zabbixは失敗したクエリを取得した場合、デバイスの快適な範囲に深く入ろうとするため、変数の最大数を減らします。
ただし、最大2回までです。(Zabbix 2.2.8から)

上記の例では、32個の変数を持つクエリがたまたま失敗した場合、Zabbixはカウントを31に減らします。
そのクエリも失敗した場合、Zabbixはカウントを30に減らします。
しかし、Zabbixはカウントを30以下に減らすことはありません。
なぜなら、それ以上の障害はUDPパケットの損失によるものと判断されるからです。

しかし、デバイスが他の理由でバルクリクエストを適切に処理できない場合、
Zabbix 2.4以降では、各インターフェースに "Use bulk requests" 設定があり、そのインターフェースで
そのデバイスのバルクリクエストを無効化することができます。