NetKit: Emulando Redes IPs com Software Livre

Um dos grandes desafios de quem está estudando redes de computadores é simulá-las em laboratório. Normalmente você precisa ter uma sala com pelo menos 3 PCs ou servidores para conseguir realizar testes de configuração de endereçamento IP, NAT, firewall, roteamento de pacotes, etc…

Pra sanar este tipo de dificuldade, existem alguns softwares que nos permitem simular redes arbitrárias e complexas, compostas por vários hosts e roteadores, tudo isso rodando em um simples notebook ou PC. Um dos meus softwares favoritos para este tipo de operação, é o NetKit. Ele se auto-define como: “The poor man’s system to experiment computer networking”, ou numa tradução livre, “sistema para que homens pobres possam experimentar redes de computadores”. 🙂

O NetKit é um software livre, baseado no UML Linux (kernel rodando em modo usuário), que lhe permite startar instâncias de máquinas virtuais baseadas no Debian Linux, a partir de 8MB de memória RAM por VM. Você pode rodá-lo a partir de basicamente qualquer distribuição Linux ou mesmo baixá-lo em Live-CD, embarcado no Knoppix Linux. Além disso, você não precisa nem mesmo instalá-lo, basta baixar seus componentes, configurar algumas variáveis de ambiente e sair rodando a aplicação.

Neste post, vou me concentrar em demonstrar como rodar o NetKit no Linux e de quebra utilizá-lo em um laboratório de tunelamento 6to4. Em outras palavras, veremos como simular uma rede composta por 3 hosts, sendo 1 deles no papel de roteador IPv4, e dois outros computadores, em domínios de colisão diferentes, rodando IPv6 (6to4). A ideia básica é demonstrar uma, das muitas técnicas, de coexistência entre hosts IPv6 e IPv4. Neste cenário, vamos simular o tráfego de pacotes IPv6 por backbones (como acontece na maior parte da Internet) que só falam IPv4.

Pois bem, sem mais delongas, vamos ao que interessa. Você pode usar basicamente qualquer distribuição Linux como sistema hospedeiro, desde que tenha ambiente gráfico. Particularmente, gosto do Ubuntu Linux. 😉

Abra um terminal texto e baixe os componentes do NetKit (neste momento, na versão 2.8):

user@host:~$ cd <enter>
 user@host:~$ wget http://wiki.netkit.org/download/netkit/netkit-2.8.tar.bz2
 user@host:~$ wget http://wiki.netkit.org/download/netkit-filesystem/netkit-filesystem-i386-F5.2.tar.bz2
 user@host:~$ wget http://wiki.netkit.org/download/netkit-kernel/netkit-kernel-i386-K2.8.tar.bz2

Descompacte os arquivos:

user@host:~$ tar jxvf netkit-2.8.tar.bz2
 user@host:~$ tar jxvf netkit-filesystem-i386-F5.2.tar.bz2
 user@host:~$ tar jxvf netkit-kernel-i386-K2.8.tar.bz2

Crie as variáveis de ambiente apropriadas (editando .bashrc e incluindo as linhas abaixo no final do arquivo):

export NETKIT_HOME=/home/user/netkit
export MANPATH=:$NETKIT_HOME/man
export PATH=$NETKIT_HOME/bin:$PATH

Teste se tudo deu certo:

user@host:~$ bash <enter>
 ./check_configuration.sh

Principais comandos do NetKit:

Para startar, reiniciar ou configurar as máquinas virtuais no netkit você precisa decorar apenas alguns comandos básicos. Abaixo segue uma listagem breve dos principais:

  • vstart: inicia uma nova máquina
  • vlist: lista as máquinas rodando
  • vconfig: novas nics em tempo de execução
  • vhalt: desliga a máquina virtual de forma ordenada
  • vcrash: derruba a máquina virtual
  • vclean: “panic command”

Entendendo o ambiente:

Para gerarmos o ambiente de laboratório proposto neste artigo, vamos criar 3 hosts. O “pc1” que estará conectado ao domínio de colisão “A”, o “pc2”, conectado ao domínio se colisão “B”, e o “router”, que fará parte dos 2 domínios de colisão – Justamente porque ficará entre uma rede e outra. A imagem abaixo ilustra este cenário:

Startando os hosts:

user@host:~$vstart pc1 --eth0=A
user@host:~$vstart pc2 --eth0=B
user@host:~$vstart router --eth0=A --eth1=B

Aqui, cada host é criado e apresentado em uma janela diferente. Cada VM do Netkit consome em média 8MB de memória RAM e é basicamente um Debian Linux enxuto. Você também pode baixar dezenas de laboratórios prontos no site do projeto. Em geral, todos eles com material de apoio e gabarito dos testes.

Configurando o endereçamento IPv4 nos hosts:

No pc1:

# ifconfig eth0 10.0.0.10 netmask 255.255.255.0
# route add default gw 10.0.0.1

No pc2:

# ifconfig eth0 10.0.1.10 netmask 255.255.255.0
# route add default gw 10.0.1.1

No router:

# ifconfig eth0 10.0.0.1 netmask 255.255.255.0
# ifconfig eth1 10.0.1.1 netmask 255.255.255.0

Neste ponto, você já pode testar a conectividade IPv4 do cenário. Para tanto, tente “pingar” o pc1 para o pc2. Você verá que os pacotes chegarão, por intermédio do router (que é o default gateway) em ambos os hosts. No pc1:

# ping 10.0.1.10 

Configurando interface 6to4 nos hosts:

No pc1:

# modprobe ipv6
# sysctl -w net.ipv6.conf.default.forwarding=1

Editar /etc/network/interfaces e inserir as seguintes linhas:

auto sit0
iface sit0 inet6 static
address 2002:0a00:000a::1
netmask 16
ifup sit0

No pc2:
Repetir o mesmo processo realizado no pc1, alterando apenas o endereço IPv6 para: “2002:0a00:010a::1” (sem aspas no arquivo, claro).

Sem entrar no mérito da questão, já que não é objetivo deste post discutir sobre o IPv6 em si, perceba que o enderenço em ambos os hosts inicia com “2002”. O prefixo “2002::/16” é reservado para ser utilizado em mecanismos de transição 6to4. Outro detalhe importante é que interfaces de rede “sit” também são usadas no Linux quando se quer explicitar interfaces que realizam tunelamento (no nosso caso, colocar um pacote IPv6 dentro de um pacote IPv4). No host “router”, nós não alteramos nada, ou seja, ele continua ‘falando’ apenas IPv4. A ideia é justamente simular pacotes IPv6 sendo transportados por um ambiente/backbone IPv4.

Se tudo deu certo, você já será capaz de “pingar” do “pc1” para o “pc2” usando IPv6. No pc1:

# ping6 2002:0a00:010a::1

Vendo a mágica acontecer:

Você pode ir até o “router” e, através do utilitário tcpdump, ver o tráfego dos pacotes ICMPv6, de um lado para outro, encapsulados dentro de pacotes IPv4. Para tanto, basta digitar no router:

# tcpdump -v

Muito bem senhoras e senhores, este pequeno post encerra aqui seu objetivo simples. Espero que todos tenham compreendido a amplitude da aplicação NetKit e, como pode ser divertido e simples estudar conceitos de redes de computadores com este tipo de emulador. Dúvidas ou sugestões, sintam-se à vontade para postar aqui nos comentários do post.