■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
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
set status enable
end
home-utm1
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
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
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