Quem ainda usa os switches Cisco Catalyst 2950 e faz uso do storm-control com a opção de shutdown ja deve ter percebido que o IOS até a ultima versão ( 12.1(22)EA14 ) não consegue reabilitar a porta com o comando errdisable recovery cause all. Para solucionar esse problema pode ser usada a combinação de syslog-ng + cron + shell script + expect.
Primeiramente você precisa habilitar o log remoto dos switches através dos comandos abaixo ( troque o 10.1.1.10 pelo IP do host onde vai estar rodando o syslog-ng ):
service timestamps debug datetime localtime show-timezone service timestamps log datetime localtime show-timezone no logging rate-limit logging cns-events debugging logging trap debugging logging 10.1.1.10
Em seguida, em uma maquina Linux ou FreeBSD ( para essas coisas prefiro o FreeBSD ), instale e configure o syslog-ng. A configuração mínima está abaixo:
@version: 3.14
options { chain_hostnames(off); flush_lines(0); use_dns(no); use_fqdn(no);
owner("root"); group("wheel"); perm(0644); stats_freq(0); threaded(yes);
dir-perm(0755); create_dirs(yes); bad_hostname("^gconfd$");
};
source s_network {
udp( port(514) );
tcp( port(514) );
};
destination d_network { file("/usr/local/www/syslog/$SOURCEIP/$YEAR/$MONTH/$SOURCEIP-$YEAR-$MONTH-$DAY.log"); };
destination d_storm { file("/root/cisco/tmp/$SOURCEIP-$UNIXTIME.log"); };
filter f_storm {match(".*STORM.*" value ("MESSAGE"));};
log { source(s_network); destination(d_network); };
log {
source(s_network);
filter(f_storm);
destination(d_storm);
};
Ajuste os diretórios onde serão gravados os logs. No caso são usados:
- /usr/local/www/syslog/ – caso queira acessar para consulta via o Apache, mas pode configurar qualquer outro. Esse serve apenas para ter um histórico diário do que o switch loga;
- /root/cisco/tmp/ – diretório temporário de onde o script que é executado pelo crontab vai procurar os arquivos com os dados necessários para reativar as portas;
Apos o switch configurado para enviar os logs para o servidor e o syslog-ng configurado, crie o script que vai fazer a verificação de acordo com o seu agendamento no crontab. Crie também o diretório /root/cisco/run/ :
#!/usr/local/bin/bash LS="/bin/ls" MV="/bin/mv" TMPDIR="/root/cisco/tmp/" WORKDIR="/root/cisco/run/" WC="/usr/bin/wc" PREFIX="10" PORT="23" USER="cisco" USERPW="cisco123!" ENABLEPW="enablepass" GREP="/usr/bin/grep" CAT="/bin/cat" CUT="/usr/bin/cut" ECHO="/bin/echo" RM="/bin/rm" ENABLE_SCRIPT="/root/bin/storm_control_enable.exp" DATA=`/bin/date +%Y-%m-%d-%H-%M` MAIL="/usr/bin/mail" MAILRCPT="[email protected]" cd $TMPDIR ARQUIVOS=`$LS -1 $PREFIX* 2>/dev/null | $WC -l 2>/dev/null` if [ "$ARQUIVOS" -gt 0 ]; then $ECHO "" $ECHO "" $ECHO "" $ECHO "" $ECHO "" $ECHO "run $DATA" $ECHO "" $LS -1 $PREFIX* $ECHO "" $ECHO "" $MAIL $MAILRCPT < $PREFIX* $MV $TMPDIR/$PREFIX* $WORKDIR cd $WORKDIR for i in $PREFIX* ; do IP=`$ECHO $i | $CUT -f 1 -d "-"` SHUTDOWNINTERFACE=`$CAT $i | $GREP SHUTDOWN | $CUT -f 5 -d ":" | $CUT -f 6 -d " "` if [ ! -z "$SHUTDOWNINTERFACE" ]; then $ENABLE_SCRIPT $IP $PORT $USER $USERPW $ENABLEPW $SHUTDOWNINTERFACE SAIDA="$?" if [ $SAIDA -eq 0 ]; then $RM $WORKDIR/$i fi fi done fi
Por fim crie o script que vai fazer o acesso ao switch e retirar o shutdown da interface:
#!/bin/sh
# \
exec /usr/local/bin/expect -- "$0" ${1+"$@"}
exp_version -exit 5.0
if {$argc==0} {
send_user "usage: $argv0 host port username password enable port\n\n"
send_user "host - ip / dns hostname\n"
send_user "port - telnet port\n"
send_user "username - telnet username\n"
send_user "password - telnet password\n"
send_user "enable - enable password\n"
send_user "interface - interface to enable\n\n"
exit
}
set HOST [lindex $argv 0]
set PORT [lindex $argv 1]
set USERNAME [lindex $argv 2]
set PASSWORD [lindex $argv 3]
set ENAPASSWORD [lindex $argv 4]
set INTERFACE [lindex $argv 5]
spawn telnet $HOST $PORT
expect "Username: "
send "$USERNAME\r"
expect "Password: "
send "$PASSWORD\r"
expect ">"
send "enable\r"
expect "Password: "
send "$ENAPASSWORD\r"
expect "#"
send "conf term\r"
expect "g)#"
send "interface $INTERFACE\r"
expect "if)#"
send "no shut\r"
expect "if)#"
send "exit\r"
expect "g)#"
send "exit\r"
expect "#"
send "wr\r"
expect "#"
send "quit\r"
Dependências:
- expect;
- bash;
- postfix ou qualquer outro MTA ( se quiser receber emails de aviso );
Diretórios necessários:
- /usr/local/www/syslog/
- /root/cisco/tmp/
- /root/cisco/run/
Alterações necessárias:
- IP do servidor de syslog;
- PREFIX – prefixo do IP dos switches. Os arquivos de log gerados vão iniciar com o numero IP e o script de verificação vai usar o nome para compor as variáveis necessárias para a reativação ;
- USER – nome de usuário para acesso ao switch via telnet;
- USERPW – senha do usuário de acesso;
- ENABLEPW – senha de enable;
- ENABLE_SCRIPT – caminho completo do script de reativação das portas;
- MAILRCPT – endereço de e-mail para onde vai ser enviada notificação das portas que foram reativadas;