Atividade 6 : Interfaces virtuais (veth,tap,tun), Bridges e Switchs virtuais

Critérios para entrega do exercício

Atividade

Passos:

Vamos utilizar a instância vm-netlabs como "host" para virtualização. Para iniciar o "host" digite em um terminal o seguinte comando: vm-netlabs OBS: Todos os passos a seguir serão executados a partir da vm-netlabs.

  1. Preparando o ambiente:

    Abra um terminal e digite sudo -i para ter privilégios de administrador no ambiente, devemos rodar a maioria dos comandos como root.

    Instale a solução de virtualização (qemu)
    dnf clean all && dnf -y install qemu-kvm strace

    Crie um diretĂłrio para armazenar as imagens das VM (imagens: disco virtual baseado em "arquivo")
    mkdir /vms

    Faça o download de uma imagem pre instalada do Fedora 24.
    cd /vms ; wget www.ic.unicamp.br/william/vms/fc24.qcow2

  2. Iniciando uma VM:

    Realize a cĂłpia da imagem do disco virtual, que realizamos o download anteriormente para iniciar uma VM, exemplo:
    cp /vms/fc24.qcow2 /vms/novavm.qcow2

    Inicie uma VM utilizando o sistema de virtualização qemu-system (emulação) passando a imagem copiada como disco virtual.
    strace -e trace=sendto,recvfrom qemu-system-x86_64 -m 512 -hda /vms/novavm.qcow2 -device virtio-tablet

    ApĂłs a VM iniciar, na tela de login entre com o username root e tecle [enter].

    Quantas interfaces possuímos na instância (VM) ?
    Quais são os endereços IP atribuídos em cada interface ?
    Execute o comando wget www.ic.unicamp.br e veja a saída do strace e utilize o netstat da netlabs e veja as conexões.

    A VM possui acesso Ă  internet ?

    OBS: Feche a VM para economizar recursos.

  3. Inicie uma VM, utilizando uma interface virtual tap como enlace entre o host (vm-netlabs) e a sua instância.

    Crie uma interface tipo TAP com o seguinte comando:
    ip tuntap add tap0 mode tap ; ifconfig tap0 up

    Inicie a VM adicionando o seguinte parametro:
    qemu-system-x86_64 -m 512 -hda /vms/novavm.qcow2 -netdev type=tap,ifname=tap0,id=net0,script=no -device virtio-net-pci,netdev=net0,mac=00:16:15:14:13:12 -device virtio-tablet

    Verifique as interfaces no sistema com o comando ifconfig -a

    Configure o endereço IP no host na interface (tap0) e dentro da instância (VM), utilizando o seguinte comando:
    ifconfig tap0 10.10.0.1/24 up

    O host consegue se comunicar com a instância (VM) pela rede ?

  4. Inicie outra instância, utilizando uma segunda interface tap (tap1), para realizarmos os seguintes passos.
    (OBS: não esqueça de trocar o endereço MAC "mac=..." e de alterar a interface na linha de comando para iniciar a segunda instância).

    Descreva os passos necessários em seu relatório.

  5. Realizando a comunicação entre instâncias.


    Para isso será necessario incluir as interfaces no lado do host em uma bridge-linux.

    Crie uma bridge com o nome br0 brctl addbr br0

    Adicione as interfaces na bridge com o seguinte comando brctl addif br0 tap0

    Verifique a bridge criada e suas interfaces com o comando brctl show

    Faça a configuração dos endereço IP nas instância e teste a comunicação entre elas.

    Analise a saida do comando dmesg no host e procure pela as interfaces tap. Baseado na mensagem, o que o kernel fez com a interface ?

    Digite o seguinte comando brctl showmacs br0 e verifique os endereços MAC de cada porta da bridge. De onde são os endereços MAC que estão passando pela bridge ?

  6. Responda:
    O host possui comunicação com as instâncias ? Se não, que configuração precisamos realizar para que o host se comunique com as instâncias ?
    Se as instâncias, necessita-se estar na mesma rede local do host, que configuração o ambiente deveria ter ? Exemplifique.

  7. Rode um Docker

Inicie o docker engine: systemctl start docker

docker run -it --rm --name teste willreli/centos bash

Veja a interface de rede dentro do container

ip -d link show

Faça esse mesmo comando no host e veja a interface de numero que apresentou dentro do container

eth0@ifXX …

No host pegue o pid do primeiro processo do container

docker inspect --format '{{.State.Pid}}' teste

Dentro do Host ainda crie o diretorio /var/run/netns se nĂŁo existir

mkdir /var/run/netns

ln -sf /proc/<PID-DOCKER>/ns/net /var/run/netns/teste

ip netns

> saida esperada teste (id: 0)

Dentro do container execute:

nc -v 143.106.7.54 80

No host execute:

ip netns exec teste netstat -ntp

Faça no host o mesmo comando netstat -ntp e procure pela conexão do nc. Explore os dentro e fora do container para entender a árvore de processo.

Para abrir um novo terminal no container execute: docker exec -it teste bash

  1. Explique, com base nos testes realizados, as diferenças no caminho da comunicação de rede entre:
  2. VM (QEMU/KVM) sem interface TAP
  3. VM (QEMU/KVM) com interface TAP conectada Ă  bridge
  4. Container Docker (namespace de rede)

Em cada caso, descreva como as aplicações se comunicam com a rede, indicando o caminho que os pacotes percorrem (do processo até a interface física).

Complete e explique o fluxo com suas prĂłprias palavras, por exemplo:

Explique:

Como muda o nĂ­vel de isolamento entre as abordagens ?
Onde ocorre o encapsulamento e comutação ?
Qual é o papel do kernel do host em cada cenário ?