
In questo articolo parlerò di come configurare OpenDaylight per lavorare con l'hardware di rete, e mostrerò come attraverso Postman e semplici RESTCONF richieste possiamo gestire questo hardware. Non lavoreremo con il ferro, ma anziché questo, installeremo piccoli laboratori virtuali con un unico router grazie a Vrnetlab sopra Ubuntu 20.04 LTS.
Mostrerò la configurazione in dettaglio prima utilizzando come esempio il router Juniper vMX 20.1R1.11, e poi confronteremo questa configurazione con quella di Cisco xRV9000 7.0.2.
Contenuto
- Competenze necessarie
- Parte 1: discuti brevemente OpenDaylight (da qui in avanti ODL), Postman e Vrnetlab e perché sono necessarie
- Parte 2: descrizione del laboratorio virtuale
- Parte 3: configurazione OpenDaylight
- Parte 4: configurazione Vrnetlab
- Parte 5: utilizzando Postman colleghiamo il router virtuale (Juniper vMX) a ODL
- Parte 6: otteniamo e modifichiamo la configurazione del router tramite Postman e ODL
- Parte 7: aggiungiamo Cisco xRV9000
- Conclusione
- P.S.
- Elenco delle fonti
Competenze necessarie
Affinché l'articolo non diventi un poema epico, ho omesso alcuni dettagli tecnici (con i riferimenti alla letteratura dove puoi leggerne).
Pertanto, ti propongo argomenti che sarebbe bene (ma non è obbligatorio) conoscere prima di leggere:
- ,
- /
Parte 1: un po' di teoria

- Piattaforma SDN aperta per la gestione e l'automazione di varie reti, supportata da Linux Foundation
- Java inside
- Basato su Model-Driven Service Abstraction Level (MD-SAL)
- Utilizza modelli YANG per creare automaticamente l'API RESTCONF dei dispositivi di rete
Modulo principale per la gestione della rete. È attraverso di esso che comunicheremo con i dispositivi connessi. È gestito tramite la propria API.
Puoi leggere maggiori dettagli su OpenDaylight .

- Strumento per il test delle API
- Interfaccia semplice e intuitiva
In questo caso ci interessa come strumento per inviare richieste REST all'API di OpenDaylight. Certo, è possibile inviare richieste manualmente, ma in Postman tutto appare molto chiaro e si adatta perfettamente ai nostri scopi.
Per chi volesse approfondire: sono stati scritti molti materiali didattici su questo tema ().

- Strumento per il dispiegamento di router virtuali in Docker
- Supporta: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR e altri.
- Open Source
Strumento molto interessante ma poco conosciuto. In questo caso lo utilizzeremo per avviare Juniper vMX e Cisco xRV9000 su una normale Ubuntu 20.04 LTS.
Puoi leggere ulteriori informazioni su di esso su .
Parte 2: lavoro di laboratorio
In questo tutorial configuraremo il seguente sistema:

Come funziona
- Juniper vMX viene creato in Docker un container (utilizzando Vrnetlab) e funziona come un comune router virtuale.
- ODL collegato al router e consente di gestirlo.
- Postman eseguito su una macchina separata e attraverso di esso inviamo comandi ODL: per connettere/disconnettere un router, modificare la configurazione, ecc.
Commento sul dispositivo del sistema
Juniper vMX e ODL richiedono molte risorse per funzionare stabilmente. Solo il vMX richiede 6 Gb di RAM e 4 core. Pertanto, è stata presa la decisione di spostare tutti i "pesanti" su una macchina separata (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Il router, ovviamente, non "vola" su di esso, ma per piccoli esperimenti le prestazioni sono sufficienti.
Parte 3: configurazione di OpenDaylight

La versione attuale di ODL al momento della scrittura dell'articolo è: Magnesium SR1
1) Installiamo Java OpenJDK 11 (per istruzioni più dettagliate sull'installazione )
ubuntu:~$ sudo apt install default-jdk2) Troviamo e scarichiamo l'ultima build ODL
3) Estraiamo l'archivio scaricato
4) Ci spostiamo nella directory creata
5) Avviamo .\/bin\/karaf
A questo punto ODL dovrebbe avviarsi e ci troveremo nella console (Per l'accesso esterno viene utilizzata la porta 8181, che utilizzeremo successivamente).
Ora installiamo ODL Features, progettate per lavorare con i protocolli NETCONF e RESTCONF. A questo scopo, nella console ODL eseguiamo:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allA questo punto la configurazione più semplice ODL è completata. (Per maggiori dettagli, si può leggere ).
Parte 4: configurazione di Vrnetlab

Preparazione del sistema
Prima di installare Vrnetlab è necessario installare i pacchetti richiesti per il suo funzionamento. Come ad esempio , , :
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.ioInstallazione di Vrnetlab
Per l'installazione Vrnetlab cloniamo il repository corrispondente da github:
ubuntu:~$ cd ~
ubunt:~$ git clone https:\/\/github.com\/plajjan\/vrnetlab.gitAccediamo alla directory vrnetlab:
ubuntu:~$ cd ~\/vrnetlabQui puoi vedere tutti gli script necessari per l'esecuzione. Nota che per ogni tipo di router è stata creata una directory corrispondente:
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 xrv9kCreiamo l'image del router
Ogni router supportato Vrnetlab, ha la sua procedura di configurazione unica. Nel caso Juniper vMX basta caricare l'archivio .tgz con il router (puoi scaricarlo da ) nella directory vmx ed eseguire il comando make:
ubuntu:~$ cd ~/vrnetlab/vmx
ubuntu:~$ # Copiamo in questa directory l'archivio .tgz con il router
ubuntu:~$ sudo makeLa costruzione dell'immagine vMX richiederà circa 10-20 minuti. È il momento giusto per preparare un caffè!
Perché ci vuole così tanto, vi chiederete?
Traduzione dell'autore a questa domanda:
"Questo è dovuto al fatto che, al primo avvio, VCP (Control Plane) legge il file di configurazione, che determina se funzionerà come VCP VRR in vMX. In precedenza, questo avvio avveniva durante l'avvio di Docker, ma ciò significava che VCP veniva sempre riavviato una volta prima che il router virtuale fosse disponibile, il che portava a tempi di avvio lunghi (circa 5 minuti). Ora il primo avvio di VCP avviene durante la costruzione dell'immagine Docker, e poiché la costruzione Docker non può essere eseguita con l'opzione --privileged, questo significa che qemu opera senza accelerazione hardware KVM e, quindi, la costruzione richiede molto tempo. Durante questo processo vengono emessi molti log, quindi, almeno, potrai vedere cosa sta succedendo. Non penso che una costruzione lunga sia così spaventosa, perché creiamo l'immagine una sola volta e la avviamo molte volte."
Dopo, potremo vedere l'immagine del nostro router in 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 101MBAvviamo il container vr-vmx
Lo avviamo con il comando:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cPoi possiamo vedere le informazioni sui container attivi:
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 jun01Colleghiamoci al router
L'indirizzo IP dell'interfaccia di rete del router può essere ottenuto con il seguente comando:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Per impostazione predefinita, Vrnetlab crea per il router un utente vrnetlab/VR-netlab9.
Connettiamoci usando ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
L'autenticità dell'host '172.17.0.2 (172.17.0.2)' non può essere stabilita.
La fingerprint della chiave ECDSA è SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Sei sicuro di voler continuare a connetterti (sì/no/[fingerprint])? sì
Attenzione: aggiunto permanentemente '172.17.0.2' (ECDSA) all'elenco degli host noti.
Password:
--- JUNOS 20.1R1.11 Kernel 64-bit JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modello: vmx
Junos: 20.1R1.11A questo punto, la configurazione del router è completata.
Le raccomandazioni per l'installazione di router di diversi fornitori possono essere trovate su nelle rispettive directory.
Parte 5: Postman - colleghiamo il router a OpenDaylight
Installazione di Postman
Per installarlo, basta scaricare l'applicazione .
Collegamento del router a ODL
Creiamo un richiesta PUT: Stringa di richiesta:

- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
Corpo della richiesta (scheda Body): - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
Nella scheda Autenticazione è necessario impostare il parametro - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:Nella scheda Intestazioni è necessario aggiungere due intestazioni:

- Accept application/xml
- Content-Type application/xml
- La nostra richiesta è stata formata. Inviamo. Se tutto è stato configurato correttamente, ci dovrebbe tornare lo stato "201 Created":
Cosa fa questa richiesta?
![]()
Stiamo creando un node all'interno
con i parametri del router reale a cui vogliamo accedere. ODL xmlns="urn:TBD:params:xml:ns:yang:network-topology" xmlns="urn:opendaylight:netconf-node-topology"
Questi sono gli spazi dei nomi interniXML namespace XML () in base ai quali viene creato il node.Successivamente, di conseguenza, il nome del router è ODL node-id
, l'indirizzo del router è e così via.La riga più interessante è l'ultima. host Schema-cache-directory
crea una directory in cui vengono scaricati tutti i file YANG Schema del router collegato. Puoi trovarli in $ODL_ROOT/cache/jun01_cache Verifichiamo la connessione del router GET.
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
Creiamo un e username/password: admin/admin. Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Invio in corso. Dobbiamo ricevere lo stato "200 OK" e l'elenco di tutti i dispositivi supportati. $ODL_ROOT/cache/jun01_cache:

Commento: Per vedere l'ultima modifica, nel mio caso è stato necessario attendere circa 10 minuti dopo l'esecuzione. richiesta PUT:, mentre tutto YANG schema verrà estratto su ODL. Fino a quel momento, durante l'esecuzione di questa e username/password: admin/admin. richiesta verrà restituito quanto segue:

Eliminiamo il router
Creiamo un DELETE Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Parte 6: Modifichiamo la configurazione del router
Otteniamo la configurazione
Creiamo un e username/password: admin/admin. Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Invio in corso. Dobbiamo ricevere lo stato "200 OK" e la configurazione del router:

Creiamo una configurazione
Come esempio, creiamo la seguente configurazione e modifichiamola:
protocols {
bgp {
disable;
shutdown;
}
}Creiamo un POST Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
- Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin. - Accept application/xml
- Content-Type application/xml
- La nostra richiesta è stata formata. Inviamo. Se tutto è stato configurato correttamente, ci dovrebbe tornare lo stato "201 Created":
Dopo l'invio, dobbiamo ricevere lo stato "204 No Content"
Per verificare che la configurazione sia cambiata, possiamo utilizzare la richiesta precedente. Ma per esempio creeremo un'altra richiesta che ci mostrerà informazioni solo sui protocolli configurati sul router.
Creiamo un e username/password: admin/admin. Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Dopo l'esecuzione della richiesta, vedremo quanto segue:

Modifichiamo la configurazione
Modificheremo le informazioni sul protocollo BGP. Dopo le nostre azioni, apparirà come segue:
protocols {
bgp {
disable;
}
}Creiamo un richiesta PUT: Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
- Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin. - Accept application/xml
- Content-Type application/xml
- La nostra richiesta è stata formata. Inviamo. Se tutto è stato configurato correttamente, ci dovrebbe tornare lo stato "201 Created":
Utilizzando la richiesta precedente, vediamo le modifiche: e username/password: admin/admin. Eliminiamo la configurazione

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
Creiamo un DELETE Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
Quando richiamiamo - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
la richiesta con informazioni sui protocolli, vedremo quanto segue: e username/password: admin/admin. Per modificare la configurazione, non è necessario inviare il corpo della richiesta in formato

Supplemento:
. Questo può essere fatto anche in formato XMLPer farlo, ad esempio, nella richiesta JSON.
modifica della configurazione sostituiamo il corpo della richiesta con: richiesta PUT: { "junos-conf-protocols:protocols": { "bgp": { "description" : "Modificato in Postman" } } }
{
"junos-conf-protocols:protocols": {
"bgp": {
"description" : "Cambiato in postman"
}
}
}Non dimenticate di cambiare gli header nella scheda Headers in:
- Accept application/json
- Content-Type application/json
Dopo l'invio riceveremo il seguente risultato (Risposta da vedere utilizzando e username/password: admin/admin. richiesta):

Parte 7: aggiungiamo Cisco xRV9000
Cosa sappiamo tutti di Juniper, sì di Juniper? Parliamo di Cisco!
Ho trovato un xRV9000 versione 7.0.2 (bestia che richiede 8 Gb di RAM e 4 core. Non è disponibile pubblicamente, quindi contattate ) — lo avvieremo.
Avvio del contenitore
Il processo di creazione del contenitore Docker è praticamente identico a quello di Juniper. In modo analogo, carichiamo il file .qcow2 con il router nella directory corrispondente al suo nome, (in questo caso xrv9k) ed eseguiamo il comando make docker-image.
Dopo alcuni minuti vediamo che l'immagine è stata creata:
ubuntu:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-xrv9k 7.0.2 54debc7973fc 4 hours ago 1.7GB
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c 4 weeks ago 4.43GB
debian stretch 614bb74b620e 7 weeks ago 101MBProcediamo ad avviare il contenitore:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcDopo un po' controlliamo che il contenitore sia stato avviato:
ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
058c5ecddae3 54debc7973fc "/launch.py" 4 hours ago Up 4 hours (healthy) 22/tcp, 830/tcp, 5000-5003/tcp, 10000-10099/tcp, 161/udp xrv01Ci connettiamo tramite ssh:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Password:
RP/0/RP0/CPU0:ios#show version
Lun Lug 6 12:19:28.036 UTC
Cisco IOS XR Software, Version 7.0.2
Copyright (c) 2013-2020 by Cisco Systems, Inc.
Build Information:
Built By : ahoang
Built On : Fri Mar 13 22:27:54 PDT 2020
Built Host : iox-ucs-029
Workspace : /auto/srcarchive15/prod/7.0.2/xrv9k/ws
Version : 7.0.2
Location : /opt/cisco/XR/packages/
Label : 7.0.2
cisco IOS-XRv 9000 () processor
System uptime is 3 hours 22 minutesColleghiamo il router a OpenDaylight
L'aggiunta avviene in modo assolutamente identico a quella dell'immagine vMX. È necessario solo cambiare i nomi.
richiesta PUT: Stringa di richiesta:

Dopo un po' chiamiamo e username/password: admin/admin. la richiesta per verificare che tutto sia collegato:

Modifichiamo la configurazione
Configuriamo la seguente configurazione:
!
router ospf LAB
mpls ldp auto-config
!Creiamo un POST Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin. - Accept application/xml
- Accept application/json
- Content-Type application/json
Dopo la sua esecuzione dovremmo ottenere lo stato "204 No Content".
Controlliamo cosa abbiamo ottenuto.
Per fare ciò creiamo e username/password: admin/admin. Stringa di richiesta:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Dopo l'esecuzione dovresti vedere quanto segue:

Per rimuovere la configurazione utilizziamo DELETE:
- PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01
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 - Basic Auth
e username/password: admin/admin. Questo è necessario per accedere a ODL:e login/password: admin/admin.
Conclusione
In totale, come avrai notato, le procedure di connessione per Cisco e Juniper a OpenDaylight non differiscono — questo apre un ampio margine di creatività. Dalla gestione delle configurazioni di tutti i componenti della rete, fino alla creazione di politiche di rete personalizzate.
In questo tutorial ho fornito esempi semplici di come interagire con l'hardware di rete tramite OpenDaylight. Senza dubbio, le richieste degli esempi forniti possono diventare molto più complesse e configurare interi servizi con un semplice clic del mouse — tutto è limitato solo dalla tua fantasia.
Continua…
P.S.
Se per caso sai già tutto questo o, al contrario, hai già esplorato e ami ODL, ti consiglio di dare un'occhiata allo sviluppo di applicazioni sul controller ODL. Puoi iniziare .
Buoni esperimenti!
Bibliografia
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, Et al
- Network Programmability with YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Learning XML, Second Edition / Erik T. Ray
- Effective DevOps / Jennifer Davis, Ryn Daniels
Fonte: habr.com

