Появилась задача определять ip-адрес девайса на каком порту. Так как я использую для мониторинга Nagios то выводить адреса буду в Nagios.
В своей сети использую свичи 2го уровня (2960) и роутеры cisco (2911 и 2902).
Я планировал лазить на цыски выгребать порты с мак адресами. Но вот незадача свичи 2го уровня ничего о ip адресах не знают.
Решил сделать тогда лазить на роутеры и выгребать ARP таблицу и сравнивать по mac со свичами.
Первоначально хотел сделать на snmp но потом решил сделать проще используя программу expect.
Все действие происходит на debian. Необходимые пакеты expect, ssh , telnet
Значит изначально настраиваем свичи и роутеры для юзера под которым это все будет работать
Лезем на цыски и добавляем пользователя для просмотра мак адресов
На линуксе делаем файлик check_all_cisco.sh
содержимое:
и файлик exp_cisco_ssh.exp
теперь файл exp_cisco_telnet.exp
файлы копируем где находятся плагины для нагиоса.
Значит какие косяки скрипта:
1. Для роутеров которые работают через ssh необходимо сгенерить пару ключей под юзером от имени которого выполняется скрипт.
проще всего
и выходим
2. Есть еще прикол что для одного мака может быть несколько записей в arp таблице.поэтому в первом скрипте я их не учитываю.
В своей сети использую свичи 2го уровня (2960) и роутеры cisco (2911 и 2902).
Я планировал лазить на цыски выгребать порты с мак адресами. Но вот незадача свичи 2го уровня ничего о ip адресах не знают.
Решил сделать тогда лазить на роутеры и выгребать ARP таблицу и сравнивать по mac со свичами.
Первоначально хотел сделать на snmp но потом решил сделать проще используя программу expect.
Все действие происходит на debian. Необходимые пакеты expect, ssh , telnet
Значит изначально настраиваем свичи и роутеры для юзера под которым это все будет работать
Лезем на цыски и добавляем пользователя для просмотра мак адресов
conf t username nagios secret nagiossupermegapass privilege exec level 1 sh mac address-table exit
На линуксе делаем файлик check_all_cisco.sh
содержимое:
#!/bin/bash STATE_OK=0 STATE_WARNING=1 STATE_CRITICAL=2 STATE_UNKNOWN=3 STATE_DEPENDENT=4 #темповые файлы tmpport=allport.tmp tmprouter=allcisco.ext exitfile_tmp=all.tmp outfile=$tmprouter #выходной файл (до того как его прибиваю) exitfile=all.all switchs=('172.16.16.12' '172.16.16.13' '172.16.16.14') ROUTERS=('172.16.16.49' '172.16.10.1') if [[ -z "$1" ]] || [[ -z "$2" ]]; then echo "Missing parameters! Syntax: ./check_all_cisco.sh LOGIN PASSWORD" exit 2 fi #пвд показывает корень поэтому на exp файлы прописываем вручную PWD=`/bin/pwd` PATH_EXP_FILES=/usr/lib/nagios/plugins login=$1 passw=$2 #c ssh косяк. Нужно по ssh первоначально зайти на цыску под юзером чтобы сгенерилась пара ключей. for ROUTER in ${ROUTERS[@]} do /usr/bin/expect -f $PATH_EXP_FILES/exp_cisco_ssh.exp $ROUTER $1 $2 > /dev/null 2>&1 cat /tmp/$ROUTER.ssh | grep 'Internet' | awk '{print $2 " " $4 " " $6}' | tee -a /tmp/$outfile > /dev/null 2>&1 done for ii in ${switchs[@]} do /usr/bin/expect -f $PATH_EXP_FILES/exp_cisco_telnet.exp $ii $1 $2 > /dev/null 2>&1 cat /tmp/$ii.tel | grep -E 'DYNAMIC|STATIC'| sed '/Po/d' | sed '/CPU/d' | awk -v it=$ii '{print $2 ":" it ":" $4}' | tee -a /tmp/$tmpport > /dev/null 2>&1 #cat /tmp/$ii.tel | grep -E 'DYNAMIC|STATIC'| sed '/Po/d' | awk -v it=$ii '{print $2 ":" it ":" $4}' | tee -a /tmp/$tmpport > /dev/null 2>&1 done #сделаем уникальные строки а то в-ланы под одним маком sort /tmp/$tmpport | uniq > /tmp/tmp.tmp cp /tmp/tmp.tmp /tmp/$tmpport rm /tmp/tmp.tmp for cc in `cat /tmp/$outfile |awk '{print $1 ":" $2 ":" $3}'` do MACADDR=`echo $cc | cut -f 2 -d':'` > /dev/null 2>&1 IP=`echo $cc | cut -f 1 -d':'` > /dev/null 2>&1 PORT=`echo $cc | cut -f 3 -d':'` > /dev/null 2>&1 ADD=`cat /tmp/$tmpport | grep -e $MACADDR |awk 'BEGIN{FS=":"}{print $2 " PORT_SW:" $3}'` > /dev/null 2>&1 echo 'MAC:'$MACADDR 'IP:'$IP 'SW_IP:'$ADD | tee -a /tmp/$exitfile > /dev/null 2>&1 done for ii in ${switchs[@]} do rm -f /tmp/$ii.tel done for ii in ${ROUTERS[@]} do rm -f /tmp/$ii.ssh done rm -f /tmp/$ROUTER.ssh rm -f /tmp/$tmprouter rm -f /tmp/$tmpport rm -f /tmp/$exitfile_tmp #Если нада файл то комментируем удаление. rm -f /tmp/$exitfile cat /tmp/$exitfile rm -f /tmp/$exitfile exit $STATE_OK
и файлик exp_cisco_ssh.exp
#!/usr/bin/expect set host [ lrange $argv 0 0 ] set login [ lrange $argv 1 1 ] set password [ lrange $argv 2 2 ] #set login "nagios" set logfile /tmp/$host.ssh exp_internal 0 spawn ssh -l $login $host expect "Password:" send "$password\n" expect ">" set running 1 log_file $logfile send "term len 0\n" expect ">" send "sh arp" send "\n" expect ">" send "exit\r" log_file
теперь файл exp_cisco_telnet.exp
#!/usr/bin/expect
set host [ lrange $argv 0 0 ]
set login [ lrange $argv 1 1 ]
set password [ lrange $argv 2 2 ]
#set login "nagios"
set logfile /tmp/$host.tel
exp_internal 0
exp_cisco_telnet.exp
spawn telnet $host
expect "Username:"
send "$login\n"
expect "Password:"
send "$password\n"
expect ">"
set running 1
log_file $logfile
send "term len 0\n"
expect ">"
send "sh mac addr"
send "\n"
expect ">"
send "exit\r"
log_file
файлы копируем где находятся плагины для нагиоса.
cp check_all_cisco.sh /usr/lib/nagios/plugins
exp_cisco_telnet.exp /usr/lib/nagios/plugins
cp exp_cisco_ssh.exp /usr/lib/nagios/plugins
Значит какие косяки скрипта:
1. Для роутеров которые работают через ssh необходимо сгенерить пару ключей под юзером от имени которого выполняется скрипт.
проще всего
вводим yessu - nagios -s /bin/bash
nagios@:~$ssh ip_роутера
The authenticity of host 'ip_роутера (ip_роутера)' can't be established.
RSA key fingerprint is 20:e3:01:b3:d1:28:40:f9:57:2f:23:2e:e5:ed:83:3f.
Are you sure you want to continue connecting (yes/no)?
и выходим
2. Есть еще прикол что для одного мака может быть несколько записей в arp таблице.поэтому в первом скрипте я их не учитываю.
Комментариев нет :
Отправить комментарий