quinta-feira, 16 de outubro de 2014

Proteção da Topologia STP em Switches Cisco

Olá Pessoal.

Os switches da infraestrutura de uma rede se comunicam entre si através da troca de quadros denominados BPDUs (Bridge Protocol Data Units), permitindo que, através da lógica do protocolo STP (Spanning-Tree Protocol), todos os switches conheçam a topologia da ligação entre eles. A figura abaixo apresenta uma topologia em que o leitor pode observar o ponto em que alguns recursos avançados podem ser configurados para proteger a topologia STP.

Em uma porta que não esteja conectada a outro switch não é esperado o recebimento de BPDUs, por isso o recebimento repentino de BPDUs quer dizer que nela foi conectado um switch e a topologia STP precisa reconvergir, o que pode levar a resultados inesperados. Essa situação pode ser mitigada através dos recursos: (1) Root Guard e (2) BPDU Guard. Em contrapartida é esperado o recebimento de BPDUs em uma porta conectada a outro switch e a interrupção repentina na recepção desses quadros pode levar o switch a tomar decisões incorretas que criam loops temporários, situação que pode ser mitigada através dos recursos: (3) Loop Guard e (4) UDLD.


Fonte: CCNP SWITCH 642-813 - Official Certification Guide (Cisco Press)



1. Proteção ao Recebimento Inesperado de BPDUs

Na lógica do STP é eleito um switch raiz que fica responsável por enviar mensagens "hello" a cada 2 segundos para todos os demais switches da rede com o intuito de manter uma topologia estável e sem loops. Para que essa topologia seja eficiente é importante que o switch raíz seja previsível e configurado de maneira estratégica naquele(s) switch(es) responsável(eis) pela agregação dos demais switches de acesso, assegurando uma topologia simétrica e com menor diâmetro.

O problema é que o STP é um protocolo que opera com base na confiança e "nada" impede que um switch falso seja conectado na rede e venha a assumir o papel de raíz, já que o processo de eleição do raíz basicamente consiste em escolher aquele com o menor número de prioridade configurado na caixa (padrão 32.768) e, em caso de empate, aquele com o menor endereço físico (MAC). Como resolver esse problema? Através dos recursos abaixo...

1.1 ROOT GUARD

Quando um switch com número de prioridade menor é inserido na rede, a topologia STP passa pelo processo de reconvergência assumindo esse switch como o novo raíz, algo que pode ser péssimo porque "bagunça" a organização lógica e torna parte da rede de produção indisponível durante o período de convergência.

O recurso Root Guard foi desenvolvido para controlar onde os switches raízes podem ser conectados na rede. Um switch aprende o Bridge ID do switch raíz da topologia e fica monitorando se algum outro switch anunciará um BPDU mais atrativo nas portas em que o recurso estiver ativado. Caso seja anunciado um BPDU superior em alguma porta ativada com esse recurso, o switch local não permite que esse outro switch se torne raíz e coloca a porta em modo root-inconsistent. Assim que os BPDUs param de ser recebidos, então a porta volta para o estado normal automaticamente.

O recurso root guard deve ser ativado individualmente por porta:

Switch(config-if)# spanning-tree guard root

Para exibir as portas colocadas em estado root-inconsistent:

Switch# show spanning-tree inconsistentports

1.2 BPDU GUARD

O recurso BPDU Guard tem relação direta com o PortFast, outro recurso comumente ativado nas portas dos switches. O STP provê o recurso PortFast para que algumas portas sejam capazes de entrar diretamente em modo forwarding assim que o link é ativo. Ao fazê-lo o PortFast provê um mecanismo rápido de acesso à rede para dispositivos terminais que jamais poderiam ocasionar um loop. O comando para ativar uma interface com PortFast é:  

Switch(config-if)# spanning-tree portfast

Assim, por definição, em uma porta onde o PortFast foi ativado não se espera que seja conectado qualquer tipo de dispositivo capaz de causar loop. Caso um switch seja conectado por engano em uma porta com o PortFast ativado, então passa a existir um grande risco de ocorrência de loop na rede, o que é grave!

O recurso BPDU Guard foi desenvolvido para impedir o recebimento de qualquer BPDU nas portas em que foi ativado, fazendo com que  essa porta seja desativada e colocada em modo errdisable. Uma porta em estado errdisable deve ser reativada manualmente pelo administrador ou será reativada automaticamente apenas depois do timeout. Esse recurso pode ser ativado de maneira global em todas as portas ou individualmente por porta.

Para ativá-lo de maneira global o comando é:

Switch(config)# spanning-tree portfast bpduguard enable

Para ativá-lo individualmente na interface o comando é:

Switch(config-if)# spanning-tree bpduguard enable



2. Proteção à Interrupção Repentina de BPDUs

Quando temos uma topologia STP estável, periodicamente devem existir BPDUs enviadas pelo switch raíz e propagadas por todos os demais switches. O que ocorre quando uma porta de switch deixa de receber BPDUs repentinamente? A princípio pode ser que o switch conectado na outra ponta daquela porta tenha sido removido e então a topologia STP tem que passar pelo processo de reconvergência até que a porta seja liberada para encaminhar frames (forwarding). Essa seria a situação normal, mas a interrupção repentina de BPDUs também pode significar um erro no link entre os switches e é possível que ocorram loops. Os recursos explicados abaixo são úteis nesse caso...

2.1 LOOP GUARD

Se um switch possui um uplink para o switch raíz em que sua porta esteja bloqueada, isso quer dizer que há outro caminho redundante ativo e que a porta bloqueada continua recebendo as mensagens BPDU normalmente. Se por alguma falha a comunicação entre os switches cessar até que seja expirado o tempo limite do último BPDU válido, então o switch assume que não há mais necessidade de bloquear a porta porque não existe um dispositivo STP na outra ponta e um loop pode ocorrer.

Com o Loop Guard essa situação pode ser previnida, fazendo com que o switch fique monitorando a atividade de BPDUs nas portas não designadas (bloqueadas) onde existem uplinks para outros switches. Quando uma porta de uplink deixa de receber BPDUs, então ela é colocada em estado loop-inconsistent. A porta retorna automaticamente para seu estado anterior assim que o recebimento de BPDUs é normalizado.

Para ativá-lo de maneira global em todas as portas:

Switch(config)# spanning-tree loopguard default

Para ativá-lo de maneira individual por porta:

Switch(config-if)# spanning-tree guard loop

2.2 UDLD (Unidirectional Link Detection)

Normalmente são utilizadas fibras ópticas nos uplinks entre os switches principais que agregam os demais switches de acesso da rede. Esses links bidirecionais possuem um canal físico para transmissão (TX) e outro para recepção (RX), de forma que o tráfego pode fluir em duas direções. É muito comum a ocorrência de problemas físicos em apenas uma das direções do link, o que faz com que, em alguns casos, o switch entenda que o link esteja ativo. Essa situação cria um link unidirecional, uma situação potencialmente perigosa para a lógica do STP porque os quadros BPDUs somente serão recebidos em um dos lados. Ao parar de receber BPDUs em um dos lados é possível que ocorra um loop sem que o switch entenda sua causa.

O UDLD é um recurso proprietário da Cisco para detecção de links unidirecionais. Quando esse recurso é ativado o switch envia um quadro especial em intervalos regulares (de 7s ou 15s) e espera que a outra ponta ecoe os quadros de volta pelo outro canal, o que garante que o link é bidirecional. Esse recurso pode ser configurado para operar em dois modos: (i) normal e (ii) agressivo. A diferença é que a detecção de um link unidirecional implica apenas na geração de um registro syslog no modo normal, enquanto que no modo agressivo a porta e colocada em estado errdisable. O UDLD deve ser configurado em ambas as pontas e individualmente por porta, exceto para switches com todas as portas de fibra óptica que têm a opção de ativar esse recurso globalmente. 

!--- Modo Normal
Switch(config-if)# udld port

!-- Modo Agressivo
Switch(config-if)# udld aggressive



Samuel.

Nenhum comentário:

Postar um comentário