Skip to content

Encaminhamento Simples

Marcelo Basso edited this page Jun 19, 2024 · 3 revisions

Neste exercício vamos:

  1. Configurar a rede (virtual e física) detalhada abaixo:

    Diagrama simples da rede Diagrama completo da rede (incluindo bridges e interfaces)
    326446104-02329d86-ee38-4e95-8708-e06611eb2fab 326455067-7888299a-1aa1-4786-bf24-6453ff54b9cb

    As duas imagens acima representam a mesma rede, no entanto, a segunda exibe mais informações acerca de como essa rede está conectada virtualmente dentro do P4Pi. Recomendo dar uma breve estudada no conceito de bridges para entender melhor como a troca de informações ocorre.

  2. Programar o switch para encaminhar os pacotes com regras estáticas

  3. Testar a comunicação


Presume-se que você já possui um Raspberry Pi com o sistema P4Pi instalado e rodando. Caso contrário, recomendo seguir os passos descritos na documentação do P4Pi para baixar e instalar o sistema no cartão SD.

Abaixo, segue uma breve descrição das:

  1. Regras estáticas
  2. Criação e configuração dos briges

Após a introdução, segue o passo a passo do exercício.


Rede virtual e switch

Inserção das regras estáticas no P4

Inserir regras estáticas diretamente no código P4 permite descartar, nesse exemplo, a necessidade do plano de controle. Deixei, abaixo, um recorte do código usado nesse exercício, no qual incluímos as regras da tabela dmac de forma estática, diretamente no código P4.

Para esse exercício, será necessário editar essas regras estáticas e substituir as keys pelos endereços MAC dos dispositivos utilizados no exemplo.

table dmac {
    actions = {
        forward;
        forward_one;
        drop;
    }
        
    key = {
        hdr.ethernet.dstAddr: exact;
    }

    // ------------------------------------
    // INSERCAO DE REGRAS ESTATICAS
    // ------------------------------------
    // TODO: CORRIGIR ENDERECOS MAC

    const entries = {
        // key (mac address): action
        0x1cccd67636c0 : forward(0);     // celular
	0x047c16bfb9a1 : forward(1);     // computador
    }

    // ------------------------------------
    default_action = forward_one();
    size = 512;
}

O código P4 completo pode ser visualizado clicando aqui.

Criação e configuração dos bridges

Para montarmos a rede virtual descrita pela segunda imagem acima, será necessário rodar um script que cria e configura as bridges da rede, as interfaces do P4Pi e os endereços IP. Deixei o script pronto no diretório do tutorial. Recomendo dar uma breve lida e tentar compreender um pouco do que está acontecendo, no entanto, os detalhes mais técnicos não são tão importantes para compreender o exercício.


Passo a passo para a realização do encaminhamento simples de pacotes

No computador

  1. Clonar repositório:

Abra um terminal e clone o repositório do projeto.

git clone https://github.com/ComputerNetworks-UFRGS/Programmable_Low_End_Networks.git
  1. Conectar no Wi-Fi e realizar conexão SSH com o P4Pi:

Conecte-se no hotspot Wi-Fi chamado p4pi (senha raspberry). Pelo terminal, estabeleça uma conexão SSH (mesma senha do Wi-Fi).

ssh pi@192.168.4.1
  1. Editar P4 e corrigir endereços MAC

Abra o arquivo /tutoriais/encaminhamento-simples.p4 e procure pela linha // TODO: CORRIGIR ENDERECOS MAC. Edite as regras estáticas da tabela, substituindo os MACs pelos endereços corretos. Lembre-se de salvar o arquivo.

Para saber qual seu endereço MAC, execute o comando ifconfig. O endereço MAC aparecerá como no exemplo abaixo: Output do comando ifconfig

ATENCAO: O MAC utilizado deve ser o da interface Ethernet (cabo de rede) do seu computador, ela pode ter diferentes nomes, como eth0, eth1, etc.

Para ver o endereço MAC do celular, basta entrar nas configurações do WI-FI e descer até encontrar o endereço (talvez esteja em uma aba como "configurações adicionais" ou similar).

Endereço MAC celular

No exemplo acima, o endereço IP está errado, pois eu estava conectado em outra rede quando fiz a captura de tela.


No P4Pi (terminal conectado por SSH)

  1. Copiar arquivos para P4Pi:
# entra no bash como root
sudo -i
# diretorio de codigos p4
cd /bmv2/examples
# ATENCAO: o nome da pasta deve ser exatamento igual ao nome do codigo p4 que sera salvo dentro dela
mkdir encaminhamento-simples && cd encaminhamento-simples
# ATENCAO: mudar usuario e IP pelo seu usuario e pelo IP recebido
scp marcelo@192.168.4.6:~/Programmable_Low_End_Networks/tutoriais/encaminhamento-simples/* .
  1. Rodar código P4 no switch virtual
echo encaminhamento-simples > ~/t4p4s-switch
systemctl restart bmv2.service
  1. Verificar se o BMV2 (switch virtual) esta rodando corretamente:
systemctl status bmv2.service

Output do status do bmv2

Se o cabeçalho do output for similar ao da imagem acima, então o código foi compilado e está rodando no switch virtual com sucesso. Para sair do comando, digite q.

  1. Dar permissão de execução (x) para o script e rodar
chmod +x configure-bridges.sh
./configure-bridges.sh
  1. Configurar IP no smartphone

No smartphone, você terá que procurar as configurações da rede Wi-Fi, mudar opção "Configuração de IP" (ou similar) para Estático, e colocar o endereço IP 192.168.155.23. As outras informações não precisam ser mudadas, mesmo que difiram da imagem abaixo.

IP estatico


No computador

  1. Configurar IP no computador
# sudo ip addr add 192.168.15.25/20 dev <interface ethernet>
sudo ip addr add 192.168.15.25/20 dev enp4s0
  1. Conectar computador ao switch Conecte seu computador ao P4Pi (Raspberry Pi) com um cabo Ethernet.

  2. Adicionar registro na tabela ARP no computador

Seu computador só consegue se comunicar com dispositivos que ele conhece (cujo endereço ele possui em sua tabela ARP, por isso, é necessário adicionar um registro na tabela para que os dispositivos possam se comunicar, caso contrário, o output do ping será Destination Host Unreachable)

# sudo arp -i <interface ethernet> -s 192.168.15.23 <MAC do smartphone>
sudo arp -i enp4s0 -s 192.168.15.23 1c:cc:d6:76:36:c0
  1. Pingar celular

O ping é um programa que manda pacotes ICMP "Internet Control Message Protocol" para uma interface e aguarda sua resposta. É basicamente uma forma de dizer "Alô?" e aguardar outro "Alô" como resposta. Caso a resposta seja recebida, o ping exibirá na tela algumas informações sobre a troca de dados, algo como: 64 bytes from 182.171.12.1: icmp_seq=2 ttl=231 time=366 ms.

# ping 192.168.15.23 -I <interface ethernet>
ping 192.168.15.23 -I enp4s0

Caso o output do comando ping seja similar ao exemplo dado acima, isso significa que os dispositivos estão se comunicando, e o encaminhamento simples de pacotes pelo switch programável foi feito corretamente.


Passo opcional

Sniff (ouvir os pacotes que passam) interface de rede (conexão Ethernet) para ver pacotes indo e voltando.

# sudo tcpdump -i <interface ethernet> icmp
sudo tcpdump -i enp4s0 icmp

Abra um novo terminal (no seu computador) e execute o comando acima para observar os pacotes indo e voltando. Lembre-se de trocar o nome da interface pelo nome da sua interface de rede.