C/C+

Net-SNMPのサブエージェントを作ってみる

プライベートMIBで監視するためのサブエージェントをNet-SNMPをベースに作成してみた。
作成&実行環境はLinux-CentOS7(64bit)、言語はC。

はじめに

Net-SNMPはオープンソースソフトウェアであり、その名の通りSNMPプロトコル関連の機能を提供している。

SNMPを使うとサーバやネットワーク機器のリソース状況(CPU使用率、メモリ使用率、ネットワークトラフィック)などを外部からネットワーク経由で取得することができる。SNMP関連のソフトウェアではTWSNMPマネージャをよく使う(ネコちゃんのアニメーションが印象的)

SNMPでは標準MIB(MIB-2)と呼ばれる管理情報の他にユーザが独自に定義した情報(プライベートMIB)を監視をすることができ、その実現方式の1つとしてサブエージェント経由で情報をやり取りする方法がある。今回はNET-SNMPのマスターエージェント(snmpd)にAgentX接続するサブエージェント(sub_agent)を作成して情報を監視してみる。

Net-SNMPのインストール

ソースコードのダウンロード

まずは下記からソースコードを取ってきてLinux環境にインストールしていく。
(yumでインストールしても良いけどなんとなく)

net-snmp.sourceforge.net

Downloadのリンクから辿りソースコード(tarball)をダウンロードする。

ダウンロードできたらLinux環境へもっていく。

configure / make / make install

ソースコード取ってこれたら解凍/展開して./configureを実行する。
今回のインストール先は/usr/local/とする。

ここで、5回ほどShellから質問されるが下記の通り回答した。(全部Enter連打でもOK)
<enter>はEnterキーの意。

が、ここでエラーが発生して怒られる…
エラーメッセージからPerlの何かが足りなくて怒られている、調べると下記パッケージのインストールで解消されるらしい。

インストール後、再度makeすると確かにエラーなくコンパイルが完了。
最後にmake isntallを実行してインストールが完了。

コンフィグ(snmpd.conf)の作成

このままsnmpdを起動してもSNMPで情報取得を取得することが出来ないため、必要なコンフィグを記載したファイル(snmpd.conf)を作成する。

snmpd.confの記載内容

とりあえず最低限のコンフィグだけ記載する、”master agentx”を記載するとサブエージェント間の通信ができるようになる。

マスターエージェント(snmpd)の起動

snmpd.confを作成したら下記のように引数を渡してsnmpdを起動する。
実行後に一応プロセスが起動しているかpsコマンドで確認。

snmpdが起動したら、試しにSNMPによって管理情報が取得できるかsystem(OID=.1.3.6.1.2.1.1)の情報にアクセスしてみる。

サブエージェントのプログラミング

Net-SNMPがインストールできたので、サブエージェントを作成していく。
ソースコードはNet-SNMPのサンプルコードをベースにする。

サブエージェントが監視するプライベートMIBは簡単のため下記の仕様とした。
・OIDは1.3.6.1.4.1.99999.1
・返却値は3つの固定値(systemのパクリ)
・READ-ONLY

ソースコード

作成するファイル
example-daemon.c
nstAgentSubagentObject.c
nstAgentSubagentObject.h
Makefile

example-daemon.c

nstAgentSubagentObject.c

nstAgentSubagentObject.h

Makefile

サブエージェント起動

ソースコードを作成したらmakeをかけてコンパイルをする。

これでサブエージェント(sub_agent)が出来上がったが、SNMP関連のライブラリのインストール先を/usr/local配下にしたため共有ライブラリのパスが通っていないので解消する。
共有ライブラリの確認はlddコマンドで行う。not foundのライブラリが未解決。

/etc/ld.so.conf.dの下にライブラリパスを記載したファイルを配置してldconfigコマンドを実行するとライブラリパスが反映される。

再度、lddコマンドで確認しパスが表示されていればOK。

その後、サブエージェント(sub_agent)を起動し”AgentX subagent connected”のログが画面に出れば起動完了。(befferが小さいとかいうエラーはとりあえず無視。)

プライベートMIBの取得

マスターエージェント、サブエージェントの両方を起動したら実際に定義したプライベートMIBにアクセスできるか試してみる。snmpwalkを実行して値が表示されれば成功。

参考

Net-SNMP (sourceforge.net)

SNMP サブエージェントプログラミング | 技術文書 | 技術情報 | VA Linux Systems Japan株式会社