使用cacti监控虚接口

前言

linux系统中的tun、pppx等虚接口无法被cacti监控流量。因为这些是连接成功后才生成动态接口,即使接口的名称一样,每一次生成的接口id都不相同,导致cacti无法连续监控接口的流量。
为了解决此问题,笔者想到了一个比较dirty但行之有效的方法。
1.在接口生成的时候记录下本次生成的接口名称,然后通过snmpwalk命令获取本次接口的oid值。
2.通过计划任务每30秒一次,获取本次接口的流量保存在本地。
3.使用net-snmp的自定义oid获取已经保存在本地的数值。
4.cacti添加基于自定义oid的数据源模板、图形模板、数据查询模板。由于自定义的oid总是固定的,所以可以连续监控到接口的流量。
本文将记录此方法的实现过程。

环境介绍:
- 被监控节点 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.inresults.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

snmpd自定义的oid

/etc/snmp/snmpd.conf添加自定义的oid,调用interface_traffic.shinterface_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新建数据源模板

做了这么多准备工作,终于到重点了。到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

cacti新建图形模板

新建一个图形模板显示接口的流量,找到Templates—-Graph Templates。同样直接DuplicateInterface - Traffic (bits/sec, Total Bandwidth)或者新建,我这里命名为VPN - Traffic (bits/sec, Total Bandwidth)。配置直接上图了,需要留意的是Graph Item里面的Data Source要关联到刚刚新建那两个数据源_traffic_in_traffic_out

使用cacti监控虚接口_第1张图片

cacti新建数据查询

找到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
                    value
                    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
                    value
                    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
                    value
                    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
                    value
                    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

使用cacti监控虚接口_第2张图片

选中_traffic_in_traffic_out 两个数据源,并打钩。下面的Suggested Values可填可不填,不填的话每次添加图形要自己输入图形的名称。填好的话他会按照模板生成图形名称。
使用cacti监控虚接口_第3张图片

cacti新建图形

至此所有模板都添加完了,新建图形就和平时添加图形的操作差不多。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

你可能感兴趣的:(cacti,centos,流量,cacti,流量监控,snmpd)