Python实验日志-经典协议-监控ospf邻居状态

菜鸟记录自己的python成长历程

要求:使用Python监控SNMP Trap(v2/v3均可)!监控OSPF邻居状态!

最终结果如下图, PythonOSPF邻居状态改变的SNMP Trap进行分析,并打印!

提示一: 路由器SNMP Trap配置(记得精确开启/关闭需要的traps条目)

snmp-server enable traps ospf state-change
snmp-server enable traps ospf errors

提示二: OSPF SNMP Trap Oid

整体OID摘要    https://cric.grenoble.cnrs.fr/Administrateurs/Outils/MIBS/?oid=1.3.6.1.2.1.14.10.1

记录:

一:网络拓扑:2台CSR做OSPF,其中SNMP由CSR发出,CSR2上进行G4端口的UP/DOWN操作

二:CSR配置概要

ospf配置模板:

CSR#sh run | be ospf
router ospf 1
 router-id 1.1.1.1
 network 1.1.1.0 0.0.0.255 area 0
snmp配置模板:

snmp-server community tcpiprw RW
snmp-server community tcpipro RO
snmp-server trap-source GigabitEthernet1
snmp-server contact TEST
snmp-server enable traps ospf state-change
snmp-server enable traps ospf errors
snmp-server host 192.168.6.222 version 2c R1 

三:python代码使用snmp trap监控并且将收到的snmp条目分解为字典,详细的OID对应的含义查询:https://cric.grenoble.cnrs.fr/Administrateurs/Outils/MIBS/?oid=1.3.6.1.2.1.14.10.1

以查询:1.3.6.1.2.1.14.1.1为例(其它OID查询方式一样,寻找到对自身有意义的OID作为判断依据)


==============OSPF down 时收到的Trap信息==================
Notification message from (1, 3, 6, 1, 6, 1, 1):('192.168.6.103', 51028): 
{   '1.3.6.1.2.1.1.3.0': {   'application-wide': 'ApplicationSyntax',
                             'timeticks-value': '558385',
                             'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.1.1': {   'application-wide': 'ApplicationSyntax',                  #LRouter ip
                              'ipAddress-value': '1.1.1.1',
                              'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.1': {   'application-wide': 'ApplicationSyntax',                   # neighbor ip
                                 'ipAddress-value': '1.1.1.2',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.2': {   'integer-value': '0',
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.3': {   'application-wide': 'ApplicationSyntax',                #neighboring R-ID
                                 'ipAddress-value': '2.2.2.2',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.6': {   'integer-value': '1',                                                       # 1-down
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.6.3.1.1.4.1.0': {   'objectID-value': '1.3.6.1.2.1.14.16.2.2',
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'}}
==============OSPF full 时收到的Trap信息==================
Notification message from (1, 3, 6, 1, 6, 1, 1):('192.168.6.103', 51028): 
{   '1.3.6.1.2.1.1.3.0': {   'application-wide': 'ApplicationSyntax',
                             'timeticks-value': '384876',
                             'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.1.1': {   'application-wide': 'ApplicationSyntax',                 #LRouter ip
                              'ipAddress-value': '1.1.1.1',
                              'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.1': {   'application-wide': 'ApplicationSyntax',                  # neighbor ip
                                 'ipAddress-value': '1.1.1.2',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.2': {   'integer-value': '0',
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.3': {   'application-wide': 'ApplicationSyntax',               #neighboring R-ID
                                 'ipAddress-value': '2.2.2.2',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.2.1.14.10.1.6': {   'integer-value': '8',                                                        # 8-full
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'},
    '1.3.6.1.6.3.1.1.4.1.0': {   'objectID-value': '1.3.6.1.2.1.14.16.2.2',
                                 'simple': 'SimpleSyntax',
                                 'value': 'ObjectSyntax'}}

四:目前已知:1.3.6.1.2.1.14.10.1.6 内标记着当前OSPF邻居的状态

(Enumeration (1-down, 2-attempt, 3-init, 4-twoWay, 5-exchangeStart, 6-exchange, 7-loading, 8-full))

所以我们可以以1.3.6.1.2.1.14.10.1.6 == ‘1’ 或 ‘8’ 作为判断依据来确认OSPF的邻居关系为down/FULL

 

五:判断代码

    if '1.3.6.1.2.1.14.10.1.6' in info.keys(): # 我们已经将trap处理为字典,所以直接判断键中是否存在此数值
        if info['1.3.6.1.2.1.14.10.1.6']['integer-value'] == '1':  # 为1时,代表down 注意“1”加上引号
            print('OSPF neighbor {0} (router-id: {1}) down '.format(info['1.3.6.1.2.1.14.10.1.1']['ipAddress-value'],    #查询OID表可知这个K&Y为对端IP
                                                                    info['1.3.6.1.2.1.14.10.1.3']['ipAddress-value']))     #查询OID表可知这个K&Y为对端R-ID
        elif info['1.3.6.1.2.1.14.10.1.6']['integer-value'] == '8':  # up
            print('OSPF neighbor {0} (router-id: {1}) full '.format(info['1.3.6.1.2.1.14.10.1.1']['ipAddress-value'],
                                                                    info['1.3.6.1.2.1.14.10.1.3']['ipAddress-value']))

六:监控结果

1:断开CSR2端口G4,查看CSR的ospf邻居状态,等待OSPF Dead time为0

2:当前弹出log,状态为down

3:查看ospf邻居状态,此时唯一的邻居已经down,所以看不到邻居状态

4:重新恢复CSR2端口G4

七:遇到的各种问题

1:SNMP配置正常的情况下,可能不会收到snmp的报文,222,223是linux centos7

可以看到报错信息:host administratively prohibited

判断是被防火墙拦截,此时需要手动放行策略

由于我这个是测试环境,所以直接关闭了防火墙功能,生产环境中,千万不要随便关闭防火墙!

@ 需要确认linux是否开启了防火墙!

systemctl status firewall

@ 关闭linux防火墙

systemctl stop  firewalld (暂停防火墙)

systemctl disable  firewalld (关闭防火墙)

2:pprint的时候,注意直接 import pprint与from pprint import pprint有些许区别,否则报错

# from pprint import pprint  >  pprint(info, indent=4)  # 打印字典信息
# import pprint  >  pprint.pprint(info, indent=4)  # 打印字典信息

@ 无pprint的效果:长长一段看不到尽头

@ pprint与pprint.pprint的效果的效果:变得整齐有条理

 

 

 

 

 

 

 

 

 

 

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页