本記事では、PerlのSNMP_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のインストール
PerlのSNMP_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 Only
、private
として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" }
> 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" }
> perl snmpget.pl ifOperStatus.2 router_ip Results :ifOperStatus.2: :2:
上記の2
はdown
を意味しているため、ポートが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" }
> perl snmpset.pl ifAdminStatus.2 router_ip i 1 Results :ifAdminStatus.2: :1:
インタフェースがup(1)
になったことが確認できます。
最後に
今回はPerlのSNMP_util(SNMP_Session)モジュールを用いて簡単なSNMPコマンドの実行方法について学びました。
しかし、PerlのSNMPモジュールに関してはmetacpanにあるNet::SNMPモジュールを使うのが主流(?)のようなので、こちらはまた別の機会に学習していきます。