
În acest articol, vă voi arăta cum să configurați OpenDaylight pentru a lucra cu echipamentele de rețea, și voi demonstra cum, folosind Postman și comenzi simple RESTCONF se poate gestiona acest echipament. Nu vom lucra cu hardware-ul, ci vom crea laboratoare virtuale mici cu un singur router folosind Vrnetlab deasupra Ubuntu 20.04 LTS.
Voi demonstra configurația pe un exemplu de router Juniper vMX 20.1R1.11, iar apoi vom compara această configurație cu cea a Cisco xRV9000 7.0.2.
Cuprins
- Cunoștințe necesare
- Partea 1: discutăm pe scurt despre OpenDaylight (în continuare ODL), Postman și Vrnetlab și de ce avem nevoie de ele
- Partea 2: descrierea laboratorului virtual
- Partea 3: configurăm OpenDaylight
- Partea 4: configurăm Vrnetlab
- Partea 5: folosind Postman connectăm routerul virtual (Juniper vMX) la ODL
- Partea 6: obținem și modificăm configurația routerului folosind Postman și ODL
- Partea 7: adăugăm Cisco xRV9000
- Concluzie
- P.S.
- Lista de literatură
Cunoștințe necesare
Pentru a evita ca articolul să devină o pledoarie, am omis unele detalii tehnice (cu linkuri către literatură unde se poate citi despre acestea).
De aceea, vă propun teme care ar fi bine să le cunoașteți (dar nu sunt absolut necesare) înainte de lectură:
- ,
- /
Partea 1: puțină teorie

- Platformă SDN deschisă pentru management și automatizare a diverselor rețele, susținută de al Linux Foundation
- Java inside
- Bazată pe Model-Driven Service Abstraction Level (MD-SAL)
- Folosește modele YANG pentru a genera automat API RESTCONF pentru dispozitivele de rețea
Modulul principal pentru gestionarea rețelei. Precis prin el vom comunica cu dispozitivele conectate. Este gestionat prin propria sa API.
Pentru mai multe detalii despre OpenDaylight, puteți citi .

- Instrument pentru testarea API-ului
- Interfață simplă și ușor de folosit
În cazul nostru, este relevant ca un mijloc de a trimite cereri REST către API-ul OpenDaylight. Dacă doriți, puteți trimite cereri manual, dar în Postman totul arată foarte clar și se potrivește perfect pentru scopurile noastre.
Pentru cei care doresc să se aprofundeze: există multe materiale didactice scrise despre el ().

- Instrument pentru desfășurarea routerelor virtuale în Docker
- Susține: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR etc.
- Open Source
Un instrument foarte interesant, dar puțin cunoscut. În cazul nostru, cu ajutorul său vom rula Juniper vMX și Cisco xRV9000 pe o Ubuntu 20.04 LTS obișnuită.
Puteți citi mai multe despre el pe .
Partea 2: muncă de laborator
În cadrul acestui tutorial, vom configura următorul sistem:

Cum funcționează
- Juniper vMX care se va desfășura în Docker container (prin mijloace Vrnetlab) și funcționează ca un router virtual obișnuit.
- ODL conectat la router și permite gestionarea acestuia.
- Postman rulând pe o mașină separată, prin care trimitem comenzi ODL: pentru conectarea/dezactivarea routerului, modificarea configurației etc.
Comentariul pentru dispozitivul sistemului
Juniper vMX și ODL cere destul de multe resurse pentru funcționarea sa stabilă. Doar vMX solicită 6 Gb de memorie RAM și 4 nuclee. Prin urmare, s-a decis să mutăm toți „greii” pe o mașină separată (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Routerul, desigur, nu „zboară” pe ea, dar pentru experimentele mici performanța este suficientă.
Partea 3: configurăm OpenDaylight

Versiunea actuală ODL la momentul redactării acestui articol — Magnesium SR1
1) Instalăm Java OpenJDK 11 (pentru detalii suplimentare despre instalare )
ubuntu:~$ sudo apt install default-jdk2) Găsim și descărcăm cea mai recentă versiune ODL
3) Dezarhivăm arhiva descărcată
4) Trecem în directorul obținut
5) Rulăm .\/bin\/karaf
În acest pas ODL ar trebui să pornească și ne vom afla în consolă (pentru acces extern se folosește portul 8181, de care ne vom folosi ulterior).
Apoi instalăm ODL Features, destinate lucrului cu protocoale NETCONF și RESTCONF. Pentru aceasta, în consolă ODL executăm:
opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-allAici, cea mai simplă configurare ODL este finalizată. (Mai multe detalii pot fi citite ).
Partea 4: configurăm Vrnetlab

Pregătirea sistemului
Înainte de instalare Vrnetlab este necesar să instalăm pachetele necesare pentru funcționarea sa. Cum ar fi , , :
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 -
ubunt:~$ sudo add-apt-repository
"deb [arch=amd64] https:\/\/download.docker.com\/linux\/ubuntu
$(lsb_release -cs)
stable"
ubunt:~$ sudo apt update
ubuntu:~$ sudo apt install -y docker-ce docker-ce-cli containerd.ioInstalarea Vrnetlab
Pentru instalare Vrnetlab clonăm repository-ul corespunzător de pe github:
ubuntu:~$ cd ~
ubunt:~$ git clone https:\/\/github.com\/plajjan\/vrnetlab.gitTrecem în directorul vrnetlab:
ubuntu:~$ cd ~\/vrnetlabAici puteți vedea toate scripturile necesare pentru a rula. Rețineți că pentru fiecare tip de router a fost creat un director corespunzător:
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 xrv9kCreăm imaginea routerului
Fiecare router suportat Vrnetlab, are procedura sa unică de configurare. În cazul Juniper vMX este suficient să plasăm arhiva .tgz cu routerul (o putem descărca de la ) în directorul vmx și să executăm comanda make:
ubuntu:~/vrnetlab/vmx
ubuntu:~$ # Copiem în acest director arhiva .tgz cu routerul
ubuntu:~$ sudo makeCrearea imaginii vMX va dura aproximativ 10-20 de minute. E timpul perfect să prepari o cafea!
De ce durează atât de mult, ne vei întreba?
Traducere autorului la această întrebare:
"Aceasta se datorează faptului că la prima pornire VCP (Control Plane) citește fișierul de configurație, care determină dacă va funcționa ca VRR VCP în vMX. Anterior, această pornire se realiza în timpul pornirii Docker, dar asta însemna că VCP era întotdeauna repornit o dată înainte ca routerul virtual să devină disponibil, ceea ce ducea la un timp de încărcare lung (aproximativ 5 minute). Acum prima pornire a VCP se face în timpul construirii imaginii Docker, și deoarece construcția Docker nu poate fi pornită cu parametrul —privileged, asta înseamnă că qemu funcționează fără accelerație hardware KVM și, astfel, construcția durează foarte mult timp. În timpul acestui proces sunt generate multe jurnale, așa că, măcar, vei putea vedea ce se întâmplă. Cred că construcția de lungă durată nu este atât de înfricoșătoare, deoarece imaginea o creăm o dată, iar apoi o pornim de multe ori."
După aceea, putem vedea imaginea routerului nostru în Docker:
ubuntu:~$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c acum 3 săptămâni 4.43GB
debian stretch 614bb74b620e acum 7 săptămâni 101MBPornim containerul vr-vmx
Îl pornim cu comanda:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cApoi putem vedea informațiile despre containerele active:
ubuntu:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120f882c8712 b1b2369b453c "/launch.py" acum 2 minute Active 2 minute (nesănătos) 22/tcp, 830/tcp, 5000/tcp, 10000-10099/tcp, 161/udp jun01Ne conectăm la router
Adresa IP a interfeței de rețea a routerului poate fi obținută cu următoarea comandă:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2În mod implicit, Vrnetlab creează la router utilizatorului vrnetlab/VR-netlab9.
Conectăm folosind ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
Identitatea gazdelor '172.17.0.2 (172.17.0.2)' nu poate fi stabilită.
Amprenta cheii ECDSA este SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Ești sigur că vrei să continui conectarea (da/nu/[amprentă])? da
Avertisment: '172.17.0.2' (ECDSA) a fost adăugată permanent la lista gazdelor cunoscute.
Parolă:
--- JUNOS 20.1R1.11 Kernel 64-bit JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Model: vmx
Junos: 20.1R1.11La aceasta, configurarea routerului este completă.
Recomandările pentru instalare pentru routerele diferitelor mărci pot fi găsite pe în directoarele corespunzătoare.
Partea 5: Postman - conectăm routerul la OpenDaylight
Instalarea Postman
Pentru instalare, este suficient să descărcați aplicația .
Conectarea routerului la ODL
Să creăm PUT cerere:

- Linia de cerere:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Corpul cererii (tab-ul Body):
<node xmlns="urn:TBD:params:xml:ns:yang:network-topology"> <node-id>jun01</node-id> <host xmlns="urn:opendaylight:netconf-node-topology">172.17.0.2</host> <port xmlns="urn:opendaylight:netconf-node-topology">22</port> <username xmlns="urn:opendaylight:netconf-node-topology">vrnetlab</username> <password xmlns="urn:opendaylight:netconf-node-topology">VR-netlab9</password> <tcp-only xmlns="urn:opendaylight:netconf-node-topology">false</tcp-only> <schema-cache-directory xmlns="urn:opendaylight:netconf-node-topology">jun01_cache</schema-cache-directory> </node> - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin. Acest lucru este necesar pentru accesul la ODL:

- În tab-ul Headers, trebuie să adăugați două antete:
- Accept application/xml
- Content-Type application/xml
Cererea noastră este formatată. Trimitem. Dacă totul a fost configurat corect, ar trebui să primim statusul "201 Created":
![]()
Ce face această cerere?
Creăm un node în interior ODL cu parametrii routerului real, la care dorim să putem avea acces.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Acestea sunt spațiile de nume interne XML (namespace XML) pentru ODL conform cărora creează node.
Apoi, în mod corespunzător, numele routerului este node-id, adresa routerului - host și așa mai departe.
Cea mai interesantă linie - ultima. Schema-cache-directory creează un director, în care se descarcă toate fișierele YANG Schema al routerului conectat. Le puteți găsi în $ODL_ROOT/cache/jun01_cache.
Verificăm conexiunea routerului
Să creăm metoda GET. cerere:
- Linia de cerere:
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/ - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
Trimitem. Trebuie să obținem statusul "200 OK" și lista tuturor dispozitivelor acceptate. YANG Schema:

Comentariu: Pentru a vedea ultimele modificări, în cazul meu a fost necesar să aștept aproximativ 10 minute după execuție. PUT, până când toate schema YANG se vor descărca pe ODL. Până în acel moment, executând această metoda GET. solicitare, va fi afișat următorul mesaj:

Ștergem routerul
Să creăm DELETE cerere:
- Linia de cerere:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
Partea 6: Modificăm configurația routerului
Obținem configurația
Să creăm metoda GET. cerere:
- Linia de cerere:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
Trimitem. Ar trebui să primim status "200 OK" și configurația routerului:

Creăm configurația
Ca exemplu, vom crea următoarea configurație și o vom modifica:
protocols {
bgp {
disable;
shutdown;
}
}Să creăm POST cerere:
- Linia de cerere:
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 - Corpul cererii (tab-ul Body):
- În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin. - În tab-ul Headers, trebuie să adăugați două antete:
- Accept application/xml
- Content-Type application/xml
După trimitere, ar trebui să primim status "204 No Content"
Pentru a verifica dacă configurația s-a schimbat, putem folosi solicitarea anterioară. Dar pentru exemplu, vom crea încă una care ne va afișa informațiile doar despre protocoalele configurate pe router.
Să creăm metoda GET. cerere:
- Linia de cerere:
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 - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
După execuția solicitării, vom vedea următoarele:

Modificăm configurația
Vom modifica informațiile despre protocolul BGP. După acțiunile noastre, va arăta astfel:
protocols {
bgp {
disable;
}
}Să creăm PUT cerere:
- Linia de cerere:
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 - Corpul cererii (tab-ul Body):
- În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin. - În tab-ul Headers, trebuie să adăugați două antete:
- Accept application/xml
- Content-Type application/xml
Folosind solicitarea anterioară, vedem modificările: metoda GET. Ștergem configurația

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
Să creăm DELETE cerere:
- Linia de cerere:
din solicitarea cu informații despre protocoale, vom vedea următoarele: - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
Când apelăm metoda GET. Pentru a modifica configurația, nu este obligatoriu să trimitem corpul solicitării în format

Adăugare:
. Acest lucru se poate face și în format XMLPentru aceasta, de exemplu, în solicitarea JSON.
de modificare a configurației vom schimba corpul solicitării în: PUT { "junos-conf-protocols:protocols": { "bgp": { "description" : "Changed in postman" } } }
Nu uitați să schimbați în tab-ul Headers anteturile în:Accept application/json
- Content-Type application/json
- După trimitere, vom primi următorul rezultat (Răspunsul se verifică folosind
După trimitere, vom obține următorul rezultat (Răspunsul îl verificăm folosind metoda GET. cerere):

Partea 7: adăugăm Cisco xRV9000
De ce vorbim atât de mult despre Juniper? Haideți să discutăm despre Cisco!
Am găsit xRV9000 versiunea 7.0.2 (bestie care necesită 8Gb RAM și 4 nuclee. Nu este disponibil public, așa că contactați ) — pe acesta îl vom lansa.
Pornirea containerului
Procesul de creare a unui container Docker este aproape identic cu cel de la Juniper. Similar, plasăm fișierul .qcow2 cu routerul în directorul corespunzător numelui său (în acest caz xrv9k) și executăm comanda make docker-image.
După câteva minute vedem că imaginea a fost creată:
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 101MBLansăm containerul:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcDupă un timp, verificăm că containerul a fost lansat:
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 xrv01Ne conectăm prin ssh:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Parolă:
RP\/0\/RP0\/CPU0:ios#show version
Luni, 6 Iulie 12:19:28.036 UTC
Cisco IOS XR Software, Versiune 7.0.2
Drepturile de autor (c) 2013-2020 de către Cisco Systems, Inc.
Informații despre construcție:
Construit De : ahoang
Construit Pe : vin, 13 Mar 22:27:54 PDT 2020
Gazdă construită : iox-ucs-029
Spațiu de lucru : \/auto\/srcarchive15\/prod\/7.0.2\/xrv9k\/ws
Versiune : 7.0.2
Locație : \/opt\/cisco\/XR\/packages\/
Eticheta : 7.0.2
cisco IOS-XRv 9000 () procesor
Timp de funcționare al sistemului este 3 ore 22 minuteConectăm routerul la OpenDaylight
Adăugarea se face exact în același mod ca și cu imaginea vMX. Trebuie doar să schimbăm numele.
PUT cerere:

După un timp, apelăm metoda GET. cererea, pentru a verifica că totul s-a conectat:

Modificăm configurația
Să configurăm următoarea configurație:
!
router ospf LAB
mpls ldp auto-config
!Să creăm POST cerere:
- Linia de cerere:
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 - Corpul cererii (tab-ul Body):
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin. - În tab-ul Headers, trebuie să adăugați două antete:
- Content-Type application/json
- După trimitere, vom primi următorul rezultat (Răspunsul se verifică folosind
După executarea acesteia ar trebui să primim statutul "204 No Content".
Să verificăm ce am obținut.
Pentru aceasta, vom crea metoda GET. cerere:
- Linia de cerere:
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 - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
După executare, ar trebui să vedem următoarele:

Pentru a elimina configurația, folosim DELETE:
- Linia de cerere:
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 - În tab-ul Authorization trebuie să setați parametrul
Basic Authși utilizator/parolă: admin/admin.
Concluzie
După cum ați observat, procedurile de conectare Cisco și Juniper la OpenDaylight sunt similare - acest lucru deschide un spațiu destul de larg pentru creativitate. Începând cu gestionarea configurațiilor tuturor componentelor rețelei și terminând cu crearea propriilor politici de rețea.
În acest tutorial, am prezentat cele mai simple exemple despre cum se poate interacționa cu echipamentele de rețea prin OpenDaylight. Fără îndoială, cererile din exemplele prezentate pot deveni mult mai complexe, configurând întregi servicii cu un singur click - totul este limitat doar de imaginația dumneavoastră.
Continuarea urmează...
P.S.
Dacă cumva știți deja toate acestea sau, dimpotrivă, ați parcurs și vă pasionează ODL, vă recomand să priviți spre dezvoltarea aplicațiilor pe controllerul ODL. Puteți începe cu .
Experimente reușite!
Lista de literatură
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, Et al
- Programabilitatea rețelei cu YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- Învățând XML, Ediția a doua / Erik T. Ray
- DevOps eficient / Jennifer Davis, Ryn Daniels
Sursa: habr.com

