
In diesem Artikel werde ich erklären, wie man einrichtet OpenDaylight um mit Netzwerkausrüstung zu arbeiten, und ich werde zeigen, wie man mit Hilfe von Postman und einfachen RESTCONF Anfragen diese Ausrüstung steuern kann. Wir werden nicht mit Hardware arbeiten, sondern stattdessen kleine virtuelle Labore mit einem einzigen Router mithilfe von Vrnetlab auf Ubuntu 20.04 LTS.
Die detaillierte Konfiguration werde ich zunächst am Beispiel des Routers Juniper vMX 20.1R1.11, und dann vergleichen wir sie mit der Konfiguration von Cisco xRV9000 7.0.2.
Inhalt
- Notwendige Kenntnisse
- Teil 1: kurz besprechen wir OpenDaylight (im Folgenden ODL), Postman und Vrnetlab und warum wir sie benötigen
- Teil 2: Beschreibung des virtuellen Labors
- Teil 3: wir konfigurieren OpenDaylight
- Teil 4: wir konfigurieren Vrnetlab
- Teil 5: mithilfe von Postman verbinden wir den virtuellen Router (Juniper vMX) mit ODL
- Teil 6: wir erhalten und ändern die Konfiguration des Routers mit Hilfe von Postman und ODL
- Teil 7: fügen wir Cisco xRV9000 hinzu
- Fazit
- P.S.
- Literaturliste
Notwendige Kenntnisse
Damit der Artikel nicht zu einer langen Abhandlung wird, habe ich einige technische Einzelheiten weggelassen (mit Verweisen auf die Literatur, wo man darüber lesen kann).
In diesem Zusammenhang schlage ich Ihnen Themen vor, die gut zu wissen wären (aber nicht unbedingt) vor dem Lesen:
- ,
- /
Teil 1: ein wenig Theorie

- Eine offene SDN-Plattform für die Verwaltung und Automatisierung aller Arten von Netzwerken, unterstützt von Linux Foundation
- Java inside
- Basierend auf Model-Driven Service Abstraction Level (MD-SAL)
- Verwendet YANG-Modelle zur automatischen Erstellung von RESTCONF-APIs für Netzwerkgeräte
Das Hauptmodul zur Netzwerkverwaltung. Genau darüber werden wir mit den angeschlossenen Geräten kommunizieren. Wird über die eigene API gesteuert.
Mehr Informationen über OpenDaylight können Sie lesen .

- Ein Tool zum Testen von APIs
- Eine einfache und benutzerfreundliche Oberfläche
In unserem Fall ist es für uns interessant als Mittel zum Senden von REST-Anfragen an die API von OpenDaylight. Man kann natürlich auch Anfragen manuell senden, aber in Postman sieht alles sehr übersichtlich aus und eignet sich am besten für unsere Zwecke.
Für Interessierte: Es gibt viele Lernmaterialien darüber ().

- Ein Tool zum Bereitstellen virtueller Router in Docker
- Unterstützt: Cisco XRv, Juniper vMX, Arista vEOS, Nokia VSR und andere.
- Open Source
Ein sehr interessantes, aber wenig bekanntes Tool. In unserem Fall werden wir damit Juniper vMX und Cisco xRV9000 auf einem gewöhnlichen Ubuntu 20.04 LTS starten.
Mehr darüber kann man lesen auf .
Teil 2: Laborarbeit
Im Rahmen dieses Tutorials werden wir folgende Systeme konfigurieren:

Die DANE-Spezifikation ist in
- Juniper vMX wird in Docker Container (mit Hilfe von Vrnetlab) und funktioniert wie ein ganz normaler virtueller Router.
- ODL mit dem Router verbunden und ermöglicht dessen Verwaltung.
- Postman wird auf einer separaten Maschine ausgeführt und über ihn senden wir Befehle ODL: zur Verbindung/Trennung des Routers, zur Änderung der Konfiguration usw.
Kommentar zum Gerätesystem
Juniper vMX und ODL benötigt ziemlich viele Ressourcen für einen stabilen Betrieb. Allein vMX erfordert 6 GB RAM und 4 Kerne. Daher wurde beschlossen, alle "schweren" Komponenten auf eine separate Maschine auszulagern (Heulett Packard Enterprise MicroServer ProLiant Gen8, Ubuntu 20.04 LTS). Der Router läuft darauf zwar nicht "flüssig", aber für kleine Experimente reicht die Leistung aus.
Teil 3: OpenDaylight konfigurieren

Die aktuelle Version von ODL zum Zeitpunkt des Schreibens des Artikels ist – Magnesium SR1
1) Installieren wir Java OpenJDK 11 (für eine detailliertere Installation )
ubuntu:~$ sudo apt install default-jdk2) Suchen und laden wir die neueste Version herunter ODL
3) Entpacken wir das heruntergeladene Archiv
4) Gehen wir in das erhaltene Verzeichnis
5) Starten wir ./bin/karaf
An dieser Stelle ODL sollte es starten und wir werden in der Konsole sein (Für den externen Zugriff wird Port 8181 verwendet, was wir später nutzen werden).
Dann installieren wir ODL Features, die für die Arbeit mit Protokollen gedacht sind NETCONF und RESTCONF. Dafür führen wir in der Konsole aus: ODL opendaylight-user@root> feature:install odl-netconf-topology odl-restconf-all
Damit ist die einfachste Konfigurationfertig. (Detailliertere Informationen finden Sie ODL Teil 4: Vrnetlab konfigurieren ).
Vor der Installation

Systemvorbereitung
müssen die erforderlichen Pakete für dessen Betrieb installiert werden. Solche wie Vrnetlab sshpass , , :
Installation von Vrnetlabwir klonen das entsprechende Repository von GitHub:
Zur Installation Vrnetlab ubuntu:~$ cd ~ ubuntu:~$ git clone https://github.com/plajjan/vrnetlab.git
vrnetlabWir navigieren in das Verzeichnis ubuntu:~$ cd ~/vrnetlab:
Hier sind alle Skripte zu sehen, die für den Start benötigt werden. Beachten Sie, dass für jeden Routertyp ein entsprechendes Verzeichnis erstellt wurde:Здесь можно увидеть все скрипты, необходимые для запуска. Обратите внимание, что для каждого типа роутера сделана соответствующая директория:
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 xrv9kErstellen eines Router-Images
Jeder unterstützte Router Vrnetlab, hat sein eigenes einzigartiges Konfigurationsverfahren. Im Falle von Juniper vMX müssen wir lediglich das .tgz-Archiv mit dem Router (das können Sie herunterladen von ) in das Verzeichnis vmx verschieben und den Befehl ausführen make:
ubuntu:~$ cd ~\/vrnetlab\/vmx
ubuntu:~$ # Kopieren Sie das .tgz-Archiv mit dem Router in dieses Verzeichnis
ubuntu:~$ sudo makeErstellung des Images vMX dauert etwa 10-20 Minuten. Es ist der perfekte Zeitpunkt, um einen Kaffee zu kochen!
Warum dauert das so lange, fragen Sie sich?
Übersetzung Autors auf diese Frage:
"Das liegt daran, dass beim ersten Start VCP (Control Plane) die Konfigurationsdatei liest, die bestimmt, ob es als VRR VCP im vMX arbeiten wird. Früher wurde dieser Start während des Docker-Starts durchgeführt, was bedeutete, dass VCP immer einmal neu gestartet wurde, bevor der virtuelle Router verfügbar wurde, was zu langen Ladezeiten (ca. 5 Minuten) führte. Jetzt erfolgt der erste Start von VCP während des Docker-Image-Baus, und da der Docker-Bau nicht mit der Option --privileged gestartet werden kann, bedeutet dies, dass qemu ohne Hardwarebeschleunigung KVM arbeitet und die Erstellung daher sehr lange dauert. Während dieses Prozesses werden viele Protokolle ausgegeben, sodass Sie zumindest sehen, was passiert. Ich denke, dass eine lange Erstellung nicht so schlimm ist, weil wir das Image einmal erstellen und es viele Male verwenden."
Nach Abschluss können wir das Image unseres Routers sehen in Docker:
ubuntu:~$ sudo docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab\/vr-vmx 20.1R1.11 b1b2369b453c vor 3 Wochen 4.43GB
debian stretch 614bb74b620e vor 7 Wochen 101MBStarten des vr-vmx Containers
Starten mit dem Befehl:
ubuntu:~$ sudo docker run -d --privileged --name jun01 b1b2369b453cAnschließend können wir die Informationen über die aktiven Container anzeigen:
ubuntu:~$ sudo docker container list
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
120f882c8712 b1b2369b453c "\/launch.py" vor 2 Minuten Läuft seit 2 Minuten (unhealthy) 22\/tcp, 830\/tcp, 5000\/tcp, 10000-10099\/tcp, 161\/udp jun01Verbinden mit dem Router
Die IP-Adresse der Netzwerkschnittstelle des Routers kann mit dem folgenden Befehl erhalten werden:
ubuntu:~$ sudo docker inspect --format '{{.NetworkSettings.IPAddress}}' jun01
172.17.0.2Standardmäßig Vrnetlab erzeugt beim Router des Benutzers vrnetlab/VR-netlab9.
Wir verbinden uns über ssh:
ubuntu:~$ ssh vrnetlab@172.17.0.2
Die Authentizität des Hosts '172.17.0.2 (172.17.0.2)' kann nicht bestätigt werden.
ECDSA-Schlüssel-Fingerprint ist SHA256:g9Sfg/k5qGBTOX96WiCWyoJJO9FxjzXYspRoDPv+C0Y.
Sind Sie sicher, dass Sie die Verbindung fortsetzen möchten (ja/nein/[Fingerprint])? ja
Warnung: '172.17.0.2' (ECDSA) wurde permanent zur Liste der bekannten Hosts hinzugefügt.
Passwort:
--- JUNOS 20.1R1.11 Kernel 64-bit JNPR-11.0-20200219.fb120e7_buil
vrnetlab> show version
Modell: vmx
Junos: 20.1R1.11Damit ist die Konfiguration des Routers abgeschlossen.
Installationstipps für Router verschiedener Anbieter finden Sie unter in den entsprechenden Verzeichnissen.
Teil 5: Postman - Router mit OpenDaylight verbinden
Installation von Postman
Für die Installation genügt es, die Anwendung herunterzuladen .
Anschluss des Routers an ODL
für das Init-System SystemD: PUT Anfrage:

- Anfragestruktur:
PUT http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Anfragetext (Reiter Body):
jun01 172.17.0.2 22 vrnetlab VR-netlab9 false jun01_cache - Im Reiter Authorization muss der Parameter
Basic Authund Benutzername/Passwort: admin/admin angegeben werden. Dies ist erforderlich, um auf ODL zuzugreifen:

- Im Reiter Headers müssen zwei Header hinzugefügt werden:
- Accept application/xml
- Content-Type application/xml
Unsere Anfrage ist formuliert. Wir senden sie ab. Wenn alles richtig konfiguriert war, sollten wir den Status "201 Created" zurückbekommen:
![]()
Was bewirkt diese Anfrage?
Wir erstellen einen Node innerhalb ODL mit den Parametern des echten Routers, auf den wir zugreifen möchten.
xmlns="urn:TBD:params:xml:ns:yang:network-topology"
xmlns="urn:opendaylight:netconf-node-topology"Dies sind interne Namensräume XML (XML-Namespace) gemäß denen es den Node erstellt. ODL Darüber hinaus ist der Name des Routers -
node-id , die Adresse des Routers -usw. host Die interessanteste Zeile ist die letzte.
Schema-cache-directory erstellt ein Verzeichnis, in das alle Dateien YANG-Schema des angeschlossenen Routers heruntergeladen werden. Diese finden Sie unter $ODL_ROOT/cache/jun01_cache Überprüfen wir die Verbindung des Routers.
GET http://10.132.1.202:8181/restconf/operational/network-topology:network-topology/topology/topology-netconf/
für das Init-System SystemD: GET Anfrage:
- Anfragestruktur:
und Benutzername/Passwort: admin/admin. - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Отправляем. Должны получить статус "200 OK" и список всех поддерживаемых устройством des angeschlossenen Routers heruntergeladen werden. Diese finden Sie unter:

Kommentar: Um das Neueste zu sehen, musste ich in meinem Fall etwa 10 Minuten nach der Ausführung warten PUT, bis alles YANG-Schema aufgeladen wird. ODLBis zu diesem Zeitpunkt wird bei der Ausführung dieser GET Anfrage Folgendes ausgegeben:

Router löschen
für das Init-System SystemD: DELETE Anfrage:
- Anfragestruktur:
DELETE http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01 - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Teil 6: Routerkonfiguration ändern
Konfiguration abrufen
für das Init-System SystemD: GET Anfrage:
- Anfragestruktur:
GET http://10.132.1.202:8181/restconf/config/network-topology:network-topology/topology/topology-netconf/node/jun01/yang-ext:mount/ - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Senden. Wir sollten den Status "200 OK" und die Routerkonfiguration erhalten:

Konfiguration erstellen
Als Beispiel erstellen wir die folgende Konfiguration und ändern sie:
protocols {
bgp {
disable;
shutdown;
}
}für das Init-System SystemD: POST Anfrage:
- Anfragestruktur:
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 - Anfragetext (Reiter Body):
- Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten. - Im Reiter Headers müssen zwei Header hinzugefügt werden:
- Accept application/xml
- Content-Type application/xml
Nach dem Senden sollten wir den Status "204 No Content" erhalten.
Um zu überprüfen, ob die Konfiguration geändert wurde, können wir die vorherige Anfrage verwenden. Aber als Beispiel erstellen wir eine weitere, die uns nur Informationen über die auf dem Router konfigurierten Protokolle ausgeben wird.
für das Init-System SystemD: GET Anfrage:
- Anfragestruktur:
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 - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Nach der Ausführung der Anfrage sehen wir Folgendes:

Konfiguration ändern
Wir ändern die Informationen über das BGP-Protokoll. Nach unseren Änderungen wird sie folgendermaßen aussehen:
protocols {
bgp {
disable;
}
}für das Init-System SystemD: PUT Anfrage:
- Anfragestruktur:
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 - Anfragetext (Reiter Body):
- Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten. - Im Reiter Headers müssen zwei Header hinzugefügt werden:
- Accept application/xml
- Content-Type application/xml
Mit der vorherigen GET Anfrage sehen wir die Änderungen:

Konfiguration löschen
für das Init-System SystemD: DELETE Anfrage:
- Anfragestruktur:
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 - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Beim Aufruf von GET Bei der Anfrage mit Informationen zu den Protokollen sehen wir Folgendes:

Zusatz:
Um die Konfiguration zu ändern, ist es nicht erforderlich, den Anfragekörper im Format XMLzu senden. Das kann auch im Format JSON.
gemacht werden. Zum Beispiel ersetzen wir im Anfrage PUT zur Änderung der Konfiguration den Anfragekörper durch:
{
"junos-conf-protocols:protocols": {
"bgp": {
"description" : "In Postman geändert"
}
}
}Vergessen Sie nicht, die Header auf der Registerkarte auf Folgendes zu ändern:
- Accept application/json
- Content-Type application/json
Nach dem Senden erhalten wir folgendes Ergebnis (Antwort überprüfen wir mit GET Anfrage):

Teil 7: Cisco xRV9000 hinzufügen
Was haben wir alle über Juniper gesprochen, ja über Juniper? Lassen Sie uns über Cisco reden!
Ich habe ein xRV9000 in der Version 7.0.2 gefunden (ein Monster, das 8 GB RAM und 4 Kerne benötigt. Es ist nicht öffentlich verfügbar, daher wenden Sie sich an ) — damit werden wir es starten.
Starten eines Containers
Der Prozess zur Erstellung eines Docker-Containers unterscheidet sich kaum von dem bei Juniper. Ebenso legen wir die .qcow2-Datei des Routers in das Verzeichnis ab, das seinem Namen entspricht (in diesem Fall xrv9k) und führen den Befehl aus make docker-image.
Nach ein paar Minuten sehen wir, dass das Image erstellt wurde:
ubuntu:~$ sudo docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
vrnetlab/vr-xrv9k 7.0.2 54debc7973fc vor 4 Stunden 1.7GB
vrnetlab/vr-vmx 20.1R1.11 b1b2369b453c vor 4 Wochen 4.43GB
debian stretch 614bb74b620e vor 7 Wochen 101MBWir starten den Container:
ubuntu:~$ sudo docker run -d --privileged --name xrv01 54debc7973fcNach einiger Zeit sehen wir, dass der Container gestartet wurde:
ubuntu:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
058c5ecddae3 54debc7973fc "/launch.py" vor 4 Stunden 4 Stunden (gesund) 22/tcp, 830/tcp, 5000-5003/tcp, 10000-10099/tcp, 161/udp xrv01Wir verbinden uns per SSH:
ubuntu@ubuntu:~$ ssh vrnetlab@172.17.0.2
Passwort:
RP/0/RP0/CPU0:ios#show version
Mon Jul 6 12:19:28.036 UTC
Cisco IOS XR Software, Version 7.0.2
Copyright (c) 2013-2020 von Cisco Systems, Inc.
Build-Information:
Erstellt von : ahoang
Erstellt am : Fr 13. März 2020 22:27:54 PDT
Erstellungs-Host : iox-ucs-029
Arbeitsbereich : /auto/srcarchive15/prod/7.0.2/xrv9k/ws
Version : 7.0.2
Ort : /opt/cisco/XR/packages/
Label : 7.0.2
cisco IOS-XRv 9000 () Prozessor
Systemlaufzeit beträgt 3 Stunden 22 MinutenWir verbinden den Router mit OpenDaylight
Das Hinzufügen erfolgt ganz ähnlich wie beim vMX-Image. Es müssen nur die Namen geändert werden.
PUT Anfrage:

Nach einer Weile rufen wir GET eine Anfrage auf, um zu überprüfen, ob alles verbunden ist:

Konfiguration ändern
Wir konfigurieren die folgende Einstellung:
!
router ospf LAB
mpls ldp auto-config
!für das Init-System SystemD: POST Anfrage:
- Anfragestruktur:
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 - Anfragetext (Reiter Body):
{ "processes": { "process": [ { "process-name": "LAB", "default-vrf": { "process-scope": { "ldp-auto-config": [ null ] } } } ] } } - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten. - Im Reiter Headers müssen zwei Header hinzugefügt werden:
- Accept application/json
- Content-Type application/json
Nach seiner Ausführung sollten wir den Status "204 No Content" erhalten.
Überprüfen wir, was wir erreicht haben.
Dafür erstellen wir GET Anfrage:
- Anfragestruktur:
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 - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Nach der Ausführung sollten wir Folgendes sehen:

Zur Löschung der Konfiguration verwenden wir DELETE:
- Anfragestruktur:
LÖSCHEN 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 - Im Reiter Authorization muss der Parameter
Basic AuthSenden wir ab. Wir sollten den Status "200 OK" und eine Liste aller vom Gerät unterstützten Geräte erhalten.
Fazit
Wie Sie sehen können, unterscheiden sich die Anschlussverfahren von Cisco und Juniper an OpenDaylight nicht — das eröffnet einen weiten Spielraum für Kreativität. Vom Management der Konfigurationen aller Netzwerkkomponenten bis hin zur Erstellung eigener Netzwerkpolitiken.
In diesem Tutorial habe ich einfachste Beispiele aufgeführt, wie man mit Netzwerkausrüstung über OpenDaylight interagieren kann. Zweifellos können die Anfragen aus den gegebenen Beispielen erheblich komplexer gestaltet werden, und ganze Dienste können mit einem Mausklick konfiguriert werden — alles hängt nur von Ihrer Fantasie ab.
Fortsetzung folgt…
P.S.
Falls Sie bereits alles darüber wissen oder umgekehrt, ODL für sich entdeckt haben, empfehle ich, einen Blick auf die Anwendungsentwicklung mit dem ODL-Controller zu werfen. Der Einstieg ist einfach. .
Viel Erfolg bei Ihren Experimenten!
Literaturverzeichnis
- / Brian Linkletter
- OpenDaylight Cookbook / Mathieu Lemay, Alexis de Talhouet, Et al
- Netzwerkprogrammierung mit YANG / Benoît Claise, Loe Clarke, Jan Lindblad
- XML lernen, zweite Ausgabe / Erik T. Ray
- Effektives DevOps / Jennifer Davis, Ryn Daniels
Quelle: habr.com

