labunix's blog

labunixのラボUnix

Fortigateの性能情報をSNMPで取得する。

■Fortigateの性能情報をSNMPで取得する。
 以下の続き。

 Fortigate-60Cの性能情報ログを自前のスクリプトで取得する。
 http://labunix.hateblo.jp/entry/20150816/1439726859

■debianホストはSNMPクライアントがあれば良い。
 今回はSNMPDサーバでもあるWheezyと、SNMPクライアントのみのJessieでテスト。

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 7.8 (wheezy)
Release:	7.8
Codename:	wheezy

$ dpkg -l | awk '/snmp/{print $2}'
libsnmp-base
libsnmp15
snmp
snmp-mibs-downloader
snmpd

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 8.1 (jessie)
Release:	8.1
Codename:	jessie

$ dpkg -l | awk '/snmp/{print $2}'
libsnmp-base
libsnmp30:amd64
snmp

■ディレクトリを作成してGUIからmibファイルをダウンロード

$ mkdir ~/.snmp/mibs/ && cd ~/.snmp/mibs/
$ grep DEFINITIONS *.mib
FORTINET-CORE-MIB.mib:FORTINET-CORE-MIB DEFINITIONS ::= BEGIN
FORTINET-FORTIGATE-MIB.mib:FORTINET-FORTIGATE-MIB DEFINITIONS ::= BEGIN

$ grep -B 5 -A 3 -i "\"Current [cm][pe][mu].*percentage)\"" dlsv/FORTINET*.mib
FORTINET-FORTIGATE-MIB.mib-fgSysCpuUsage OBJECT-TYPE
FORTINET-FORTIGATE-MIB.mib-    SYNTAX      Gauge32 (0..100)
FORTINET-FORTIGATE-MIB.mib-    MAX-ACCESS  read-only
FORTINET-FORTIGATE-MIB.mib-    STATUS      current
FORTINET-FORTIGATE-MIB.mib-    DESCRIPTION 
FORTINET-FORTIGATE-MIB.mib:        "Current CPU usage (percentage)"
FORTINET-FORTIGATE-MIB.mib-    ::= { fgSystemInfo 3 }
FORTINET-FORTIGATE-MIB.mib-
FORTINET-FORTIGATE-MIB.mib-fgSysMemUsage OBJECT-TYPE
FORTINET-FORTIGATE-MIB.mib-    SYNTAX      Gauge32 (0..100)
FORTINET-FORTIGATE-MIB.mib-    MAX-ACCESS  read-only
FORTINET-FORTIGATE-MIB.mib-    STATUS      current
FORTINET-FORTIGATE-MIB.mib-    DESCRIPTION 
FORTINET-FORTIGATE-MIB.mib:        "Current memory utilization (percentage)"
FORTINET-FORTIGATE-MIB.mib-    ::= { fgSystemInfo 4 }
FORTINET-FORTIGATE-MIB.mib-
FORTINET-FORTIGATE-MIB.mib-fgSysMemCapacity OBJECT-TYPE

■Fortigate-60CのSNMPDの設定は以下。

$ cat fgtsnmp.conf 
show system interface internal | grep -f "snmp "
show system snmp sysinfo | grep -v "set events"
show system snmp community | grep -v "set events"
show system snmp user | grep -v "set events"

$ cat fgtsnmp.conf | ssh admin@172.31.31.252
Pseudo-terminal will not be allocated because stdin is not a terminal.
home-utm1 # config system interface
    edit "internal"
        set vdom "root"
        set ip 172.31.31.252 255.255.255.0
        set allowaccess ping https ssh snmp http telnet <---
        set type physical
        set snmp-index 8
    next
end

home-utm1 # config system snmp sysinfo
    set status enable
end

home-utm1 # config system snmp community
    edit 1
        set name "public"
            config hosts
                edit 1
                    set ip 172.31.31.0 255.255.255.0
                    set interface "internal"
                    set host-type query
                next
            end
        set trap-v1-status disable
        set trap-v2c-status disable
    next
end

home-utm1 # config system snmp user
    edit "snmp"
        set notify-hosts 172.31.31.254
    next
end

■まずは拡張子「.mib」を取り除く

$ ls *.mib | awk '{print "mv",$1,$1}' | sed -e 's/.mib$//g'
mv FORTINET-CORE-MIB.mib FORTINET-CORE-MIB
mv FORTINET-FORTIGATE-MIB.mib FORTINET-FORTIGATE-MIB

$ ls *.mib | awk '{print "mv",$1,$1}' | sed -e 's/.mib$//g' | sh

■CPU使用率、メモリ使用率のOIDを確認
 「ALL」キーワードのMIB検索には「~/.snmp/mibs」ディレクトリが含まれる。

$ snmptranslate -M +ALL -IR -On fgSysCpuUsage 2>/dev/null
.1.3.6.1.4.1.12356.101.4.1.3

$ snmptranslate -M +ALL -IR -On fgSysMemUsage 2>/dev/null
.1.3.6.1.4.1.12356.101.4.1.4

■CPU、メモリ使用率の取得

$ snmpwalk -c public -v 1 172.31.31.252 .1.3.6.1.4.1.12356.101.4.1.3 2>/dev/null
FORTINET-FORTIGATE-MIB::fgSysCpuUsage.0 = Gauge32: 0

$ snmpwalk -c public -v 1 172.31.31.252 .1.3.6.1.4.1.12356.101.4.1.4 2>/dev/null
FORTINET-FORTIGATE-MIB::fgSysMemUsage.0 = Gauge32: 75

■OIDさえ分かってしまえば、mibファイルが無い環境からでも取得出来る。

$ snmpwalk -c public -v 1 172.31.31.252 .1.3.6.1.4.1.12356.101.4.1.1.0
iso.3.6.1.4.1.12356.101.4.1.1.0 = STRING: "v5.2.3,build0670,150318 (GA)"1階層上の情報を採取して整形
 SNMPv3も採取出来る。今回は「認証なし, 非プライベート」とした。
 こちらの方がレスポンスも良い。

$ snmpwalk -c public -v 1 172.31.31.252 .1.3.6.1.4.1.12356.101.4.1 2>&1 | \
    awk 'BEGIN{"date +%Y/%m/%d,%H:%M:%S," | getline;printf $0}; \
               /fgSys[CM][pe][mu]Usage/{printf "%s,",$NF}' | sed -e 's/,$/\n/'
2015/08/17,21:18:07,0,75

$ snmpwalk -c public -v 2c 172.31.31.252 .1.3.6.1.4.1.12356.101.4.1 2>&1 | \
    awk 'BEGIN{"date +%Y/%m/%d,%H:%M:%S," | getline;printf $0}; \
               /fgSys[CM][pe][mu]Usage/{printf "%s,",$NF}' | sed -e 's/,$/\n/'
2015/08/17,21:20:29,0,75

$ snmpwalk -c public -v3 172.31.31.252 -u snmp -l NoauthNoPriv \
    .1.3.6.1.4.1.12356.101.4.1 2>&1 | \
    awk 'BEGIN{"date +%Y/%m/%d,%H:%M:%S," | getline;printf $0}; \
               /fgSys[CM][pe][mu]Usage/{printf "%s,",$NF}' | sed -e 's/,$/\n/'
2015/08/17,21:31:07,0,75

■というわけでcronスクリプトを差し替え
 ついでに日付単位でローテーション、MIBでもOIDでも採取、
 ユーザ権限で実行出来るように変更。
 ただし、SNMP情報が採取出来なくても何のチェックも行わず、
 日付と時刻は出力されるので注意。

$ sudo mkdir /var/log/fgt && sudo chown -R labunix:labunix 
$ cat /var/local/fortigate-perf.sh 
#!/bin/bash

TARGETIP="172.31.31.252"
TARGETOID=".1.3.6.1.4.1.12356.101.4.1"
FGTPERFLOG=/var/log/fgt/fortigate-perf-`date '+%Y%m%d'`.csv
snmpwalk -v 1 -c public ${TARGETIP} ${TARGETOID} 2>/dev/null | \
    awk 'BEGIN{"date +%Y/%m/%d,%H:%M:%S," | getline;printf $0}; \
               /fgSys[CM][pe][mu]Usage/ || /1.[34].0 =/ \
               {printf "%s,",$NF}' | \
    sed -e 's/,$/\n/' >> ${FGTPERFLOG}

$ cat /etc/cron.d/fgtperf 
#
SHELL=/bin/sh
PATH=/bin:/usr/bin
FGTPERF=/var/local/fortigate-perf.sh

*/5 * * * *   labunix	test -x $FGTPERF && /bin/bash $FGTPERF

■cronの実行結果の確認
 ホスト名を取得して、ファイル名に反映とかも出来るけど、今日はここまで。

$ cat /var/log/fgt/fortigate-perf-20150817.csv 
2015/08/17,22:30:01,0,75

■余談
 ディスクレスモデルなので関係無いが、ディスクの使用率も取得できる。

$ grep "fgSys.*Usage.*OBJECT-TYPE" *
FORTINET-FORTIGATE-MIB:fgSysCpuUsage OBJECT-TYPE
FORTINET-FORTIGATE-MIB:fgSysMemUsage OBJECT-TYPE
FORTINET-FORTIGATE-MIB:fgSysDiskUsage OBJECT-TYPE
FORTINET-FORTIGATE-MIB:fgSysLowMemUsage OBJECT-TYPE

$ snmptranslate -M +ALL -IR -On fgSysDiskUsage 2>/dev/null
.1.3.6.1.4.1.12356.101.4.1.6