Engineering Note

プログラミングなどの技術的なメモ

PerlのSNMP_utilの基本的な使い方

network_icon

本記事では、PerlSNMP_util(SNMP_Session)モジュールを使用して、SNMPに対応したIP機器などに要求するSNMPコマンドの基本的な使い方について学んでいきます。

 

 

SNMPとは

SNMP(Simple Network Management Protocol)とは、IP機器(サーバやルータなど)を管理するために1988年に導入されたプロトコルです。

SNMPを用いることで、サーバなどのCPUの使用率や温度状態をポーリングしたり、またルータなどのインタフェースダウンなど異常が発生した際にトラップ(Trap)と呼ばれるものを管理者(Manager)に送信することで、障害検知を容易にすることができます。

SNMPはこれまでにSNMPv1、SNMPv2(厳密にはSNMPv2c)、SNMPv3の3つのバージョンがありますが、SNMPv2がデファクトスタンダードとなっています。

 

SNMP_Sessionのインストール

PerlSNMP_SessionモジュールはCentOS7のISOディスクにパッケージが存在するのでこちらからインストールします。

 

 > yum -y install perl-SNMP_Session
 > find `perl -e 'print "@INC"'` -name '*.pm' -print | grep SNMP
 /usr/share/perl5/vendor_perl/SNMP_Session.pm
 /usr/share/perl5/vendor_perl/SNMP_util.pm

 

上記のSNMP_Sessionをインストールすると、SNMP_utilも一緒にインストールされ、実際の操作ではSNMP_utilを使用していきます。

 

Ciscoルータの設定

GNS3上で起動したCiscoルータ(c7200)に以下のsnmp設定を行います

ここではpublicとしてRead OnlyprivateとしてRead Writeを設定します。

 

 Router(config)# snmp-server community public RO
 Router(config)# snmp-server community private RW

 

snmpwalkコマンド

snmpwalkコマンドとは、機器が保有するMIBツリーの一部を読み込むためのコマンドで、実際はget-nextの操作を行うものになります。

以下ではインタフェース情報を取得しています。

 

# snmpwalk.pl
#!/usr/bin/perl

use SNMP_util;
$MIB1 = shift;
$HOST = shift;
($MIB1) && ($HOST) || die "Usage: $0 MIB_OID HOSTNAME";
(@values) = &snmpwalk("$HOST", "$MIB1");
if (@values) { print "Results :$MIB1: :@values:\n"; }
else { warn "No response from host : $HOST:\n" }

 

上記snmpwalkのPerlスクリプトを実行してみます。

 

> perl snmpwalk.pl interfaces router_ip
 Results :interfaces: :1.0:3 2.1.1.1:1 2.1.1.2:2 2.1.1.4:4 2.1.2.1:FastEthernet0/0 2.1.2.2:FastEthernet0/1 2.1.2.4:Null0 2.1.3.1:6 2.1.3.2:6 2.1.3.4:1 2.1.4.1:1500 2.1.4.2:1500 2.1.4.4:1500 ......

 

上記でinterfacesに関するMIB(IF-MIB)が取得できました。

 

snmpgetコマンド

snmpgetコマンドとは、1度に一つのMIBオブジェクトを取得するコマンドになります。

以下ではインタフェース(FastEthernet0/1)の状態を取得しています。

なお、ifOperStatusは"The current operational state of the interface"の意味になります。

 

# snmpget.pl
#!/usr/bin/perl

use SNMP_util;
$MIB1 = shift;
$HOST = shift;
($MIB1) && ($HOST) || die "Usage: $0 MIB_OID HOSTNAME";
($value) = &snmpget("$HOST", "$MIB1");
if ($value) { print "Results :$MIB1: :$value:\n"; }
else { warn "No response from host : $HOST:\n" }

 

上記snmpgetのPerlスクリプトを実行してみます。

 

 > perl snmpget.pl ifOperStatus.2 router_ip
 Results :ifOperStatus.2: :2:

 

上記の2downを意味しているため、ポートがshutdown状態であることがわかりました。

 

snmpsetコマンド

snmpsetコマンドとは、対象のオブジェクトの状態を変更する時に用い、コミュニティがread-writeまたはwrite-onlyになっている場合可能になります。

以下では上記で確認したFastEthernet0/1のインタフェースをupにしてみます。

インタフェースの状態を変更するにはifAdminStatusを指定し、Integerを意味するiの引数の後に変更する値を指定します。

 

# snmpset.pl
#!/usr/bin/perl

use SNMP_util;
use Getopt::Std;

%OPTS = ("i" => "integer",
         "s" => "string");
 
$MIB1 = shift;
$HOST = shift;
$TYPE = shift;
$VAL  = shift;
($MIB1) && ($HOST) && ($TYPE) && ($VAL) || die "Usage: $0 MIB_OID HOSTNAME TYPE VALUE";

($value) = &snmpset("$HOST", "$MIB1", "$OPTS{$TYPE}", "$VAL");
if ($value) { print "Results :$MIB1: :$value:\n"; }
else { warn "No response from host : $HOST:\n" }

 

上記snmpsetのPerlスクリプトを実行してみます。

 

 > perl snmpset.pl ifAdminStatus.2 router_ip i 1
 Results :ifAdminStatus.2: :1:

 

インタフェースがup(1)になったことが確認できます。

 

最後に

今回はPerlSNMP_util(SNMP_Session)モジュールを用いて簡単なSNMPコマンドの実行方法について学びました。

しかし、PerlSNMPモジュールに関してはmetacpanにあるNet::SNMPモジュールを使うのが主流(?)のようなので、こちらはまた別の機会に学習していきます。

 

参考書籍

入門SNMP