понедельник, 3 апреля 2017 г.

Настройка мониторинга VPN туннелей для Cisco ASA 5500 на Zabbix версии 3.x

Задача: На cisco ASA 5500 есть настроенные site-to-site IPsec VPN туннели. Нужно настроить мониторинг загрузки и состояния туннелей в Zabbix 3.x.

В данной статье не рассматривается настройка Zabbix сервера c нуля и cisco ASA 5500, а только конкретный случай. SNMP уже должно быть настроено.

1. В начале нужно на Zabbix сервер установить дополнительные компоненты для perl, для Ubuntu  делается это так:

sudo apt-get install libnet-snmp-perl
sudo apt-get install libswitch-perl 

2. Потом необходимо воспользоваться специальным скриптом query_lan2lan_cisco.pl, который можно скачать по ссылке:

3. Копируем скрипт или создаем файл (с содержимым из этого скрипта) в каталоге - /usr/lib/zabbix/externalscripts, это директория по умолчанию для скриптов в Zabbix.

4. Даем права на файл:

 chown zabbix:zabbix query_lan2lan_cisco.pl

5. Для проверки можно запустить скрипт c вашими параметрами:

query_lan2lan_cisco.pl community host {ASA,CONCENTRATOR} index
query_lan2lan_cisco.pl community host {ASA,CONCENTRATOR} query {RX,TX}
query_lan2lan_cisco.pl community host {ASA,CONCENTRATOR} get {RX,TX} DEVICE


6. Переходим к настройке в Zabbix. Создаем новый шаблон – Template S2S ASA, а в нем добавляем Discovery rules - IPsec VPN tunnels, чтобы обнаружение туннелей было автоматическое, по правилу низкоуровневого обнаружения Zabbix (Low-level discovery).



- Name: IPsec VPN tunnels
- Type: SNMP agent
- Key: ciscoMgmt.171.1.2.3.1.7
- SNMP OID: discovery[{#SNMPVALUE},CISCO-SMI::ciscoMgmt.171.1.2.3.1.7]
- SNMP community: {$SNMP_COMMUNITY}

7. В Discovery rules - IPsec VPN tunnels добавляем Item prototype для входящего и исходящего трафика, а так же для состояния интерфейса.

1) Incoming traffic in tunnel to {#SNMPVALUE}




- Name: Incoming traffic in tunnel to {#SNMPVALUE}
- Type: External check
- Key: query_lan2lan_cisco.pl[{$SNMP_COMMUNITY},{HOST.IP},ASA,get,RX,{#SNMPVALUE}]
- Type of information: Numeric (unsigned)
- Data type: Decimal
- Units: bps
- Use custom multiplier: 8
- Store value: Delta (speed per second)

2) Outgoing traffic in tunnel to {#SNMPVALUE}



- Name: Outgoing traffic in tunnel to {#SNMPVALUE}
- Type: External check
- Key: query_lan2lan_cisco.pl[{$SNMP_COMMUNITY},{HOST.IP},ASA,get,TX,{#SNMPVALUE}]
- Type of information: Numeric (unsigned)
- Data type: Decimal
- Units: bps
- Use custom multiplier: 8
- Store value: Delta (speed per second)

3) IPSec Tunnel Status {#SNMPVALUE}




- Name: IPSec Tunnel Status {#SNMPVALUE}
- Type: External check
- Key: query_lan2lan_cisco.pl[{$SNMP_COMMUNITY}, {HOST.IP},ASA,index,{#SNMPVALUE}]
- Type of information: Log

Должно получиться следующее:



8. Для реагирования на неработоспособность туннеля делаем: 
Trigger prototypes



- Name: S2S to {#SNMPVALUE} Disconnected
- Severity: HIGH
- Expression: {Template S2S ASA:query_lan2lan_cisco.pl[{$SNMP_COMMUNITY}, {HOST.IP},ASA,index,{#SNMPVALUE}].str({#SNMPVALUE},30)}<>0


p.s Триггер вел себя не адекватно, и в тоге выяснилось что .str не ищет как надо значение в item, потому что #SNMPVALUE не передается в функцию как значение, а используется ей как текст для поиска.

По этому, немного переделав скрипт и триггер получаем.

Тригер:
{CISCO ASA S2S:query_lan2lan_cisco.pl[{$SNMP_COMMUNITY}, {HOST.IP},ASA,index,{#SNMPVALUE}].str("exist",30)}=0

Измененная часть скрипта:
Задаем переменную 

my $sesip = $ARGV[4]; - в нее считывается наш peer передаваемый скрипту как #SNMPVALUE, раньше он передавался в нашем триггере в никуда.

Немножко меняем блок с условием - если запрашивается index


if ($type eq "index") {
    if ($device eq "ASA") {
        @peers = list_peers($cikeTunRemoteValue);
    } else {
        @peers = list_peers($alActiveSessionIpAddressOID);
    }

    foreach my $peer (@peers) {
        if ($peer eq $sesip) { #Добавили проверку, что бы выводилось значение по конкретному peer
        #print "$peer";
        print "exist"; #Добавили вывод значения которое может найти str
        }
    }
    # Close SNMP session
    $session->close;

    exit;


В итоге получаем:



9. Подключаем шаблон нужным устройствам и ждем пока пойдут данные

10. Делаем графики, чтобы наглядно было видно трафик:



11. Результат:


Источники:
http://www.admuser.net/2017/03/monitor-site-to-site-tunneling-health.html
https://habrahabr.ru/post/195622/

Комментариев нет: