
En este artículo, hablaré sobre cómo configurar OpenDaylight para trabajar con el equipo de red, así como mostraré cómo a través de Postman y simples RESTCONF consultas se puede gestionar este equipo. No trabajaremos con el hardware, sino que desplegaremos pequeñas laboratorios virtuales con un solo enrutador utilizando Vrnetlab sobre Ubuntu 20.04 LTS.
Mostraré la configuración detallada primero con el ejemplo del enrutador Juniper vMX 20.1R1.11, y luego compararemos con la configuración de Cisco xRV9000 7.0.2.
Contenido
- Conocimientos necesarios
- Parte 1: discutimos brevemente OpenDaylight (en adelante ODL), Postman y Vrnetlab y por qué los necesitamos
- Parte 2: descripción del laboratorio virtual
- Parte 3: configuramos OpenDaylight
- Parte 4: configuramos Vrnetlab
- Parte 5: mediante Postman conectando el enrutador virtual (Juniper vMX) a ODL
- Parte 6: obtenemos y modificamos la configuración del enrutador utilizando Postman y ODL
- Parte 7: añadimos Cisco xRV9000
- Conclusión
- P.D.
- Lista de literatura
Conocimientos necesarios
Para que el artículo no se convierta en una hoja larga, he omitido algunos detalles técnicos (con enlaces a la literatura donde se puede leer sobre ellos).
Por ello, les propongo temas que sería bueno (aunque no es estrictamente necesario) conocer antes de leer:
- ,
- /
Parte 1: un poco de teoría

- Plataforma SDN abierta para la gestión y automatización de diversas redes, respaldada por Linux Foundation
- Java dentro
- Basado en el Nivel de Abstracción de Servicio Guiado por Modelos (MD-SAL)
- Utiliza modelos YANG para crear automáticamente RESTCONF API para dispositivos de red
Módulo principal para la gestión de la red. Es a través de él que nos comunicaremos con los dispositivos conectados. Se gestiona a través de su propia API.
Se puede leer más sobre OpenDaylight .

- Herramienta para probar API
- Interfaz simple y fácil de usar
En nuestro caso, nos interesa como medio para enviar solicitudes REST a la API de OpenDaylight. Por supuesto, se pueden enviar solicitudes manualmente, pero en Postman se ve muy claro y se adapta mejor a nuestros objetivos.
Para quienes deseen profundizar: se han escrito muchos materiales educativos sobre ello ().

- Herramienta para desplegar enrutadores virtuales en Docker
- Compatible con: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR, entre otros.
- Open Source
Un instrumento muy interesante pero poco conocido. En nuestro caso, lo utilizaremos para arrancar Juniper vMX y Cisco xRV9000 en una Ubuntu 20.04 LTS normal.
Se puede leer más sobre él en .
Parte 2: trabajo de laboratorio
En el marco de este tutorial, vamos a configurar el siguiente sistema:

¿Cómo funciona?
- Juniper vMX se levantará en Docker en un contenedor (usando Vrnetlab) y funciona como un enrutador virtual ordinario.
- ODL conectado al enrutador y permite gestionarlo.
- Postman se ejecuta en una máquina separada y a través de él enviamos comandos ODL: para conectar/desconectar el enrutador, cambiar la configuración, etc.
Comentario sobre el dispositivo del sistema
Juniper vMX y ODL requieren bastantes recursos para su funcionamiento estable. Solo el vMX requiere 6 Gb de memoria RAM y 4 núcleos. Por lo tanto, se tomó la decisión de trasladar a todas las "pesadas" a una máquina separada (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). El enrutador, por supuesto, no "vuela" en ella, pero para pequeños experimentos es suficiente su rendimiento.
Parte 3: configurando OpenDaylight

La versión actual de ODL en el momento de la redacción del artículo es Magnesium SR1
1) Instalamos Java OpenJDK 11 (para una instalación más detallada )
ubuntu:~$ sudo apt install default-jdk2) Localizamos y descargamos la última compilación ODL
3) Descomprimimos el archivo descargado
4) Pasamos al directorio obtenido
5) Ejecutamos ./bin/karaf
En este paso ODL debería iniciarse y nos encontraremos en la consola (Para acceso externo se utiliza el puerto 8181, que utilizaremos más adelante).
A continuación, instalamos ODL Features, destinadas a trabajar con protocolos NETCONF y RESTCONF. Para ello, en la consola ODL ejecutamos:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allCon esto, la configuración más básica ODL está completa. (Se puede leer más detalladamente ).
Parte 4: configurando Vrnetlab

Preparación del sistema
Antes de la instalación Vrnetlab es necesario instalar los paquetes requeridos para su funcionamiento. Tales 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 -
ubntu:~$ 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.ioInstalación de Vrnetlab
Para la instalación Vrnetlab clonamos el repositorio correspondiente de github:
ubuntu:~$ cd ~
ubntu:~$ git clone https://github.com/plajjan/vrnetlab.gitPasamos al directorio vrnetlab:
ubuntu:~$ cd ~/vrnetlabAquí se pueden ver todos los scripts necesarios para el inicio. Tenga en cuenta que se ha creado un directorio correspondiente para cada tipo de enrutador:
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 xrv9kCreando la imagen del enrutador
Cada enrutador que se admite Vrnetlab, tiene su propio procedimiento de configuración. En el caso de Juniper vMX solo necesitamos subir el archivo .tgz del enrutador (se puede descargar de ) a la carpeta vmx y ejecutar el comando make:
ubuntu:~$ cd ~\/vrnetlab\/vmx
ubuntu:~$ # Copiamos el archivo .tgz del enrutador en este directorio
ubuntu:~$ sudo makeCompilación de la imagen vMX tomará aproximadamente de 10 a 20 minutos. ¡Es un buen momento para preparar café!
¿Por qué tarda tanto, se preguntarán?
Traducción del autor a esta pregunta:
"Esto se debe a que, en el primer inicio, el VCP (Control Plane) lee el archivo de configuración que determina si funcionará como un VRR VCP en vMX. Anteriormente, este inicio se realizaba durante el inicio de Docker, pero eso significaba que el VCP siempre se reiniciaba una vez antes de que el enrutador virtual estuviera disponible, lo que llevaba a un tiempo de arranque prolongado (alrededor de 5 minutos). Ahora el primer inicio del VCP se realiza durante la construcción de la imagen de Docker, y dado que la construcción de Docker no puede ejecutarse con la opción --privileged, esto significa que qemu funciona sin aceleración de hardware KVM y, por lo tanto, la construcción tarda mucho tiempo. Durante este proceso se generan muchos registros, así que, al menos, podrás ver qué está sucediendo. Creo que la larga construcción no es tan alarmante, porque creamos la imagen una vez y la ejecutamos muchas veces."
Después, se podrá ver la imagen de nuestro enrutador en Docker:
ubuntu:~$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab\/vr-vmx 20.1R1.11 b1b2369b453c hace 3 semanas 4.43GB
debian stretch 614bb74b620e hace 7 semanas 101MBIniciamos el contenedor vr-vmx
Se inicia con el comando:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cLuego podemos ver información sobre los contenedores activos:
ubuntu:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120f882c8712 b1b2369b453c "\/launch.py" hace 2 minutos En funcionamiento 2 minutos (no saludable) 22\/tcp, 830\/tcp, 5000\/tcp, 10000-10099\/tcp, 161\/udp jun01Conectamos al enrutador
La dirección IP de la interfaz de red del enrutador se puede obtener con el siguiente comando:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Por defecto, Vrnetlab crea un usuario en el enrutador vrnetlab/VR-netlab9.
Conectándose con ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
La autenticidad del host '172.17.0.2 (172.17.0.2)' no se puede establecer.
La huella digital de la clave ECDSA es SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
¿Está seguro de que desea continuar conectando (sí/no/[huella digital])? sí
Advertencia: '172.17.0.2' (ECDSA) se ha añadido permanentemente a la lista de hosts conocidos.
Contraseña:
--- JUNOS 20.1R1.11 Kernel de 64 bits JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modelo: vmx
Junos: 20.1R1.11Con esto, la configuración del enrutador ha finalizado.
Las recomendaciones de instalación para enrutadores de diferentes proveedores se pueden encontrar en en los directorios correspondientes.
Parte 5: Postman — conectando el enrutador a OpenDaylight
Instalación de Postman
Para instalar, solo descarga la aplicación .
Conectando el enrutador a ODL
Crearemos PUT solicitud:

- Cadena de solicitud:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Cuerpo de la solicitud (pestaña Cuerpo):
jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin. Esto es necesario para acceder a ODL:

- En la pestaña Encabezados es necesario agregar dos encabezados:
- Accept application/xml
- Content-Type application/xml
Nuestra solicitud está formada. Enviamos. Si todo estaba configurado correctamente, deberíamos recibir el estado "201 Created":
![]()
¿Qué hace esta solicitud?
Estamos creando un nodo dentro de ODL con los parámetros del enrutador real, al que queremos acceder.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Estos son los espacios de nombres internos XML (espacio de nombres XML) para ODL de acuerdo con los cuales crea el nodo.
Además, el nombre del enrutador es node-id, la dirección del enrutador es host etc.
La línea más interesante es la última. Schema-cache-directory crea un directorio en el que se descargan todos los archivos YANG Schema del enrutador conectado. Puedes encontrarlos en $ODL_ROOT/cache/jun01_cache.
Verificando la conexión del enrutador
Crearemos GET solicitud:
- Cadena de solicitud:
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Enviamos. Deberíamos recibir el estado "200 OK" y una lista de todos los dispositivos soportados. YANG Schema:

Comentario: Para ver la última, en mi caso, tuve que esperar unos 10 minutos después de la ejecución PUT, mientras que todo YANG sсhema se descargue en ODL. Hasta ese momento, al realizar esta GET solicitud se mostrará lo siguiente:

Eliminando el enrutador
Crearemos ELIMINAR solicitud:
- Cadena de solicitud:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Parte 6: Cambiando la configuración del enrutador
Obteniendo la configuración
Crearemos GET solicitud:
- Cadena de solicitud:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Enviando. Deberíamos recibir el estado "200 OK" y la configuración del enrutador:

Creando la configuración
Como ejemplo, crearemos la siguiente configuración y la modificaremos:
protocols {
bgp {
disable;
shutdown;
}
}Crearemos POST solicitud:
- Cadena de solicitud:
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 - Cuerpo de la solicitud (pestaña Cuerpo):
- En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin. - En la pestaña Encabezados es necesario agregar dos encabezados:
- Accept application/xml
- Content-Type application/xml
Después de enviar, deberíamos recibir el estado "204 No Content"
Para verificar que la configuración ha cambiado, se puede usar la solicitud anterior. Pero como ejemplo, vamos a crear otra que nos mostrará solo la información sobre los protocolos configurados en el enrutador.
Crearemos GET solicitud:
- Cadena de solicitud:
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 - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Después de ejecutar la solicitud, veremos lo siguiente:

Cambiando la configuración
Vamos a cambiar la información sobre el protocolo BGP. Después de nuestras acciones, se verá de la siguiente manera:
protocols {
bgp {
disable;
}
}Crearemos PUT solicitud:
- Cadena de solicitud:
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 - Cuerpo de la solicitud (pestaña Cuerpo):
- En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin. - En la pestaña Encabezados es necesario agregar dos encabezados:
- Accept application/xml
- Content-Type application/xml
Usando la solicitud anterior, vemos cambios: GET Eliminando la configuración

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
Crearemos ELIMINAR solicitud:
- Cadena de solicitud:
de la solicitud con información sobre los protocolos veremos lo siguiente: - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Al invocar GET Para cambiar la configuración, no es necesario enviar el cuerpo de la solicitud en formato

Adición:
. Esto también se puede hacer en formato XMLPor ejemplo, en la solicitud JSON.
de cambio de configuración, reemplazaremos el cuerpo de la solicitud por: PUT { "junos-conf-protocols:protocols": { "bgp": { "description" : "Cambiado en postman" } } }
No olvides cambiar en la pestaña Headers los encabezados a:Accept application/json
- Content-Type application/json
- Después de enviar, obtendremos el siguiente resultado (Ver la respuesta usando
Después de enviar, obtendremos el siguiente resultado (Ver respuesta usando GET consulta):

Parte 7: agregando Cisco xRV9000
¿Qué pasa con Juniper, sí, sobre Juniper? ¡Hablemos de Cisco!
He encontrado un xRV9000 versión 7.0.2 (una bestia que necesita 8GB de RAM y 4 núcleos. No está disponible públicamente, así que contáctenme en ) — lo ejecutaremos.
Iniciar el contenedor
El proceso de creación de un contenedor Docker no difiere prácticamente del de Juniper. De manera similar, colocamos el archivo .qcow2 con el enrutador en el directorio que corresponde a su nombre, (en este caso xrv9k) y ejecutamos el comando make docker-image.
Después de unos minutos vemos que la imagen se ha creado:
ubuntu:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-xrv9k 7.0.2 54debc7973fc hace 4 horas 1.7GB
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c hace 4 semanas 4.43GB
debian stretch 614bb74b620e hace 7 semanas 101MBProcedemos a iniciar el contenedor:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcDespués de un tiempo verificamos que el contenedor se inició:
ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
058c5ecddae3 54debc7973fc "\/launch.py" hace 4 horas Arriba 4 horas (saludable) 22\/tcp, 830\/tcp, 5000-5003\/tcp, 10000-10099\/tcp, 161\/udp xrv01Conectamos a través de ssh:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Contraseña:
RP\/0\/RP0\/CPU0:ios#show version
Lun Jul 6 12:19:28.036 UTC
Cisco IOS XR Software, Version 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.
Información de construcción:
Construido por : ahoang
Construido el : Vie Mar 13 22:27:54 PDT 2020
Anfitrión de construcción : iox-ucs-029
Área de trabajo : \/auto\/srcarchive15\/prod\/7.0.2\/xrv9k\/ws
Versión : 7.0.2
Ubicación : \/opt\/cisco\/XR\/packages\
Label : 7.0.2
cisco IOS-XRv 9000 () procesador
El tiempo de actividad del sistema es 3 horas 22 minutosConectamos el enrutador a OpenDaylight
La adición se realiza de manera muy similar a la imagen vMX. Solo hay que cambiar los nombres.
PUT solicitud:

Después de un tiempo, llamamos GET consulta, para verificar que todo esté conectado:

Cambiando la configuración
Configuraremos la siguiente configuración:
!
enrutador ospf LAB
mpls ldp auto-config
!Crearemos POST solicitud:
- Cadena de solicitud:
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 - Cuerpo de la solicitud (pestaña Cuerpo):
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin. - En la pestaña Encabezados es necesario agregar dos encabezados:
- Content-Type application/json
- Después de enviar, obtendremos el siguiente resultado (Ver la respuesta usando
Después de su ejecución, deberíamos obtener el estado "204 No Content".
Verificamos qué obtuvimos.
Para esto crearemos GET solicitud:
- Cadena de solicitud:
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 - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Después de ejecutar, deberíamos ver lo siguiente:

Para eliminar la configuración utilizamos ELIMINAR:
- Cadena de solicitud:
ELIMINAR 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 - En la pestaña Autorización debes establecer el parámetro
Basic Authy el login/contraseña: admin/admin.
Conclusión
Como habrán notado, los procedimientos para conectar dispositivos Cisco y Juniper a OpenDaylight son bastante similares, lo que abre un amplio campo para la creatividad. Desde la gestión de configuraciones de todos los componentes de la red hasta la creación de políticas de red personalizadas.
En este tutorial, he presentado ejemplos sencillos de cómo interactuar con el hardware de red utilizando OpenDaylight. Sin duda, las solicitudes de los ejemplos presentados pueden ser mucho más complejas, permitiendo configurar servicios enteros con un solo clic; todo está limitado únicamente por su imaginación.
Continuará...
P.D.
Si ya conoces todo esto o, por el contrario, has pasado y te ha encantado ODL, te recomiendo que mires hacia el desarrollo de aplicaciones en el controlador ODL. Puedes comenzar. .
¡Éxitos en tus experimentos!
Lista de literatura
- / Brian Linkletter
- Cookbook de OpenDaylight / Mathieu Lemay, Alexis de Talhouet, Et al
- Programabilidad de Redes con YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Aprendiendo XML, Segunda Edición / Erik T. Ray
- DevOps Efectivo / Jennifer Davis, Ryn Daniels
Fuente: habr.com

