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>
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
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)
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
Boa tarde Diego,
ResponderExcluirÉ 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?
Você conseguiu integrar com o Wireshark? Se sim, poderia informar como?
ResponderExcluirDesde já, muito obrigada!
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.
ResponderExcluirOpa 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.
ExcluirAbraços