Настройка мониторинга 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;
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/
Комментарии