VyOS

Introduction à VyOS

VyOS est une distribution de système d’exploitation réseau open source, basée sur Linux, qui permet de gérer les réseaux avec des fonctionnalités de routeur et de pare-feu avancées.

C’est une alternative à des solutions propriétaires comme Cisco IOS, Juniper Junos, et Mikrotik RouterOS. VyOS est particulièrement apprécié pour sa flexibilité, son coût (gratuit), et sa capacité à être utilisé sur du matériel standard ou dans des environnements virtuels.

C’est un fork de Vyatta, qui était une distribution commerciale basée sur Debian.

Fonctionnalités

VyOS fonctionne en utilisant des paquets réseau standards sur une base Linux. Les fonctionnalités sont configurées via une interface de ligne de commande (CLI) similaire à celles utilisées par les routeurs propriétaires. VyOS supporte une variété de protocoles et de services réseau, incluant:

  • Routage statique et dynamique (OSPF, BGP, RIP, etc.)
  • Pare-feu (stateful firewall, NAT, VPN, etc.)
  • QoS (Quality of Service) et Traffic Shaping (limitation de bande passante)
  • VLAN (Virtual Local Area Network)
  • VPN (IPsec, OpenVPN, WireGuard, etc.)
  • Proxy (Squid)
  • DHCP (Dynamic Host Configuration Protocol)
  • DNS (Domain Name System)
  • Monitoring (SNMP, NetFlow, etc.)

Pré-requis matériels

  • VyOS peut être installé sur du matériel physique ou virtuel. Pour une utilisation en production, il est recommandé d’utiliser du matériel certifié par VyOS. Pour une utilisation en laboratoire ou pour des tests, VyOS peut être installé sur des machines virtuelles comme VirtualBox, VMware, ou KVM.



- Le minimum requis pour VyOS est un processeur x86_64, 1024 Mo de RAM, et 2 Go d’espace disque. Ces valeurs sont à adapter en fonction de l’utilisation prévue.

Image ISO

Concernant l’installation, il est possible de

  • télécharger l’image ISO de VyOS sur le site officiel : VyOS
  • ou de créer une image personnalisée à partir du code source disponible sur GitHub : VyOS GitHub

Dans notre cas, nous construisons une image VyOS personnalisée grâce à une CI GitLab. Cette configuration CI sur GitLab est conçue pour automatiser le processus de construction d’une image ISO VyOS personnalisée.

Elle utilise l’image Docker vyos/vyos-build:current pour garantir un environnement de construction cohérent.

Voici le script :

image: vyos/vyos-build:current
variables:
  GIT_SSL_NO_VERIFY: true

stages:
  - deploy

deploy:
  stage: deploy
  script:
    - echo "Deploying"
    - git clone -b current --single-branch https://github.com/vyos/vyos-build
    - cd vyos-build
    - make clean
    - ./build-vyos-image generic --architecture amd64 --build-by "gries.melissa@outlook.fr"
  artifacts:
    paths:
      - vyos-build/build/*.iso
    expire_in: 1 week

Voici une explication détaillée de la configuration CI :

Variables :

  • GIT_SSL_NO_VERIFY : Un flag pour contourner la vérification SSL pour les opérations Git. Cela est utile dans les environnements avec des certificats auto-signés, mais doit être utilisé avec prudence.

Stages :

  • deploy : La seule étape de ce pipeline, responsable du déploiement (construction) de l’image VyOS.

Deploy :

  • S’exécute dans l’étape ‘déploiement’.

  • Le script effectue les actions suivantes :

    1. Affiche “Deploy” dans la console à des fins de journalisation.

    2. Clone le dépôt vyos-build de GitHub en utilisant la branche ‘current’. Cela contient les scripts et configurations nécessaires pour construire une image ISO VyOS.

    3. Change de répertoire pour le dépôt vyos-build cloné.

    4. Nettoie tous les artefacts de construction précédents pour garantir un nouveau départ.

    5. Exécute le script de construction pour créer une image ISO VyOS, en spécifiant l’architecture comme amd64 et en personnalisant la construction avec un identifiant (email dans ce cas).

  • Artifacts :

    • La section des chemins spécifie que tous les fichiers ISO générés dans le répertoire vyos-build/build doivent être collectés comme artefacts du processus de construction.

    • expire_in définit l’expiration des artefacts à 1 semaine, après quoi ils sont automatiquement supprimés.

Installation

Chaque installation de Vyos débute par un démarrage en mode live. Pour faire une installation permanente, il faut exécuter la commande install image dans le terminal et suivre les instructions suivantes :

    vyos@vyos:~$ install image
    Welcome to the VyOS install program.  This script
    will walk you through the process of installing the
    VyOS image to a local hard drive.
    Would you like to continue? (Yes/No) [Yes]: Yes
    Probing drives: OK
    Looking for pre-existing RAID groups...none found.
    The VyOS image will require a minimum 2000MB root.
    Would you like me to try to partition a drive automatically
    or would you rather partition it manually with parted?  If
    you have already setup your partitions, you may skip this step

    Partition (Auto/Parted/Skip) [Auto]:

    I found the following drives on your system:
    sda    4294MB

    Install the image on? [sda]:

    This will destroy all data on /dev/sda.
    Continue? (Yes/No) [No]: Yes

    How big of a root partition should I create? (2000MB - 4294MB) [4294]MB:

    Creating filesystem on /dev/sda1: OK
    Done!
    Mounting /dev/sda1...
    What would you like to name this image? [1.2.0-rolling+201809210337]:
    OK.  This image will be named: 1.2.0-rolling+201809210337
    Copying squashfs image...
    Copying kernel and initrd images...
    Done!
    I found the following configuration files:
        /opt/vyatta/etc/config.boot.default
    Which one should I copy to sda? [/opt/vyatta/etc/config.boot.default]:

    Copying /opt/vyatta/etc/config.boot.default to sda.
    Enter password for administrator account
    Enter password for user 'vyos':
    Retype password for user 'vyos':
    I need to install the GRUB boot loader.
    I found the following drives on your system:
    sda    4294MB

    Which drive should GRUB modify the boot partition on? [sda]:

    Setting up grub: OK
    Done!
    vyos@vyos:~$ reboot
    Proceed with reboot? (Yes/No) [No] Yes

On changera ensuite le mot de passe par défaut :

    vyos@vyos:~$ set system login user vyos authentication plaintext-password 'mdp'
    New password:
    Retype new password:
    vyos@vyos:~$ commit
    vyos@vyos:~$ save
    Saving configuration to '/config/config.boot'...
    Done
    vyos@vyos:~$ exit

Configuration par le script

VyOS permet de configurer le système via un script. Voici le Script du routeur VyOS RFW-VYOS-DC1-1 :

#!/bin/vbash

source /opt/vyatta/etc/functions/script-template

configure
set system host-name RFW-VYOS-DC1-1
set system name-server 10.50.255.254
set protocols static route 0.0.0.0/0 next-hop 10.50.255.254
set interfaces ethernet eth0
set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 description 'WAN'
set interfaces ethernet eth1 vif 100
set interfaces ethernet eth1 vif 100 address 10.0.1.253/23
set interfaces ethernet eth1 vif 100 description 'LMGMTDC'
set interfaces ethernet eth1 vif 200
set interfaces ethernet eth1 vif 200 address 10.0.21.253/23
set interfaces ethernet eth1 vif 200 description 'VSERVERDC'
set interfaces ethernet eth1 vif 210
set interfaces ethernet eth1 vif 210 address 10.0.23.253/23
set interfaces ethernet eth1 vif 210 description 'VDMZ'
set interfaces ethernet eth1 vif 230
set interfaces ethernet eth1 vif 230 address 10.0.25.253/23
set interfaces ethernet eth1 vif 230 description 'VINFORMATIQUE'
set service ssh port '22'

set nat source rule 20 outbound-interface name eth0
set nat source rule 20 translation address 10.50.55.150

set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 option default-router '10.0.1.254'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 option name-server '10.0.20.10'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 option ntp-server '10.0.20.17'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 option domain-name 'innovalia.xyz'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 lease '86400'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 range 0 start '10.0.0.40'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 range 0 stop '10.0.1.200'
set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23
 subnet-id '100'

set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 option default-router '10.0.21.254'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 option name-server '10.0.20.10'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 option ntp-server '10.0.20.17'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 option domain-name 'innovalia.xyz'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 lease '86400'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 range 0 start '10.0.20.40'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 range 0 stop '10.0.21.200'
set service dhcp-server shared-network-name VSERVERDC subnet 10.0.20.0/23
 subnet-id '200'

set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 option default-router '10.0.23.254'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 option name-server '10.0.20.10'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 option ntp-server '10.0.20.17'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 option domain-name 'innovalia.xyz'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 lease '86400'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 range 0 start '10.0.22.40'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 range 0 stop '10.0.23.200'
set service dhcp-server shared-network-name VDMZ subnet 10.0.22.0/23
 subnet-id '210'

set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 option default-router '10.0.25.254'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 option name-server '10.0.20.10'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 option ntp-server '10.0.20.17'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 option domain-name 'innovalia.xyz'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 lease '86400'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 range 0 start '10.0.24.40'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 range 0 stop '10.0.25.200'
set service dhcp-server shared-network-name VINFORMATIQUE subnet 10.0.24.0/23
 subnet-id '230'

set service dhcp-server high-availability mode active-passive
set service dhcp-server high-availability source-address 10.0.1.253
set service dhcp-server high-availability remote 10.0.1.252
set service dhcp-server high-availability name HADHCP
set service dhcp-server high-availability status primary


set high-availability vrrp group VLAN100 address 10.0.1.254/23 interface eth1.100
set high-availability vrrp group VLAN100 interface eth1.100
set high-availability vrrp group VLAN100 priority 200
set high-availability vrrp group VLAN100 track interface eth0
set high-availability vrrp group VLAN100 track interface eth1.100
set high-availability vrrp group VLAN100 vrid 100
set high-availability vrrp group VLAN100 preempt-delay 60

set high-availability vrrp group VLAN200 address 10.0.21.254/23 interface eth1.200
set high-availability vrrp group VLAN200 interface eth1.200
set high-availability vrrp group VLAN200 priority 200
set high-availability vrrp group VLAN200 track interface eth0
set high-availability vrrp group VLAN200 track interface eth1.200
set high-availability vrrp group VLAN200 vrid 200
set high-availability vrrp group VLAN200 preempt-delay 60

set high-availability vrrp group VLAN210 address 10.0.23.254/23 interface eth1.210
set high-availability vrrp group VLAN210 interface eth1.210
set high-availability vrrp group VLAN210 priority 200
set high-availability vrrp group VLAN210 track interface eth0
set high-availability vrrp group VLAN210 track interface eth1.210
set high-availability vrrp group VLAN210 vrid 210
set high-availability vrrp group VLAN210 preempt-delay 60

set high-availability vrrp group VLAN230 address 10.0.25.254/23 interface eth1.230
set high-availability vrrp group VLAN230 interface eth1.230
set high-availability vrrp group VLAN230 priority 200
set high-availability vrrp group VLAN230 track interface eth0
set high-availability vrrp group VLAN230 track interface eth1.230
set high-availability vrrp group VLAN230 vrid 230
set high-availability vrrp group VLAN230 preempt-delay 60


set high-availability vrrp sync-group MAIN member VLAN100
set high-availability vrrp sync-group MAIN member VLAN200
set high-availability vrrp sync-group MAIN member VLAN210
set high-availability vrrp sync-group MAIN member VLAN230

commit

save

exit

Explications du script :

  • source /opt/vyatta/etc/functions/script-template : Charge les fonctions de script VyOS.

  • configure : Démarre la configuration.

Configuration générale

  • set system host-name RFW-VYOS-DC1-1 : Définit le nom d’hôte du routeur.

  • set system name-server 10.50.255.254 : Définit le serveur DNS.

  • set protocols static route 0.0.0.0/0 next-hop 10.50.255.254 : Configure la route par défaut. Ici notre gateway physique.

  • set system name-server : Définit le serveur DNS par défaut pour le système.

  • set protocols static route : Configure la route par défaut.

Interface WAN

  • set interfaces ethernet eth0 : Définit l’interface eth0.

  • set interfaces ethernet eth0 address dhcp : Configure l’interface eth0 en mode DHCP.

  • set interfaces ethernet eth0 description 'WAN' : Définit la description de l’interface eth0.

Interfaces VLAN

  • set interfaces ethernet eth1 vif 100 : Configure l’interface eth1 en mode VLAN 100.

  • set interfaces ethernet eth1 vif 100 address 10.0.1.253/23 : Définit l’adresse IP de l’interface eth1.100.

  • set interfaces ethernet eth1 vif 100 description 'LMGMTDC' : Définit la description de l’interface eth1.100.

et ainsi de suite pour les autres interfaces VLAN.

Services SSH

  • set service ssh port : Définit le port SSH.

NAT, DHCP, HA

  • set nat source rule 20 outbound-interface name eth0 : Crée une règle NAT pour le trafic sortant via eth0.

  • set nat source rule 20 translation address 10.50.55.150 : Définit l’adresse de traduction NAT. Ici l’adresse IP physique du routeur.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 option default-router '10.0.1.254' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec la passerelle par défaut.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 option name-server '10.0.20.10' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec le serveur DNS.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 option ntp-server '10.0.20.17' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec le serveur NTP.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 option domain-name 'innovalia.xyz' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec le nom de domaine.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 lease '86400' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec la durée de bail.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 range 0 start '10.0.0.40' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec le début de la plage d’adresses IP.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 range 0 stop '10.0.1.200' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec la fin de la plage d’adresses IP.

  • set service dhcp-server shared-network-name LMGMTDC subnet 10.0.0.0/23 subnet-id '100' : Configure le serveur DHCP pour le sous-réseau LMGMTDC avec l’ID de sous-réseau.

et ainsi de suite pour les autres sous-réseaux.

  • set service dhcp-server high-availability mode active-passive : Configure le mode de haute disponibilité pour le serveur DHCP.

  • set service dhcp-server high-availability source-address 10.0.1.253 : Configure l’adresse source pour la haute disponibilité du serveur DHCP.

  • set service dhcp-server high-availability remote 10.0.1.252 : Configure l’adresse distante pour la haute disponibilité du serveur DHCP.

  • set service dhcp-server high-availability name HADHCP : Configure le nom de la haute disponibilité du serveur DHCP.

  • set service dhcp-server high-availability status primary : Configure le statut de haute disponibilité du serveur DHCP.

  • set high-availability vrrp group VLAN100 address 10.0.1.254/23 interface eth1.100 : Configure le groupe VRRP pour l’interface VLAN 100.

  • set high-availability vrrp group VLAN100 interface eth1.100 : Configure l’interface pour le groupe VRRP VLAN 100.

  • set high-availability vrrp group VLAN100 priority 200 : Configure la priorité pour le groupe VRRP VLAN 100.

  • set high-availability vrrp group VLAN100 track interface eth0 : Configure le suivi de l’interface pour le groupe VRRP VLAN 100.

  • set high-availability vrrp group VLAN100 track interface eth1.100 : Configure le suivi de l’interface pour le groupe VRRP VLAN 100.

  • set high-availability vrrp group VLAN100 vrid 100 : Configure l’ID de routeur virtuel pour le groupe VRRP VLAN 100.

  • set high-availability vrrp group VLAN100 preempt-delay 60 : Configure le délai de préemption pour le groupe VRRP VLAN 100.

  • set high-availability vrrp sync-group : Configure le groupe de synchronisation VRRP pour les interfaces VLAN 100, 200, 210, 230. Ici le groupe MAIN.

Pare-feu

VyOS dispose d’un pare-feu intégré qui permet de contrôler le trafic réseau entrant et sortant. Le pare-feu est basé sur iptables et peut être configuré via la CLI VyOS. Voici un exemple de configuration de pare-feu simple :