segunda-feira, 8 de fevereiro de 2016

Mininet - SDN na prática



Bom pessoal, SDN é um assunto bem polêmico e quer queira ou não ele veio pra ficar e você analista/administrador de redes como eu vai acabar se deparando com essa tecnologia logo logo.

 Essa dica é para você que como eu não conhece nada ou quase nada de SDN, Mininet é um emulador que cria uma rede virtual rodando um kernel real com switches, hosts e controladoras tudo dentro de uma única VM:

 http://mininet.org/

 Sem muito papo, vamos a parte prática da coisa:

 - Baixe a VM do site (Virtual Box, VMWorkstation, KVM ou VMFusion):

 http://mininet.org/download/

Direto da fonte:

git clone git://github.com/mininet/mininet

Ou via apt-get:

#sudo apt-get install mininet

Bom eu como sou preguiçoso baixei a VM e instalei no Virtual Box (requer 1 processador e 1GB de RAM), agora antes de iniciar a VM, adicione a placa de rede de sua preferência (para ter acesso via terminal):


Acesse a console e use as seguintes credenciais:

user: mininet
password: mininet



Para começar digite o seguinte comando:

$sudo mn

A topologia inicial é o que eles chamam de "minimal"  com 2 hosts, 1 switch e 1 controladora, feito isso você tem uma serie de comandos pra já começar a brincar:

Mostrar os comandos da CLI:
mininet> help

Mostrar os nodes:
mininet> nodes

Mostrar os links:
mininet> net

Mostrar as informações de todos os nodes:
mininet> dump

Pingar todos os hosts:
mininet> pingall

Para verificar as configurações das interfaces, você deve colocar o nome do host/switch/controller antes do comando:

Exemplo de Host:

mininet> h1 ifconfig -a
h1-eth0   Link encap:Ethernet  HWaddr 46:b4:7a:09:76:96
          inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Exemplo no Switch 1:

mininet> s1 ifconfig -a
eth0      Link encap:Ethernet  HWaddr 08:00:27:65:98:ee
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:280 errors:0 dropped:0 overruns:0 frame:0
          TX packets:231 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:26953 (26.9 KB)  TX bytes:32712 (32.7 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:9639 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9639 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:496844 (496.8 KB)  TX bytes:496844 (496.8 KB)

ovs-system Link encap:Ethernet  HWaddr d2:bb:c1:1a:24:1c
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1        Link encap:Ethernet  HWaddr 76:b3:5a:77:3b:4c
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1-eth1   Link encap:Ethernet  HWaddr 4e:26:36:33:e5:3c
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1-eth2   Link encap:Ethernet  HWaddr ba:c0:ed:12:a6:7e
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Exemplo na controller 1:

mininet> c0 ifconfig -a
eth0      Link encap:Ethernet  HWaddr 08:00:27:65:98:ee
          inet addr:192.168.56.101  Bcast:192.168.56.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:350 errors:0 dropped:0 overruns:0 frame:0
          TX packets:278 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:32661 (32.6 KB)  TX bytes:40008 (40.0 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:9675 errors:0 dropped:0 overruns:0 frame:0
          TX packets:9675 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:498908 (498.9 KB)  TX bytes:498908 (498.9 KB)

ovs-system Link encap:Ethernet  HWaddr d2:bb:c1:1a:24:1c
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1        Link encap:Ethernet  HWaddr 76:b3:5a:77:3b:4c
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1-eth1   Link encap:Ethernet  HWaddr 4e:26:36:33:e5:3c
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

s1-eth2   Link encap:Ethernet  HWaddr ba:c0:ed:12:a6:7e
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)


Agora um teste básico de comunicação, vamos pingar do Host 1 para o Host 2:

mininet> h1 ping h2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=3.33 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.474 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.060 ms
64 bytes from 10.0.0.2: icmp_seq=4 ttl=64 time=0.055 ms
64 bytes from 10.0.0.2: icmp_seq=5 ttl=64 time=0.054 ms
64 bytes from 10.0.0.2: icmp_seq=6 ttl=64 time=0.056 ms
64 bytes from 10.0.0.2: icmp_seq=7 ttl=64 time=0.318 ms
^C
--- 10.0.0.2 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6004ms
rtt min/avg/max/mdev = 0.054/0.621/3.331/1.117 ms
mininet>

 Topologias

Para verificar as topologias pré-existentes use:

mininet@mininet-vm:~$ sudo mn --help

--topo=TOPO           linear|minimal|reversed|single|torus|tree[,param=value
                        ...] linear=LinearTopo
                        reversed=SingleSwitchReversedTopo tree=TreeTopo
                        single=SingleSwitchTopo torus=TorusTopo
                        minimal=MinimalTopo

mininet@mininet-vm:~$ sudo mn --topo=linear,5

- Minimal - Topologia default com 1 Switch e 2 hosts:




- Linear - Topologia Simples em que os Switches se conectam entre eles e com os hosts:

Agora vamos complicar um pouco mais a nossa topologia, primeiro de um exit na topologia criada, em seguida abra novamente porém vamos utilizar 5 Switches e 5 hosts em modo linear:

mininet@mininet-vm:~$ sudo mn --topo=linear,5

Verifique que foram adicionados 5 SWs e 5 Hosts:

mininet> nodes
available nodes are:
c0 h1 h2 h3 h4 h5 s1 s2 s3 s4 s5

mininet> links
h1-eth0<->s1-eth1 (OK OK)
h2-eth0<->s2-eth1 (OK OK)
h3-eth0<->s3-eth1 (OK OK)
h4-eth0<->s4-eth1 (OK OK)
h5-eth0<->s5-eth1 (OK OK)
s2-eth2<->s1-eth2 (OK OK)
s3-eth2<->s2-eth3 (OK OK)
s4-eth2<->s3-eth3 (OK OK)
s5-eth2<->s4-eth3 (OK OK)

mininet> pingall
*** Ping: testing ping reachability
h1 -> h2 h3 h4 h5
h2 -> h1 h3 h4 h5
h3 -> h1 h2 h4 h5
h4 -> h1 h2 h3 h5
h5 -> h1 h2 h3 h4
*** Results: 0% dropped (20/20 received)

mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s2-eth1
h3 h3-eth0:s3-eth1
h4 h4-eth0:s4-eth1
h5 h5-eth0:s5-eth1
s1 lo:  s1-eth1:h1-eth0 s1-eth2:s2-eth2
s2 lo:  s2-eth1:h2-eth0 s2-eth2:s1-eth2 s2-eth3:s3-eth2
s3 lo:  s3-eth1:h3-eth0 s3-eth2:s2-eth3 s3-eth3:s4-eth2
s4 lo:  s4-eth1:h4-eth0 s4-eth2:s3-eth3 s4-eth3:s5-eth2
s5 lo:  s5-eth1:h5-eth0 s5-eth2:s4-eth3
c0

- Tree - Topologia em arvore com diversas ramificações:

mininet@mininet-vm:~$ sudo mn --topo=tree,4

Obs. o Número 4 significa as camadas da topologia.

mininet> net
h1 h1-eth0:s4-eth1
h2 h2-eth0:s4-eth2
h3 h3-eth0:s5-eth1
h4 h4-eth0:s5-eth2
h5 h5-eth0:s7-eth1
h6 h6-eth0:s7-eth2
h7 h7-eth0:s8-eth1
h8 h8-eth0:s8-eth2
h9 h9-eth0:s11-eth1
h10 h10-eth0:s11-eth2
h11 h11-eth0:s12-eth1
h12 h12-eth0:s12-eth2
h13 h13-eth0:s14-eth1
h14 h14-eth0:s14-eth2
h15 h15-eth0:s15-eth1
h16 h16-eth0:s15-eth2
s1 lo:  s1-eth1:s2-eth3 s1-eth2:s9-eth3
s2 lo:  s2-eth1:s3-eth3 s2-eth2:s6-eth3 s2-eth3:s1-eth1
s3 lo:  s3-eth1:s4-eth3 s3-eth2:s5-eth3 s3-eth3:s2-eth1
s4 lo:  s4-eth1:h1-eth0 s4-eth2:h2-eth0 s4-eth3:s3-eth1
s5 lo:  s5-eth1:h3-eth0 s5-eth2:h4-eth0 s5-eth3:s3-eth2
s6 lo:  s6-eth1:s7-eth3 s6-eth2:s8-eth3 s6-eth3:s2-eth2
s7 lo:  s7-eth1:h5-eth0 s7-eth2:h6-eth0 s7-eth3:s6-eth1
s8 lo:  s8-eth1:h7-eth0 s8-eth2:h8-eth0 s8-eth3:s6-eth2
s9 lo:  s9-eth1:s10-eth3 s9-eth2:s13-eth3 s9-eth3:s1-eth2
s10 lo:  s10-eth1:s11-eth3 s10-eth2:s12-eth3 s10-eth3:s9-eth1
s11 lo:  s11-eth1:h9-eth0 s11-eth2:h10-eth0 s11-eth3:s10-eth1
s12 lo:  s12-eth1:h11-eth0 s12-eth2:h12-eth0 s12-eth3:s10-eth2
s13 lo:  s13-eth1:s14-eth3 s13-eth2:s15-eth3 s13-eth3:s9-eth2
s14 lo:  s14-eth1:h13-eth0 s14-eth2:h14-eth0 s14-eth3:s13-eth1
s15 lo:  s15-eth1:h15-eth0 s15-eth2:h16-eth0 s15-eth3:s13-eth2
c0

Fica mais ou menos assim:



Cuidado para não exagerar nas camadas pois a VM não aguenta kkkk tentei com 10 camadas e travou tudo.

O bacana disso tudo é pra começar a ter uma ideia de como serão as redes no futuro, assim que eu conseguir integrar com o Wireshark direitinho posto mais coisas sobre a ferramenta.

Abraços

Ajude o Café com Redes:

4 comentários:

  1. Boa tarde Diego,
    É possivel integrar a rede criada no mininet com outros hots da rede real? ou integrar a rede do mininet às máquinas criadas no virtualbox? Se sim, como é feito esse procedimento?

    ResponderExcluir
  2. Você conseguiu integrar com o Wireshark? Se sim, poderia informar como?
    Desde já, muito obrigada!

    ResponderExcluir
  3. Bom dia Diego, como faço para criar um script que de um host eu possa fazer conexões a outros hosts dentro do sdn, por exemplo: xterm h1 um script identifica os hosts ativos e se conectar via ssh em qualquer outro, neste caso h5. Grato pela informação, Euclides.

    ResponderExcluir
    Respostas
    1. Opa Euclides beleza? Cara fiz esse post há muito tempo, não lembro bem mais os comandos ou como realizar o que vc precisa, no site https://ciscoredes.com.br/ tem alguns scripts/tutorials em Phyton e Ansible para realizar algumas tarefas em ambientes SDN.

      Abraços

      Excluir