Einführung in VyOS Router

Übersicht über VyOS

VyOs ist eine Open Source Routing-Platform, die auf Intel, AMD und ARM Prozessoren läuft und sich somit für virtualisierte Umgebungen bzw. Cloud Computing eignet. VyOS basiert intern auf Debian GNU/Linux.

VyOS stellt unter anderem die folgenden Dienste eines Routers bereit:

Hinzu kommen zahlreiche weitere in der Vorlesung Rechnernetze nicht behandelte Router-Funktionen wie z.B. Quality-of-Service (QoS), High Availability (HA), NetFlow/sFlow Unterstützung, usw. Diese Themen werden ggf. in späteren Lehrveranstaltungen eingeführt.

Eine umfangreiche VyOS Dokumentation ist auf https://docs.vyos.io/en/crux/ zu finden.

Nützliche Hintergrundinformationen zu den im Versuch behandelten Themen finden sich z.B. auf den folgenden englisch-sprachigen Seiten:

VyOS Kommandozeile

VyOS wird über Texteingaben in einer Kommandozeile (Command Line Interface bzw. CLI) bedient. Die VyOS Kommandozeile ähnelt der CLI von Juniper Routern und ist fast identisch zur CLI bestimmter Ubiquiti Geräte („EdgeRouter“). Die CLI von Cisco als größtem Hersteller von Switches und Routern verhält sich teilweise etwas anders – trotzdem sind viele Grundkonzepte auch auf Cisco übertragbar.

Die VyOS Kommanozeile nimmt Eingaben vom Benutzer als Zeichenkette entgegen. Befehle werden ggf. mit einer durch Leerzeichen getrennten Liste an Parametern eingegeben und mit der Return-Taste beendet und anschließend ausgewertet.

Die VyOS Kommandozeile unterscheidet zwei verschiedene Betriebsmodi: Den Operational Mode und den Configuration Mode. Diese werden zu verschiedenen Zwecken verwendet und unterscheiden sich sowohl in der Eingabeaufforderung (Prompt) wie auch in den möglichen Befehlen.

VyOS CLI

Der Operational Mode ist erkennbar an dem Dollarzeichen ($) in der Eingabeaufforderung, in der auch der Benutzername und der Hostname des Routers angegeben wird. Im Operational Mode kann der Status des Geräts abgefragt und überwacht werden. Ein typisches Beispiel ist die Anzeige von Statusinformationen mit show. Es gibt auch Befehle, die das Gesamtsystem betreffen, wie z.B. ein geordnetes Herunterfahren (poweroff). Nach dem Einloggen auf dem Router befindet man sich zunächst im Operational Mode.

Änderungen an der Gerätekonfiguration sind in VyOS nur im Configuration Mode der Kommandozeile möglich, der durch eine Raute (#) in der Eingabeaufforderung gekennzeichnet ist. Um aus dem Operational Mode in den Configuration Mode zu wechseln wird der Befehl configure eingegeben. Dies veranschaulicht die folgende Abfolge von Befehlen:

vyos@router:~$ configure
[edit]
vyos@router# set service ssh port 22
[edit]
vyos@router# commit
[edit]
vyos@router# exit

Das Kommando exit kehrt aus dem Configuration Mode zurück in den Operational Mode. Die VyOS Kommandozeile hat ein eingebautes Hilfesystem. In einer leeren Befehlszeile können sowohl durch die Taste ? als auch durch die Taste TAB alle verfügbaren Befehle als Hilfe angezeigt werden:

vyos@router:~$ ?
Possible completions:
  add               Add an object to a service
  clear             Clear system information
  clone             Clone an object
  configure         Enter configure mode
  connect           Establish a connection
  copy              Copy an object
  delete            Delete an object
  disconnect        Take down a connection
  force             Force an operation
  format            Format a device
  generate          Generate an object
  install           Install a new system
  monitor           Monitor system information
  ping              Send IPv4 or IPv6 ICMP (Internet Control Message Protocol) 
echo requests
  poweroff          Poweroff the system
  reboot            Reboot the system
  release           Release specified variable
  rename            Rename an object
  renew             Renew specified variable
  reset             Reset a service
  restart           Restart a service
:_

Wenn eine Bildschirmausgabe nicht vollständig dargestellt werden kann, wie im hier abgedruckten Beispiel, dann kann u.a. mit den Pfeiltasten zeilenweise in der Ausgabe navigiert werden und mit Taste q wieder zur Eingabeaufforderung zurückgekehrt werden. Bei einer teilweise eingegebenen Zeile können weitere notwendige Parameter ebenfalls durch die Tasten ? bzw. TAB als kontext-abhängige Hilfe dargestellt werden. Beispiel:

vyos@router:~$ show ?
Possible completions:
  arp           Show Address Resolution Protocol (ARP) information
  bridge        Show bridging information
  cluster       Show clustering information
  configuration Show running configuration
  conntrack     Show conntrack entries in the conntrack table
  conntrack-sync
                Show connection syncing information
  date          Show system date and time
  dhcp          Show Dynamic Host Configuration Protocol (DHCP) information
  dhcpv6        Show status related to DHCPv6
  disk          Show status of disk device
  dns           Show Domain Name Server (DNS) information
  file          Show files for a particular image
  firewall      Show firewall information
  flow-accounting
                Show flow accounting statistics
  hardware      Show system hardware details
  history       show command history
  host          Show host information
  incoming      Show ethernet input-policy information
  interfaces    Show network interface information
:_

Teilweise eingegebene Befehle oder Parameter können durch Taste TAB vervollständigt werden, so dass oft nur die ersten Buchstaben eingegeben werden müssen, was viel Tipparbeit ersparen kann. Diese nützliche Auto-Completion funktioniert nur, wenn die bislang eingegebenen Buchstaben bereits eindeutig sind.

Beispielsweise kann die aktuelle Routing-Tabelle im Operational Mode durch show ip route ausgeben werden. Diese Befehlszeile muss jedoch nicht komplett eingegeben werden. Es reicht aus, die folgenden Tasten zu drücken, wobei → für die TAB-Taste steht:

sh→ ip ro→

Dies wird automatisch vervollständigt zu dem kompletten Befehl zur Anzeige der Routing-Tabelle:

vyos@router:~$ show ip route

Hilfefunktionen sind auch im Configuration Mode verfügbar. Beispielsweise zeigt ? (oder alternativ TAB) alle Befehle im Configuration Mode an:

vyos@router:~$ configure
vyos@router# ?
Possible completions:
confirm           Confirm prior commit-confirm
comment           Add comment to this configuration element
commit            Commit the current set of changes
commit-confirm    Commit the current set of changes with 'confirm' required
compare           Compare configuration revisions
copy              Copy a configuration element
delete            Delete a configuration element
discard           Discard uncommitted changes
edit              Edit a sub-element
exit              Exit from this configuration level
load              Load configuration from a file and replace running configuration
loadkey           Load user SSH key from a file
merge             Load configuration from a file and merge running configuration
rename            Rename a configuration element
rollback          Rollback to a prior config revision (requires reboot)
run               Run an operational-mode command
save              Save configuration to a file
set               Set the value of a parameter or create a new element
show              Show the configuration (default values may be suppressed)

Man kann aus dem Configuration Mode heraus auch direkt Befehle des Operational Mode auszuführen, indem man run als Präfix nutzt:

vyos@router# run ping 192.168.0.1

Änderung der VyOS Konfiguration

VyOS unterscheidet drei verschiedene Konfigurationstypen für die Parameter des Routers:

Daraus folgen zwei für die Konfiguration von VyOS praktisch sehr wichtige Konsequenzen:

  1. Änderungen der Konfiguration werden nicht sofort nach Eingabe aktiv, sondern erst, nachdem die Änderung mit dem commit Befehl in die Active/Running Configuration eingepflegt wird.

  2. Nicht-gespeicherte Änderungen gehen nach Neustart verloren, wenn die Änderungen nicht durch das Kommando save dauerhaft im Dateisystem z.B. als Boot-Konfiguration abgespeichert werden.

Die Unterscheidung zwischen Active/Running Configuration und Working Configuration bedeutet, dass jede Konfigurationsänderung in VyOS erst nach dem Befehl commit wirklich wirksam wird. Änderungen mehrerer Parameter werden nur in die Active/Running Configuration übernommen, wenn alle Änderungen möglich sind (Transaktionslogik). Es ist alternativ auch möglich, Änderungen in der Working Configuration mit discard wieder komplett zu verwerfen.

Die beiden wichtigsten Befehle für Änderungen im Configuration Mode sind set und delete:

Parameter werden dabei in einem Pfad in einer Konfigurationshierarchie angegeben, deren Ebenen in Textausgaben durch geschweifte Klammern dargestellt werden.

Zum Beispiel setzt der folgende Befehl die Default-Route des Routers zum Next-Hop 192.168.0.254:

vyos@router# set protocols static route 0.0.0.0/0 next-hop 192.168.0.254

Der Konfigurationspfad beginnt in dem Beispiel mit den Elementen „protocols“, „static“ und „route“. Dieser Befehl führt zu folgender Konfigurationsänderung, die z.B. mit compare angezeigt werden kann:

vyos@router# compare
+protocols {
+    static {
+        route 0.0.0.0/0 {
+            next-hop 203.0.113.1 {
+            }
+        }
+    }
+}

Mit dem Zeichen + werden hierbei Konfigurationsänderungen angegeben, die in der Working Configuration vorgenommen wurden, aber noch nicht in die Active/Running Configuration übernommen wurden.

Um diese statische Route tatsächlich in die Routing-Tabelle einzutragen, ist ein commit notwendig:

vyos@router# commit
[edit]

Danach sind alle Änderungen übernommen:

vyos@router# compare
No changes between working and active configurations
[edit]

Nicht mehr benötigte Parameter können mit delete gelöscht werden. Zum Beispiel führt der Befehl

vyos@router# delete protocols static route 0.0.0.0/0

zum Löschen der Default-Route aus der Working Configuration. Dabei ist es ggf. ausreichend, einen eindeutigen Teilpfad zu dem zu löschenden Element anzugeben. Das tatsächliche Löschen aus der Routing- Tabelle erfolgt aber erst, wenn die Änderung mit commit auf die Active/Running Configuration angewendet wird.

Natürlich ist es möglich, auch mehrere Änderungen in der Working Configuration vorzunehmen, bevor diese mit commit wirksam werden. Dies soll beispielhaft für eine Änderung der Netzschnittstelle eth0 illustriert werden, der die IPv4 Adresse 192.168.0.1 im Sub-Netz 192.168.0.0/24 (Netzmaske 255.255.255.0) sowie eine Textbeschreibung zugewiesen werden soll:

vyos@router# set interfaces ethernet eth0 address 192.168.0.1/24
vyos@router# set interfaces ethernet eth0 description "Example interface"

Im Configuration Mode kann die gesamte Working Configuration durch das Kommando show ausgegeben werden. Es ist aber auch möglich, nur Teile der Konfiguration auszuwählen, z.B. durch show interfaces. Die Textausgabe des letzteren Befehls würde nach der obigen Änderung mit den folgenden Zeilen beginnen:

vyos@router# show interfaces
 ethernet eth0 {
+   address 192.168.0.1/24
+   description "Example interface"

Auch diese Änderungen würden sich erst auf das Routing auswirken, nachdem commit ausgeführt wurde.

VyOS bietet über die genannten Befehle hinaus noch weitere Möglichkeiten, die Konfiguration zu ändern. Details dazu finden sich in der Dokumentation im Web oder in der Online-Hilfe des Routers selbst.

Nachfolgend werden zur Illustration noch weitere einfache Beispiele für die Konfiguration eines VyOS Routers bereitgestellt. Die auf Routern laufenden Dienste sind jedoch üblicherweise über sehr viele Parameter konfigurierbar, die ein detailliertes Verständnis der entsprechenden Mechanismen und Protokolle voraussetzen. Daher beschränkt sich die Einführung auf relativ einfache Konfigurationsbeispiele für Basisdienste eines Routers. Die VyOS Dokumentation enthält zahlreiche weitere komplexere Beispiele.

Konfigurationsbeispiele für VyOS

Firewall

VyOS erlaubt es, relativ komplexe Firewall-Konfigurationen zu erstellen. In dem Laborversuch sollen einfache zustandslose Firewalls mit Paketfiltern betrachtet werden, die über Access Control List (ACL) Regeln konfiguriert werden

Jeder Eintrag definiert dabei eine Regel (Rule) mit Kriterien, die auf Headerfelder in Pakete zutreffen können, sowie einer zugehörigen Aktion, die auf das Paket angewendet wird, falls alle definierten Kriterien zutreffen. Eine Regel wird nur angewendet, wenn alle in der Regel definierten Kriterien erfüllt sind. Dazu gehören auch Überprüfungen, ob sich IP Adressen in angegebenen Sub-Netzen befinden. Beispiele für Aktionen sind accept, drop bzw. reject. In VyoS werden die Regeln nummeriert und mit dem Schlüsselwort rule definiert.

Mehrere Regeln können in einem Regelsatz zusammengefasst werden und mit einem (frei wählbaren) Namen versehen werden. Innerhalb des Regelsatzes werden die Regeln entsprechend der (zwischen 1 und 9999 wählbaren) Nummern in aufsteigender Reihenfolge abgearbeitet. Falls keine Regel zutrifft, kann für einen Regelsatz eine Default-Aktion (Parameter default-action) ausgelöst werden.

Regelsätze können über den Namen einer oder mehreren Netzschnittstelle(n) zugewiesen werden. Der Regelsatz wird dann auf dieser Netzschnittstelle entsprechend einer gewählten Richtung für allen ausgehenden (out) bzw. eingehenden (in) Datenverkehr angewendet und realisiert dort die Firewall.

Im folgenden Beispiel wird eine Firewall mit einem Regelsatz EXAMPLE definiert, der über zwei Regeln mit den willkürlich gewählten Nummern 1000 und 2000 die Anwendungsprotokolle DNS für alle Ziel-Adressen und SSH zum Sub-Netz 10.0.0.0/8 im ausgehenden Verkehr auf dem Netzadapters eth0 zulässt (accept). Aller übrige ausgehende Datenverkehr wird auf dieser Schnittstelle verworfen (drop):

vyos@router# set firewall name EXAMPLE default-action drop

vyos@router# set firewall name EXAMPLE rule 1000 action accept
vyos@router# set firewall name EXAMPLE rule 1000 destination port 53
vyos@router# set firewall name EXAMPLE rule 1000 protocol udp

vyos@router# set firewall name EXAMPLE rule 2000 action accept
vyos@router# set firewall name EXAMPLE rule 2000 destination address 10.0.0/8
vyos@router# set firewall name EXAMPLE rule 2000 destination port 22
vyos@router# set firewall name EXAMPLE rule 2000 protocol tcp

vyos@router# set interfaces ethernet eth1 firewall out name EXAMPLE

Dies würde zu der folgenden Firewall-Konfiguration führen:

firewall {
    name EXAMPLE {
        default-action drop
        rule 1000 {
            action accept
            destination {
                port 53
            }
            protocol udp
        }
        rule 2000 {
            action accept
            destination {
                address 10.0.0.0/8
                port 22
            }
            protocol tcp
        }
    }
}

Network Address Translation (NAT)

Mit NAT werden IP Addressen und/oder Portnummern umgesetzt. Es gibt sowohl Source NAT, das häufig zur Anbindung privater IP Netze an das Internet verwendet wird, als auch Destination NAT, das häufig für Port-Forwarding zum Einsatz kommt. VyOS unterstützt beides.

Die Verwendung von Destination NAT sei an einem Beispiel veranschaulicht: In einem Router soll der gesamte HTTP Datenverkehr (d.h. TCP auf Port 80), der auf allen Netzadaptern ankommt, zu einem bestimmten Web-Server weitergeleitet werden, der die IP Adresse 192.168.0.1 verwendet. Die Weiterleitung soll für alle Ziel-IP-Adressen im Sub-Netz 192.168.2.0/24 gelten. Diese würde durch die folgenden Befehle erreicht werden, die eine Regel Nummer 100 (willkührlich gewählte Zahl) definieren:

vyos@router# set nat destination rule 100 destination address 192.168.2.0/24
vyos@router# set nat destination rule 100 destination port 80
vyos@router# set nat destination rule 100 inbound-interface any
vyos@router# set nat destination rule 100 protocol tcp
vyos@router# set nat destination rule 100 translation address 192.168.0.1

Daraus würde die folgende Konfiguration resultieren:

nat {
    destination {
        rule 100 {
            destination {
                address 192.168.2.0/24
                port 80
            }
            inbound-interface any
            protocol tcp
            translation {
                address 192.168.0.1
            }
        }
    }
}

System-Konfiguration

Nachfolgend ist die Ausgangskonfiguration eines VyOS Routers abgedruckt, die sich zum Beispiel im Configuration Mode mit show configuration anzeigen lässt. Die VM hat vier Ethernet-Netzadapter (eth0, eth1, eth2, eth3) mit entsprechenden MAC Addressen sowie eine lokale Loopback-Schnittstelle (lo). Die MAC Adressen sind dabei in der Boot-Konfiguration gespeichert:

interfaces {
    ethernet eth0 {
        hw-id 08:00:27:ad:00:0f
    }
    ethernet eth1 {
        hw-id 08:00:27:ad:01:0f
    }
    ethernet eth2 {
        hw-id 08:00:27:ad:02:0f
    }
    ethernet eth3 {
        hw-id 08:00:27:ad:03:0f
    }
    loopback lo {
    }
}
system {
    config-management {
        commit-revisions 100
    }
    console {
        device ttyS0 {
            speed 9600
        }
    }
    host-name vyos
    login {
        user vyos {
            authentication {
                encrypted-password ****************
                plaintext-password ****************
            }
            level admin
        }
    }
    ntp {
        server 0.pool.ntp.org {
        }
        server 1.pool.ntp.org {
        }
        server 2.pool.ntp.org {
        }
    }
    syslog {
        global {
            facility all {
                level info
            }
            facility protocols {
                level debug
            }
        }
    }
}