环境介绍:
- 被监控节点 Centos 6.4 snmpd 5.5 pptpd
- cacti系统版本cactiez 0.87
以pptpd为例,用户连接之后保存本次的接口名称到/root/snmpd/interface/
命名为pptp-用户名
。
pptpd通过/etc/ppp/auth-up
脚本可以传递相关参数。在/etc/ppp/auth-up
加入一下内容(如果没有此文件可新建)
#!/bin/bash
REALDEVICE=$1
USER=$2
echo $REALDEVICE >/root/snmpd/interface/pptp-$USER
这里可以通过接入来测试连接脚本是否有效。如用户d2o接入了pptp,生成了一个名为ppp0的接口。如无意外,在目录/root/snmpd/interface/
下会生成了一个名为pptp-d2o
的文件,文件内容ppp0。
[root@localhost ~]# cat /root/snmpd/interface/pptp-d2o
ppp0
用户断开就把/root/snmpd/interface/pptp-用户名
文件删除掉。脚本位置/etc/ppp/auth-down
#!/bin/sh
USER=$2
rm /root/snmpd/interface/pptp-$USER
由于crontab最小的间隔是1分钟,所以用了2个文件来采集数据,每5分钟执行一次cron_control.sh
,然后cron_control.sh
里面每29秒执行一次interface_cron.sh
。实现效果就是每5分钟根据接口名获取一次oid,每29秒抓取一次流量数据,并把数据保存到results.in
和results.out
,分别对应流入流出的字节数。 /root/snmpd/interface_index
用来保存需要监控流量的用户的用户名,并为cacti提供snmpd索引。
例如监控d2o、h2o、t2o三个用户,/root/snmpd/interface_index
的内容如下
pptp-d2o
pptp-h2o
pptp-t2o
/root/snmpd/interface_cron.sh
根据接口oid获取接口流量数据
#!/bin/sh
##interface_cron.sh
##get virtual interface traffic by crontab
##
##power by D2O
##http://blog.csdn.net/conupefox
##
##2016.5.6
WORKDIR=/root/snmpd
cat /dev/null >$WORKDIR/results.in
cat /dev/null >$WORKDIR/results.out
for i in `cat $WORKDIR/interface_index`; do
if [ -s $WORKDIR/oid/$i ]; then
snmpwalk -On -v 2c -c d2o localhost .1.3.6.1.2.1.2.2.1.10.`cat $WORKDIR/oid/$i` | awk '{print $4}' >>$WORKDIR/results.in
snmpwalk -On -v 2c -c d2o localhost .1.3.6.1.2.1.2.2.1.16.`cat $WORKDIR/oid/$i` | awk '{print $4}' >>$WORKDIR/results.out
else
echo >>$WORKDIR/results.in
echo >>$WORKDIR/results.out
fi
done
/root/snmpd/cron_control.sh
ps.其实可以写成for循环
##power by D2O
##http://blog.csdn.net/conupefox
##
##2016.5.6
WORKDIR=/root/snmpd
##get oid
for i in `cat $WORKDIR/interface_index`; do
if [ -s $WORKDIR/interface/$i ]; then
snmpwalk -On -v 2c -c d2o localhost .1.3.6.1.2.1.2.2.1.2 | grep `cat $WORKDIR/interface/$i` | tail -n 1 | awk -F "[. ]" {'print $12'} >$WORKDIR/oid/$i
else
cat /dev/null >$WORKDIR/oid/$i
fi
done
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
sleep 29
$WORKDIR/interface_cron.sh
crontab -e
*/5 * * * * /root/snmpd/cron_control.sh > /dev/null 2>&1
/etc/snmp/snmpd.conf
添加自定义的oid,调用interface_traffic.sh
。interface_traffic.sh
为cacti提供最终的绘图数据。 /etc/snmp/snmpd.conf
extend .1.3.6.1.4.1.2021.60.1 interfacelist /root/snmpd/interface_traffic.sh --list
extend .1.3.6.1.4.1.2021.60.1.42 interfacelist /root/snmpd/interface_traffic.sh --index
extend .1.3.6.1.4.1.2021.60.2 interfacelist /root/snmpd/interface_traffic.sh in
extend .1.3.6.1.4.1.2021.60.3 interfacelist /root/snmpd/interface_traffic.sh out
/root/snmpd/interface_traffic.sh
#!/bin/sh
##interface_traffic.sh
##monitoring virtual interface traffic
##
##power by D2O
##http://blog.csdn.net/conupefox
##
##2016.5.6
WORKDIR=/root/snmpd
case "$1" in
--list)
cat $WORKDIR/interface_index
;;
--index)
intcount=`cat $WORKDIR/interface_index | wc -l`
for i in `seq 1 $intcount`; do
echo $i
done
exit $intcount # this is the value at OID .1.3.6.1.4.1.2021.60.1.42.100.1
;;
in | out)
cat $WORKDIR/results.$1
;;
*)
exit 254
;;
esac
至此,可以使用snmpwalk来测试自定义的oid是否已经生效。(别忘了重启snmpd哦) snmpwalk -On -v 2c -c public localhost .1.3.6.1.4.1.2021.60.1
得到用户列表(在上面例子中是3个用户d2o
h2o
t2o
)。 snmpwalk -On -v 2c -c public localhost .1.3.6.1.4.1.2021.60.1.42
列出所有索引值,并返回用户个数。 snmpwalk -On -v 2c -c public localhost .1.3.6.1.4.1.2021.60.2
流入字节数 snmpwalk -On -v 2c -c public localhost .1.3.6.1.4.1.2021.60.3
流出字节数
做了这么多准备工作,终于到重点了。到cacti控制台里面找到Templates
—-Data Templates
,直接套用Interface - Traffic
的模板duplicate一个出来,或者新建一个也可以我这里命名为Vpn - Traffic
。然后修改一下名称描述之类的东东,关联两个数据源分别命名为_traffic_in
和_traffic_out
。
Data Templates Name | Vpn - Traffic |
---|---|
Data Source Name | |host_description| - Traffic - |query_Name| |
Data Input Method | Get SNMP Data (Indexed) |
Data Source Item | _traffic_in |
Internal Data Source Name | _traffic_in |
Maximum Value | U |
Data Source Item | _traffic_out |
Internal Data Source Name | _traffic_out |
Maximum Value | U |
新建一个图形模板显示接口的流量,找到Templates
—-Graph Templates
。同样直接DuplicateInterface - Traffic (bits/sec, Total Bandwidth)
或者新建,我这里命名为VPN - Traffic (bits/sec, Total Bandwidth)
。配置直接上图了,需要留意的是Graph Item
里面的Data Source
要关联到刚刚新建那两个数据源_traffic_in
和_traffic_out
。
找到Collection Methods
—-Data Queries
,新建一个SNMP - VPN Statistics
,这时会发现需要导入xml文件。ssh登录到cacti的系统里面,新建xml文件/var/www/html/resource/snmp_queries/_interface.xml
Get SNMP VPNs
Queries a host for a list of with traffic monitored
.1.3.6.1.4.1.2021.60.1.42.4.1.2.13.105.110.116.101.114.102.97.99.101.108.105.115.116
.1.3.6.1.4.1.2021.60.1.42.3.1.3.13.105.110.116.101.114.102.97.99.101.108.105.115.116
Name:Index
numeric
|chosen_order_field|
Index
walk
input
.1.3.6.1.4.1.2021.60.1.42.4.1.2.13.105.110.116.101.114.102.97.99.101.108.105.115.116
Interface Name
walk
input
.1.3.6.1.4.1.2021.60.1.4.1.2.13.105.110.116.101.114.102.97.99.101.108.105.115.116
Bytes In
walk
output
.1.3.6.1.4.1.2021.60.2.4.1.2.13.105.110.116.101.114.102.97.99.101.108.105.115.116
Bytes Out
walk
output
.1.3.6.1.4.1.2021.60.3.4.1.2.13.105.110.116.101.114.102.97.99.101.108.105.115.116
完事以后导入那个xml文件,会提示Successfully located XML file
,然后关联图形模板,点add
选中_traffic_in
和_traffic_out
两个数据源,并打钩。下面的Suggested Values
可填可不填,不填的话每次添加图形要自己输入图形的名称。填好的话他会按照模板生成图形名称。
至此所有模板都添加完了,新建图形就和平时添加图形的操作差不多。Device
里面找到需要添加图形的主机,在Associated Data Queries
那里关联刚刚创建的数据查询方法。点击Verbose Query
,如无意外的话,状态Status
那里会显示类似这样的提示Success [28 Items, 14 Rows]
。
最后Create Graphs for this Host
里面就能找到的接口啦,果断添加之,任务完成。
终于实现了使用cacti监控虚接口,这个方法同样适用open、anyconnect等,只需修改一下连接脚本就可以了。
整个过程略为复杂,实际效果还有待观察。这样做之后流量数据被静态化了,29秒才更新一次。
cacti的实时流量查看会无法使用,除非把采样精度提高到5秒以下。同时会概率性出现瞬间流量超大的情况,主要是因为snmp得到的数据是字节数,cacti再根据前后两次获取的字节数相减再除以间隔时间获得瞬时流量。假如前后两次相减得到是负数,就有可能溢出变成一个超大的值。
如果要转载的话麻烦先联系,CSDN个人资料里面有笔者联系方式。
参考了google很多大神的文章,就不一一列出了,其中主要就是以下两篇。
Enjoy!!
参考
http://www.net-snmp.org/docs/mibs/interfaces.html
http://www.roth.lu/cacti-snmp-tut.htm