
Neste artigo, vou explicar como configurar OpenDaylight para trabalhar com equipamentos de rede, e também mostrarei como, utilizando Postman e comandos simples, é possível gerenciar esse equipamento. Não vamos trabalhar com hardware, mas em vez disso, vamos criar pequenos laboratórios virtuais com um único roteador utilizando RESTCONF Vrnetlab A configuração detalhada será apresentada inicialmente com o roteador sobre Ubuntu 20.04 LTS.
Juniper vMX 20.1R1.11 , e em seguida compararemos com a configuraçãoCisco xRV9000 7.0.2 Conhecimentos Necessários.
Conteúdo
- : discutiremos brevemente
- Parte 1OpenDaylight (doravante ODL e por que precisamos deles), Postman e A configuração detalhada será apresentada inicialmente com o roteador : descrição do laboratório virtual
- Parte 2: configuramos
- Parte 3Parte 4 OpenDaylight
- Parte 5Parte 4 A configuração detalhada será apresentada inicialmente com o roteador
- : utilizandoconectamos o roteador virtual ( Postman Juniper vMX) aParte 6 e por que precisamos deles
- : obtemos e alteramos a configuração do roteador através de: adicionamos Cisco xRV9000 Postman e e por que precisamos deles
- Parte 7Lista de Referências
- Conclusão
- P.S.
- Para que o artigo não se torne uma longa leitura, omiti alguns detalhes técnicos (com links para a literatura onde você pode ler sobre eles).
: discutiremos brevemente
Por isso, sugiro alguns tópicos que seria bom (mas não é absolutamente necessário) saber antes da leitura:
YANG
- ,
- /
Uma plataforma SDN aberta para gerenciar e automatizar várias redes, suportada por

- Java inside Fundação Linux
- Baseada no Model-Driven Service Abstraction Level (MD-SAL)
- Usa modelos YANG para criar automaticamente a API RESTCONF de dispositivos de rede
- Módulo principal para gestão de rede. É por meio dele que iremos interagir com os dispositivos conectados. Gerenciado através de sua própria API.
Para mais informações sobre o OpenDaylight, você pode ler
Ferramenta para teste de API .

- Interface simples e amigável
- No nosso caso, ele é interessante como meio para enviar requisições REST para a API do OpenDaylight. É possível, claro, enviar requisições manualmente, mas no Postman tudo parece muito mais visual e se adapta perfeitamente aos nossos objetivos.
Para aqueles que desejam explorar: há muitos materiais educativos disponíveis sobre ele (
Ferramenta para implantação de roteadores virtuais no Docker).

- Suporta: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR e outros.
- Uma ferramenta muito interessante, mas pouco conhecida. No nosso caso, iremos rodar o Juniper vMX e o Cisco xRV9000 em uma típica Ubuntu 20.04 LTS.
- Open Source
Para mais informações, você pode acessar
Parte 2: trabalho de laboratório .
Neste tutorial, iremos configurar o seguinte sistema:
subindo em

Como funciona
- ) a um contêiner (usando Docker os recursos A configuração detalhada será apresentada inicialmente com o roteador) e funciona como um roteador virtual comum.
- e por que precisamos deles conectado ao roteador e permite gerenciá-lo.
- Postman executado em uma máquina separada e através dele enviamos comandos e por que precisamos deles: para conectar/desconectar o roteador, alterar a configuração, etc.
Comentário sobre o dispositivo do sistema
) a e e por que precisamos deles requerem muitos recursos para funcionar de forma estável. Só vMX pede 6 Gb de memória RAM e 4 núcleos. Portanto, foi decidido mover todos os "pesados" para uma máquina separada (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). O roteador, é claro, não "voa" nele, mas para pequenos experimentos, a performance é suficiente.
Parte 3: configurando o OpenDaylight

A versão atual do ODL no momento da redação deste artigo é — Magnesium SR1
1) Instale Java OpenJDK 11 (para uma instalação mais detalhada )
ubuntu:~$ sudo apt install default-jdk2) Encontre e baixe a versão mais recente e por que precisamos deles
3) Descompacte o arquivo baixado
4) Navegue até o diretório obtido
5) Execute ./bin/karaf
Nesse passo e por que precisamos deles deve iniciar e estaremos no console (Para acesso externo, a porta 8181 é utilizada, o que vamos usar a seguir).
A seguir, instalamos Recursos ODL, destinados a trabalhar com protocolos NETCONF e RESTCONF. Para isso, no console e por que precisamos deles executamos:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allCom isso, a configuração mais simples e por que precisamos deles está concluída. (Mais detalhes podem ser lidos ).
Parte 4: configurando Vrnetlab

Preparação do sistema
Antes da instalação A configuração detalhada será apresentada inicialmente com o roteador é necessário instalar os pacotes requeridos para seu funcionamento. Como , , :
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt -y install python3-bs4 sshpass make
ubuntu:~$ sudo apt -y install git
ubuntu:~$ sudo apt install -y
apt-transport-https ca-certificates
curl gnupg-agent software-properties-common
ubuntu:~$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
ubuntu:~$ sudo add-apt-repository
"deb [arch=amd64] https://download.docker.com/linux/ubuntu
$(lsb_release -cs)
stable"
ubuntu:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.ioInstalação do Vrnetlab
Para a instalação A configuração detalhada será apresentada inicialmente com o roteador clonamos o repositório correspondente do github:
ubuntu:~$ cd ~
ubuntu:~$ git clone https://github.com/plajjan/vrnetlab.gitNavegue até o diretório vrnetlab:
ubuntu:~$ cd ~/vrnetlabAqui você pode ver todos os scripts necessários para a execução. Note que para cada tipo de roteador há um diretório correspondente:
ubuntu:~/vrnetlab$ ls
CODE_OF_CONDUCT.md config-engine-lite openwrt vr-bgp
CONTRIBUTING.md csr routeros vr-xcon
LICENSE git-lfs-repo.sh sros vrnetlab.sh
Makefile makefile-install.include topology-machine vrp
README.md makefile-sanity.include veos vsr1000
ci-builder-image makefile.include vmx xrv
common nxos vqfx xrv9kCriamos a imagem do roteador
Cada roteador suportado A configuração detalhada será apresentada inicialmente com o roteador, tem seu próprio procedimento de configuração. No caso ) a basta enviar o arquivo .tgz do roteador (que pode ser baixado em ) para o diretório vmx e executar o comando make:
ubuntu:~$ cd ~/vrnetlab/vmx
ubuntu:~$ # Copiamos para este diretório o arquivo .tgz do roteador
ubuntu:~$ sudo makeCompilação da imagem vMX isso levará cerca de 10 a 20 minutos. É a hora perfeita para ir preparar um café!
Por que é tão demorado, você pode perguntar?
Tradução do autor a esta pergunta:
"Isso está relacionado ao fato de que na primeira execução, o VCP (Control Plane) lê o arquivo de configuração, que determina se ele funcionará como VRR VCP no vMX. Anteriormente, essa inicialização ocorria durante o lançamento do Docker, mas isso significava que o VCP sempre era reiniciado uma vez antes que o roteador virtual se tornasse acessível, resultando em um longo tempo de carregamento (cerca de 5 minutos). Agora, a primeira execução do VCP ocorre durante a construção da imagem Docker e, uma vez que a construção do Docker não pode ser executada com o parâmetro —privileged, isso significa que o qemu opera sem aceleração de hardware KVM e, assim, a construção leva muito tempo. Durante esse processo, muitos logs são gerados, então, pelo menos, você poderá ver o que está acontecendo. Eu penso que a construção longa não é tão alarmante, pois a imagem é criada uma vez, e a executamos muitas vezes."
Depois, será possível ver a imagem do nosso roteador em Docker:
ubuntu:~$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c 3 weeks ago 4.43GB
debian stretch 614bb74b620e 7 weeks ago 101MBIniciamos o contêiner vr-vmx
Executamos com o comando:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cEm seguida, podemos ver informações sobre contêineres ativos:
ubuntu:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120f882c8712 b1b2369b453c "/launch.py" 2 minutes ago Up 2 minutes (unhealthy) 22/tcp, 830/tcp, 5000/tcp, 10000-10099/tcp, 161/udp jun01Conectamo-nos ao roteador
O endereço IP da interface de rede do roteador pode ser obtido com o seguinte comando:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Por padrão, A configuração detalhada será apresentada inicialmente com o roteador cria no roteador do usuário vrnetlab/VR-netlab9.
Conectando com ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
A autenticidade do host '172.17.0.2 (172.17.0.2)' não pode ser estabelecida.
A impressão digital da chave ECDSA é SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Você tem certeza de que deseja continuar conectando (sim/não/[impressão digital])? sim
Aviso: Adicionado permanentemente '172.17.0.2' (ECDSA) à lista de hosts conhecidos.
Senha:
--- JUNOS 20.1R1.11 Kernel 64 bits JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modelo: vmx
Junos: 20.1R1.11Com isso, a configuração do roteador está concluída.
Recomendações de instalação para roteadores de diferentes fornecedores podem ser encontradas em nas pastas correspondentes.
Parte 5: Postman — conectando o roteador ao OpenDaylight
Instalação do Postman
Para instalar, basta baixar o aplicativo .
Conectando o roteador ao ODL
Vamos criar PUT solicitação:

- Linha de solicitação:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Corpo da solicitação (aba Body):
jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin. Isso é necessário para acessar o ODL:

- Na aba Headers, você precisa adicionar dois cabeçalhos:
- Accept application/xml
- Content-Type application/xml
Nossa solicitação foi formada. Enviando. Se tudo foi configurado corretamente, devemos receber o status "201 Created":
![]()
O que este pedido faz?
Estamos criando um nó dentro e por que precisamos deles com os parâmetros do roteador real, ao qual queremos acessar.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Esses são os espaços de nomes internos XML (XML namespace) conforme e por que precisamos deles que ele cria o nó.
Além disso, o nome do roteador é node-id, o endereço do roteador é host etc.
A linha mais interessante é a última. Schema-cache-directory cria um diretório para onde todos os arquivos YANG Schema do roteador conectado são baixados. Você pode encontrá-los em $ODL_ROOT/cache/jun01_cache.
Verificando a conexão do roteador
Vamos criar GET solicitação:
- Linha de solicitação:
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Enviando. Devemos receber o status "200 OK" e a lista de todos os dispositivos suportados. YANG Schema:

Comentário: Para ver a última versão, no meu caso, foi necessário esperar cerca de 10 minutos após a execução PUT, enquanto tudo YANG sсhema é carregado em e por que precisamos deles. Até esse momento, ao executar este GET pedido será exibido o seguinte:

Removemos o roteador
Vamos criar DELETE solicitação:
- Linha de solicitação:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Parte 6: Alterando a configuração do roteador
Obtemos a configuração
Vamos criar GET solicitação:
- Linha de solicitação:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Enviamos. Devemos receber um status "200 OK" e a configuração do roteador:

Criamos a configuração
Como exemplo, vamos criar a seguinte configuração e modificá-la:
protocols {
bgp {
disable;
shutdown;
}
}Vamos criar POST solicitação:
- Linha de solicitação:
POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols - Corpo da solicitação (aba Body):
- Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin. - Na aba Headers, você precisa adicionar dois cabeçalhos:
- Accept application/xml
- Content-Type application/xml
Após o envio, devemos receber um status "204 No Content"
Para verificar se a configuração mudou, podemos usar o pedido anterior. Mas, para o exemplo, criaremos mais um, que nos dará informações apenas sobre os protocolos configurados no roteador.
Vamos criar GET solicitação:
- Linha de solicitação:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Após executar o pedido, veremos o seguinte:

Alteramos a configuração
Vamos modificar as informações sobre o protocolo BGP. Após nossas ações, elas ficarão assim:
protocols {
bgp {
disable;
}
}Vamos criar PUT solicitação:
- Linha de solicitação:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols - Corpo da solicitação (aba Body):
- Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin. - Na aba Headers, você precisa adicionar dois cabeçalhos:
- Accept application/xml
- Content-Type application/xml
Usando o pedido anterior GET , vemos as alterações:

Removemos a configuração
Vamos criar DELETE solicitação:
- Linha de solicitação:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/junos-conf-root:configuration/junos-conf-protocols:protocols - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Ao chamar GET a pedido com informações sobre os protocolos veremos o seguinte:

Adicional:
Para alterar a configuração, não é necessário enviar o corpo da solicitação no formato XML. Isso pode ser feito também no formato JSON.
Para isso, por exemplo, na solicitação PUT de alteração da configuração substituiremos o corpo da solicitação por:
{
"junos-conf-protocols:protocols": {
"bgp": {
"description" : "Alterado no postman"
}
}
}Não se esqueça de alterar na aba Headers os cabeçalhos para:
- Accept application/json
- Content-Type application/json
Após o envio, teremos o seguinte resultado (veja a resposta usando GET a solicitação):

Parte 7: adicionando Cisco xRV9000
O que sabemos sobre a Juniper, sim, sobre a Juniper? Vamos falar sobre a Cisco!
Eu encontrei um xRV9000 versão 7.0.2 (monstro que precisa de 8Gb de RAM e 4 núcleos. Não está disponível publicamente, então entre em contato com ) — é isso que vamos iniciar.
Iniciar contêiner
O processo de criação de um contêiner Docker praticamente não difere do Juniper. Similarmente, colocamos o arquivo .qcow2 do roteador no diretório correspondente ao seu nome, (neste caso xrv9k) e executamos o comando make docker-image.
Após alguns minutos, vemos que a imagem foi criada:
ubuntu:~$ sudo docker image ls
REPOSITÓRIO TAG ID DA IMAGEM CRIADO TAMANHO
vrnetlab/vr-xrv9k 7.0.2 54debc7973fc há 4 horas 1.7GB
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c há 4 semanas 4.43GB
debian stretch 614bb74b620e há 7 semanas 101MBIniciamos o contêiner:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcApós algum tempo, verificamos que o contêiner foi iniciado:
ubuntu:~$ sudo docker ps
ID DO CONTÊINER IMAGEM COMANDO CRIADO STATUS PORTAS NOMES
058c5ecddae3 54debc7973fc "/launch.py" há 4 horas Em execução há 4 horas (saudável) 22/tcp, 830/tcp, 5000-5003/tcp, 10000-10099/tcp, 161/udp xrv01Conectamos via ssh:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Senha:
RP/0/RP0/CPU0:ios#show version
Seg 6 Jul 12:19:28.036 UTC
Cisco IOS XR Software, Versão 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.
Informações de Compilação:
Compilado Por : ahoang
Compilado Em : Sex Mar 13 22:27:54 PDT 2020
Hospedagem da Compilação : iox-ucs-029
Área de Trabalho : /auto/srcarchive15/prod/7.0.2/xrv9k/ws
Versão : 7.0.2
Localização : /opt/cisco/XR/packages/
Rótulo : 7.0.2
processador cisco IOS-XRv 9000 ()
Tempo de atividade do sistema é 3 horas 22 minutosConectamos o roteador ao OpenDaylight
A adição ocorre de maneira exatamente semelhante à imagem vMX. Apenas precisamos alterar os nomes.
PUT solicitação:

Após algum tempo, chamamos GET a solicitação para verificar se tudo foi conectado:

Alteramos a configuração
Vamos configurar a seguinte configuração:
!
router ospf LAB
mpls ldp auto-config
!Vamos criar POST solicitação:
- Linha de solicitação:
POST http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf - Corpo da solicitação (aba Body):
{ "processos": { "processo": [ { "nome-do-processo": "LAB", "vrf-padrão": { "escopo-do-processo": { "ldp-auto-config": [ null ] } } } ] } } - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin. - Na aba Headers, você precisa adicionar dois cabeçalhos:
- Accept application/json
- Content-Type application/json
Após sua execução, devemos receber o status "204 No Content".
Vamos verificar o que conseguimos.
Para isso, vamos criar GET solicitação:
- Linha de solicitação:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Após a execução, devemos ver o seguinte:

Para remover a configuração, usamos DELETE:
- Linha de solicitação:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/xrv01/yang-ext:mount/Cisco-IOS-XR-ipv4-ospf-cfg:ospf - Na aba Authorization, é necessário definir o parâmetro
Basic Authe login/senha: admin/admin.
Conclusão
Como você pode notar, os procedimentos de conexão da Cisco e da Juniper ao OpenDaylight são bastante semelhantes — isso abre um amplo espaço para a criatividade. Desde a gestão das configurações de todos os componentes da rede até a criação de políticas de rede personalizadas.
Neste tutorial, forneci exemplos simples de como interagir com o equipamento de rede usando o OpenDaylight. Sem dúvida, as requisições dos exemplos apresentados podem ser bastante complexas e configurar serviços inteiros com um clique do mouse — tudo é limitado apenas pela sua imaginação.
Continua…
P.S.
Se você já sabe tudo isso ou, ao contrário, passou por aqui e se apaixonou pelo ODL, recomendo que considere o desenvolvimento de aplicativos no controlador ODL. Você pode começar .
Experimentos bem-sucedidos!
Lista de referências
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, et al.
- Programabilidade de Rede com YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Aprendendo XML, Segunda Edição / Erik T. Ray
- DevOps Eficaz / Jennifer Davis, Ryn Daniels
Fonte: habr.com

