# Lab 5: Roteamento Dinâmico OSPF (Open Shortest Path First) ## Roteamento Dinâmico Intradomínio (OSPF) Nesse laboratório estudaremos um dos protocolos intradomínio mais comum em utilização no mundo, o Open Shortest Path First (OSPF) Protocol. :::info Obs. Vide o Anexo para informações detalhadas do protocolo OSPF e sua implementação no Quagga. ::: ## Introdução Na atividade anterior discutimos sobre a configuração manual das tabelas de roteamento no contexto do roteamento estático. O foco desta atividade é voltado para o roteamento dinâmico. Nesse caso, os protocolos de roteamento populam as entradas das tabelas de forma automática sem a intervenção humana. Roteadores e hosts que executam um protocolo de roteamento trocam mensagens do protocolo relacionadas aos caminhos na rede e às condições dos nós. Essas mensagens são utilizadas na computação dos caminhos entre roteadores e hosts. Nesta atividade discutiremos o protocolo OSPF. Trata-se de um IGP (Interior Gateway Protocol ), ou seja, um protocolo de roteamento intradomínio. O OSPF é um protocolo baseado no estado do enlace. Relembrando a diferença entre as algumas das classes de protocolos de roteamento, temos aqueles baseados no vetor de distância que trocam periodicamente as suas tabelas de roteamento com os seus vizinhos. Essas tabelas contêm os custos para alcançar todos os roteadores (ou sub-redes) do domínio a partir do roteador que propagou a tabela para os vizinhos. Baseado nas tabelas recebidas, cada roteador escolhe, dentre os roteadores vizinhos, o next-hop baseado no menor custo para alcançar o destino. Nos protocolos baseados no estado do enlace, cada roteador no domínio determina os vizinhos com os quais se encontra diretamente conectado e os respectivos custos de cada enlace. É criado um vetor contendo estas informações e propagado (flooding) para todos os roteadores no domínio. Essas informações são difundidas em mensagens denominadas de Link State Advertisements (LSAs). ## Configuração Primeiro, vamos começar com os passos de configuração. Para o laboratório é necessário a instalação do pacote Quagga que implementa um conjunto de protocolos de roteamento IP. ``` $ sudo apt-get install quagga ``` Agora é importante deixar o serviço zebra do Quagga rodando na VM, para isso digite os seguintes comandos. ``` $ sudo touch /etc/quagga/zebra.conf $ sudo systemctl enable zebra.service $ sudo systemctl restart zebra.service ``` Será necessário criar dois links simbólicos de serviços do quagga para a realização das atividades, como segue abaixo: ``` $ sudo ln -s /usr/sbin/zebra /usr/lib/quagga/zebra $ sudo ln -s /usr/sbin/ospfd /usr/lib/quagga/ospfd ``` Caso ainda não tenha o repositório de atividades do Laboratório baixado utilize o comando git clone, conforme abaixo. ``` $ cd /home/wifi/ $ git clone https://github.com/intrig-unicamp/EA080-2S2021.git ``` Agora entre no diretório onde está a topologia que será utilizada neste laboratório: ``` $ cd /home/wifi/EA080-2S2021/lab5 ``` ## Exercícios Os exercícios desta atividade serão realizados com base no arquivo de topologia mininet chamado topo_A3.py. Ao longo dos exercícios, os diversos procedimentos completados terão como objetivo realizar experimentos com o protocolo OSPF em tal topologia, mostrada na Figura 1. Para dar início aos exercícios, realize a execução do arquivo topo_A3.py. ``` $ sudo python topo_A3.py ``` ### Exercício 1 (Aquecimento) A partir da topologia executada confira se os nós e enlaces conferem com aqueles mostrados na Fig. 1. ``` mininet> nodes mininet> links ``` Ou para uma melhor visualização completa da topologia: ``` mininet> net ``` Deixe a topologia mininet executando e abra um novo terminal da máquina virtual. Neste novo terminal execute o comando: ``` $ sudo ps aux | grep quagga ``` Ou use o comando sh (mininet> sh help) dentro da própria CLI do mininet: ``` mininet> sh sudo ps aux | grep quagga ``` :::info P: Verifique quantos processos estão executando. P: Com base nas informações contidas no Anexo desta Atividade (Quagga), o que estes processos representam? ::: Volte ao terminal onde a topologia mininet está sendo executada. Execute os comandos abaixo: ``` mininet> x1 ping -c3 y1 mininet> x1 tracepath -n y1 ``` :::info P: Existe conectividade entre x1 e y1? Comente. ::: ### Exercício 2 (Desbravando) Figura 1: Topologia Experimental com Protocolo OSPF ![](https://i.imgur.com/o5hELjS.png) :::info P: Quantas sub-redes existem na Figura 1? Informe os respectivos endereços de cada uma delas. ::: No terminal onde a topologia mininet está executando, abra um terminal externo para o roteador r1. ``` mininet> xterm r1 ``` No xterminal aberto, explore as rotas e interfaces configuradas: ``` lab5# ifconfig -a lab5# route -n ``` :::info P: Qual das rotas difere das outras? Em quais aspectos? ::: Execute neste mesmo terminal os comandos para conectar ao daemon ospfd de r1 (veja anexo Quagga para maiores explicações). ``` lab5# telnet localhost ospfd ``` Password: quagga ``` ospfd-r1> enable ospfd-r1# sh ip ospf route ospfd-r1# sh ip ospf neighbor ``` :::info P: Quantos roteadores vizinhos o roteador r1 possui? P: Qual o endereço da interface do(s) roteador(es) vizinho(s)? P: Por qual/quais interface(s) ele(s) está/estão conectado(s)? P: Em que se assemelha as rotas vistas quando executado o comando “route -n” em r1, e as rotas mostradas pelo comando “sh ip ospf route”? P: Com base na topologia da Fig. 1, por qual roteador foi anunciada a rota que difere das outras? ::: Saia do console de comando do roteador r1: ``` ospfd-r1# exit ``` ### Exercício 3 (Desbravando) Realize os mesmos procedimentos acima para r2: ``` mininet> xterm r2 ``` No xterminal aberto, explore as rotas e interfaces configuradas: ``` # ifconfig -a # route -n ``` :::info P: Qual das rotas difere das outras? Em quais aspectos? ::: Execute neste mesmo terminal os comandos para conectar ao daemon ospfd do roteador (veja anexo Quagga para maiores explicações). ``` # telnet localhost ospfd Password: quagga ospfd-r2> enable ospfd-r2# sh ip ospf route ospfd-r2# sh ip ospf neighbor ``` :::info P: Quantos roteadores vizinhos o roteador r2 possui? P: Qual o endereço da interface do(s) roteador(es) vizinho(s)? P: Por qual/quais interface(s) ele(s) está/estão conectado(s)? P: Em que se assemelha as rotas vistas quando executado o comando “route -n” em r2, e as rotas mostradas pelo comando “sh ip ospf route”? P: Com base na topologia da Fig. 1, por qual roteador foi anunciada a rota que difere das outras? ::: Saia do console de comando ospf do roteador r2: ``` ospfd-r2# exit ``` Ainda no xterminal de r2, realize a observação de pacotes. ``` # timeout 10 tcpdump -i r2-eth2 -vvln ``` Ao final da execução do comando acima, foi possível observar dois pacotes do protocolo OSPF (proto 89). Com base no pacote onde os campos “10.0.4.21 > 224.0.0.5” estão contidos: :::info P: Qual o tipo do pacote OSPF enviado? P: Qual o endereço e por que ele está listado no campo “Neighbor List:”? ::: Saia do xterminal de r2 ``` # exit ``` ### Exercício 4 (Brincando com OSPF) Verifique agora que os outros roteadores não possuem configurações OSPF bem definidas. Para isso abra qualquer xterminal de r[3-6]. Exemplo: ``` mininet> xterm r3 # telnet localhost ospfd Password: quagga ospfd-r3> enable ospfd-r3# sh ip ospf route ``` :::info Tarefa: Conforme exemplificado no anexo “Quagga”, configure as rotas OSPF do roteador r3 tomando como base a topologia mostrada na Fig. 1. ::: Após configuradas as rotas de anúncio do protocolo OSPF em r3, execute o comando: ``` ospfd-r3# sh ip ospf route ``` :::info P: Lembrando das definições da topologia mostrada na Fig. 1, por que a rota a rede 10.0.2.0/23 possui custo 30? ::: ### Exercício 5 (Brincando com OSPF) :::info Tarefa: Conforme exemplificado no anexo “Quagga”, configure as rotas OSPF dos roteadores r4, r5 e r6, tomando como base a topologia mostrada na Fig. 1. ::: No terminal mininet execute os comandos: ``` mininet> x1 ping -c3 y1 mininet> x1 tracepath -n y1 ``` :::info P: Há conectividade entre x1 e y1? P: Quantos saltos de distância está x1 de y1? P: Qual o caminho de roteadores entre x1 e y1? ::: :::warning (Obs.:) Antes de executar as mudanças a seguir, deixe o Wireshark capturando na interface r4-eth1, por exemplo, para observar as mensagens OSPF. ::: Agora abra o xterminal de r5 e defina os seguintes comandos: ``` # telnet localhost ospfd Password: quagga ospfd-r5> enable ospfd-r5(config)# configure terminal ospfd-r5(config)# interface r5-eth1 ospfd-r5(config-if)# ospf cost 100 ospfd-r5(config-if)# end ``` No terminal onde mininet está executando, execute os comandos: ``` mininet> x1 ping -c10 y1 mininet> y1 ping -c10 x1 ``` :::info P: Há diferença entre os resultados? Por que? (Dica: Observe as rotas de r1, r4 e r5). P: Qual o caminho de roteadores entre x1 e y1? E entre y1 e x1? ::: Volte ao xterminal de r5 e digite os seguintes comandos: ``` ospfd-r5(config)# configure terminal ospfd-r5(config)# interface r5-eth2 ospfd-r5(config-if)# ospf cost 100 ospfd-r5(config-if)# end ``` No terminal onde mininet está executando, execute o comando: ``` mininet> y1 ping -c10 x1 ``` :::info P: Há diferença do resultado anterior? Por que? ::: No terminal onde mininet está executando, execute o comando: ``` mininet> x1 tracepath -n y1 ``` :::info P: Quantos saltos de distância está x1 de y1? P: Qual o caminho de roteadores entre x1 e y1? ::: No terminal onde mininet está executando, execute o comando: ``` mininet> link r2 r3 down mininet> x1 tracepath -n y1 ``` :::info P: Qual o caminho de roteadores entre x1 e y1? Por que ele foi alterado? ::: Abra o xterminal de r1, e digite: ``` # route -n # telnet localhost ospfd Password: quagga ospfd-r1> enable ospfd-r1# sh ip ospf route ``` :::info P: Qual o custo da rota para a rede 10.0.12.0/23? Por que? P: Explique os diferentes tipos de mensagens (ex.: quais mensagens foram observadas, o motivo de envio de cada mensagem e sua respectiva atuação/consequência quando processada no roteador de destino) OSPF observadas no Wireshark. ::: ## Anexo [Link anexo](https://drive.google.com/file/d/1Fk-ZkHHaX3hkKw1K43ypmdX1Tdsgi39n/view?usp=sharing)