Einführung in VyOS Router

Übersicht über VyOS

VyOs ist eine Open Source Routing-Platform, die auf Intel und AMD 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 Netzdienste bereit:

Hinzu kommen zahlreiche weitere Router-Funktionen wie z.B. Quality-of-Service (QoS), High Availability (HA), NetFlow/sFlow Unterstützung, usw.

Eine umfangreiche VyOS Dokumentation zu Version 1.4 (Sagitta) ist auf https://docs.vyos.io/en/sagitta/ zu finden.

Nützliche Hintergrundinformationen 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 configuration mode
  connect               Establish 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/key
  import                Import an object
  install               Install a new system
  monitor               Monitor system information
  mtr                   Monitor Traceroute and ping path to target
  ping                  Send Internet Control Message Protocol (ICMP) echo request
  poweroff              Poweroff the system
  reboot                Reboot the system
  release               Release specified variable
  rename                Rename an object
:_

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
  babel                 Show Babel routing protocol information
  bfd                   Show Bidirectional Forwarding Detection (BFD)
  bgp                   BGP information
  bridge                Show bridging information
  configuration         Show available saved configurations
  conntrack             Show conntrack tables entries
  conntrack-sync        Show connection tracking synchronization information
  console-server        Show Console-Server information
  container             Show containers
  date                  Show system time and date
  dhcp                  Show DHCP (Dynamic Host Configuration Protocol) information
  dhcpv6                Show DHCPv6 (IPv6 Dynamic Host Configuration Protocol)
                        information
  disk                  Show status of disk device
  dns                   Show Domain Name System (DNS) related information
  environment           Show current system environmental conditions
  evpn                  Show Ethernet VPN (EVPN) information
  file                  Show files for a particular image
  firewall              Show firewall 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
  merge                 Load configuration from a file and merge running configuration
  rename                Rename a configuration element
  rollback              Rollback to a prior config revision (requires reboot)
  rollback-soft         Rollback to a prior config revision (without 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
:_

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.

Sofern eine Konfigurationsänderung auch nach dem Neustart eines VyOS Routers beibehalten werden soll, muss vor dem Neustart der Befehl save ausgeführt werden, um die Änderung in die Saved Configuration zu übernehmen.

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 in dieser Konfigurationshierarchie 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 und genau die Ebenen der eigegebenen Parameter enthält:

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. Als Beispiel soll eine einfache zustandsbehaftete Firewall betrachtet werden, die auf einer Liste von Regeln für die Paketweiterleitung basiert. Die Firewall entscheidet dann für alle nicht an den Router selbst gerichteten Pakete, ob diese tatsächlich weitergeleitetet 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 auch Entscheidung aufgrund des Verbindungszustands treffen, z.B. alle Pakete zulassen, die in Rückrichtung zu einer bereits bestehenden Verbindung gehören (state established).

Im folgenden Beispiel wird eine Firewall für die Paketweiterleitung (forward) in einem IPv4 Router definiert, der über drei Regeln mit den willkürlich gewählten Nummern 1000, 2000 und 3000 die Anwendungsprotokolle DNS für alle Ziel-Adressen und SSH zum Sub-Netz 10.0.0.0/8 zulässt (accept), sowie entsprechende Antworten in bestehenden Verbindungen. Aller übriger Datenverkehr wird verworfen (drop):

vyos@router# set firewall ipv4 forward filter default-action drop

vyos@router# set firewall ipv4 forward filter rule 1000 action accept
vyos@router# set firewall ipv4 forward filter rule 1000 destination port 53
vyos@router# set firewall ipv4 forward filter rule 1000 protocol udp

vyos@router# set firewall ipv4 forward filter rule 2000 action accept
vyos@router# set firewall ipv4 forward filter rule 2000 destination address 10.0.0.0/8
vyos@router# set firewall ipv4 forward filter rule 2000 destination port 22
vyos@router# set firewall ipv4 forward filter rule 2000 protocol tcp

vyos@router# set firewall ipv4 forward filter rule 3000 action accept
vyos@router# set firewall ipv4 forward filter rule 3000 state established

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

firewall {
    ipv4 {
        filter {
            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
            }
            rule 3000 {
                action accept
                state established
            }
        }
    }
}

An diesem Beispiel ist auch ersichtlich, dass es in VyOS einen direkten Zusammenhang zwischen der Reihung der Parameter in der Kommandozeile und den ineinander verschachtelten Blöcken der Konfiguration gibt. Die Schlüsselworte der Kommandozeile entsprechen jeweils einem Block.

GRE Tunnel

VyOS unterstützt eine ganze Reihe von Tunnel-Techniken und Lösungen für Virtual Private Networks (VPN). Beispielsweise ist es möglich, Generic Routing Encapsulation (GRE) Tunnel aufzubauen. GRE Tunnel sind nicht verschlüsselt und daher mit wenig Aufwand konfigurierbar. Bei Verwendung von IPv4 Adressen als Tunnel-Endpunkte werden getunnelte (d.h. innere) IP Pakete mit einem GRE Header in ein (äußeres) IPv4 Paket eingekapselt. Der GRE Header ist mindestens 4 byte lang.

Auf einem VyOS Router mit der IP Adresse 192.0.2.2 kann mit den folgenden Befehlen ein GRE Tunnel zu einer Gegenstelle mit IP Adresse 203.0.113.1 aufgebaut werden:

vyos@router# set interfaces tunnel tun0 encapsulation gre
vyos@router# set interfaces tunnel tun0 source-address 192.0.2.2
vyos@router# set interfaces tunnel tun0 remote 203.0.113.1
vyos@router# set interfaces tunnel tun0 address 192.168.4.2/30

Der Tunnel hätte innerhalb von VyOS die (frei wählbare) Bezeichnung tun0. Innerhalb des Tunnels würde in diesem Fall das IP Sub-Netz 192.168.4.0/30 verwendet werden, wobei der Router die IP Adresse 192.168.4.2 verwenden würde. Die Gegenstelle würde dementsprechend die IP Adresse 192.168.4.1 in diesem Sub-Netz verwenden. Eine Anzeige der Konfiguration des Tunnels würde liefern:

tunnel tun0 {
    address 192.168.4.2/30
    encapsulation gre
    source-address 192.0.2.2
    remote 203.0.113.1
}

Network Address Translation (NAT)

Mit NAT werden IP Adressen 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 beide Mechanismen.

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 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
            }
            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 Adressen sowie eine lokale Loopback-Schnittstelle (lo). Die MAC Adressen sind dabei in der Boot-Konfiguration gespeichert:

interfaces {
    ethernet eth0 {
        hw-id "08:00:27:de:f0:3e"
    }
    ethernet eth1 {
        hw-id "08:00:27:de:f0:4e"
    }
    ethernet eth2 {
        hw-id "08:00:27:de:f0:5e"
    }
    ethernet eth3 {
        hw-id "08:00:27:de:f0:6e"
    }
    loopback lo {
    }
}
service {
    ntp {
        allow-client {
            address "127.0.0.0/8"
            address "169.254.0.0/16"
            address "10.0.0.0/8"
            address "172.16.0.0/12"
            address "192.168.0.0/16"
            address "::1/128"
            address "fe80::/10"
            address "fc00::/7"
        }
        server time1.vyos.net {
        }
        server time2.vyos.net {
        }
        server time3.vyos.net {
        }
    }
}
system {
    config-management {
        commit-revisions "100"
    }
    conntrack {
        modules {
            ftp
            h323
            nfs
            pptp
            sip
            sqlnet
            tftp
        }
    }
    console {
        device ttyS0 {
            speed "115200"
        }
    }
    host-name "vyos"
    login {
        user vyos {
            authentication {
                encrypted-password XXX
                plaintext-password ""
            }
        }
    }
    option {
        keyboard-layout "de"
    }
    syslog {
        global {
            facility all {
                level "info"
            }
            facility local7 {
                level "debug"
            }
        }
    }
}