Interface management

OpenBSD est un système BSD axé purement sécurité et réseau. On peut faire beaucoup de choses sympathiques, comme un routeur, un loadbalancer, un firewall, ou encore monter des tunnels VPN. Cet article très court va décrire l’ensemble des interfaces que l’on peut retrouver sur OpenBSD et comment les administrer. (la configuration est fortement similaire à FreeBSD).

Les différents types d’interfaces réseau:

  • inet/inet6
  • bridge
  • carp
  • 802.11 (non décrit ici)
  • mpe (non décrit ici)
  • pflow
  • pfsync
  • pppoe (non décrit ici)
  • sppp (non décrit ici)
  • trunk
  • tunnel (GIF,GRE)
  • vlan

Interface Inet/Inet6

Les interfaces Inet/Inet6 sont les interfaces réseau IP, dans leur conception la plus simple. L’ensemble des commandes ci-dessous peut être appliqué aux interfaces de type tunnel ou encapsulation.

IPv4

Pour attribuer une adresse IPv4 c’est comme sur tout UNIX:

ifconfig bnx0 10.4.2.1/24

Si vous souhaitez supprimer l’adresse IP principale de l’interface, utilisez le mot clé delete

ifconfig bnx0 delete 10.4.2.1

Si vous souhaitez rajouter des adresses IP supplémentaires, vous pouvez ajouter des alias.

ifconfig bnx0 alias 10.4.2.2

en cas d’erreur, on peut également les supprimer simplement

ifconfig bnx0 -alias 10.4.2.2

IPv6

Pour l’attribution d’une adresse IPv6:

ifconfig bnx0 fd00:abcd::ca2d:458/64

Vous pouvez également désactiver IPv6:

ifconfig bnx0 -inet6

Couche liaison de données

Vous pouvez changer l’adresse MAC de la carte réseau, soit en spécifiant une adresse, soit en choisissant aléatoirement

ifconfig bnx0 lladdr 00:11:22:33:44:55
ifconfig bnx0 lladdr random

Si vous rencontrez des difficultés, ou que vous avez besoin de spécifier un mode de transfert ethernet/fiber chanel (ou tout autre moyen exotique), vous pouvez utiliser la commande ifconfig media. Sans arguments elle vous montrera la configuration de l’interface et l’ensemble des modes:

supported media:
       media none
       media 10baseT
       media 10baseT mediaopt full-duplex
       media 100baseTX
       media 100baseTX mediaopt full-duplex
       media 1000baseT
       media 1000baseT mediaopt full-duplex
       media autoselect

Ensuite tapez la commande avec les arguments qui vont bien (ici 1gbit full):

ifconfig bnx0 media 1000baseT mediaopt full-duplex

Il est également possible de changer la MTU de l’interface afin de réduire la fragmentation IP, par exemple pour le jumboframe

ifconfig bnx0 mtu 6000

Etat de l’interface

Pour allumer et éteindre l’interface, comme tout UNIX

ifconfig bnx0 up
ifconfig bnx0 down

Supprimer une interface virtuelle

Une seule commande peut provoquer le chaos

ifconfig vlan45 destroy

Facilités d’administration

Pour des questions d’administration, surtout si vous créez des dizaines d’interfaces virtuelles, il peut être intéressant également d’ajouter des descriptions sur les interfaces (-description pour supprimer la description)

ifconfig bnx0 description "Internet fiber"

Vous pouvez créer des groupes d’interfaces (limité à 15 caractères, ne terminant pas par un chiffre), et ajouter une interface dans un ou plusieurs groupes. Ceci permet, par exemple, de pouvoir éteindre un ensemble d’interfaces réseau pour basculer en failover de façon cohérente.

ifconfig bnx0 group lan group priv
ifconfig bnx0 -group priv

Routage/MPLS

Plusieurs options peuvent être appliquées aux interfaces réseau afin de configurer de manière plus spécifique un protocole de routage ou d’utiliser MPLS.

Le mot clef metric permet d’associer une métrique à une interface, qui sera utilisée lors des calculs de route (par exemple avec OSPF). Plus la métrique est élevée, moins la route sera favorable.

ifconfig bnx0 metric 20

Pour activer/désactiver MPLS:

ifconfig bnx0 mpls
ifconfig bnx0 -mpls

Pour terminer sur le routage, il est possible de changer le domaine de routage d’une interface, afin de gagner en sécurité. Par défaut le domaine 0 est utilisé.

ifconfig bnx0 rtdomain 4

Configurer de manière persistante une interface

Pour garder la configuration réseau pour chaque démarrage, et permettre au script netstart (/etc/netstart) de reconfigurer vos interfaces, il faut enregistrer la configuration de chacun des interfaces dans un fichier séparé dans /etc/.

La nomenclature de chaque fichier est la suivante:

/etc/hostname.<interfacename>

Par exemple pour une interface gre4

/etc/hostname.gre4

Si les droits sont incorrects, OpenBSD va les corriger lors du boot.

Vous pouvez également lancer netstart à la main afin de reconfigurer une interface modifiée:

source /etc/netstart gre4

Interface virtuelle type bridge

Une interface de type bridge regroupe un ensemble d’interfaces réseau, un peu comme un switch non manageable.

Tout d’abord créons un bridge.

ifconfig bridge0 create

Un bridge étant un groupement d’interfaces physiques réunies sur une interface virtuelle, on peut les ajouter/supprimer à celui-ci.

ifconfig bridge0 add bnx0
ifconfig bridge0 del bnx0

Gestion du Spanning Tree

L’interface réseau agissant comme un switch, il est intéressant qu’elle agisse comme un pont spanning tree, afin d’éviter les boucles de switching. plusieurs options sont alors envisageable pour administrer celui-ci:

ifconfig bridge0 stp bnx0
 ifconfig bridge0 -stp bnx0

Deux versions de spanning tree sont supportées par OpenBSD, le STP classique et le RSTP (Rapid Spanning-Tree Protocol, par défaut)

Ensuite, le spanning tree reposant sur une racine qui va définir les chemins les plus intéressants, on peut modifier la priorité du spanning tree (0-61440)

ifconfig bridge0 spanpriority 4

La racine spanning tree étant une interface physique, il existe un moyen de changer la priorité d’une interface physique en tant que racine spanning tree (0-240)

ifconfig bridge0 ifpriority bnx0 6

et de changer le coût d’une interface physique (1-65535 en STP et 1-200000000 en RSTP, par défaut 55)

ifconfig bridge0 ifcost bnx0 7

Pour terminer, il est possible de changer la durée de vie de la configuration STP (6-40 secondes, par défaut 20)

ifconfig bridge0 maxage 30

Gestion du cache niveau 2

La première étape est de configurer correctement la découverte des hôtes. Pour se faire, il faut configurer les interfaces physiques sur lesquels sera opérée la recherche

ifconfig bridge0 discover bnx0

De même pour retirer la découverte sur une interface:

ifconfig bridge0 -discover bnx0

Afin de visualiser le cache ARP, vous pouvez taper la commande suivante:

ifconfig bridge0 addr

Il est possible d’ajuster la taille maximale du cache d’adresses, afin de ne pas saturer la mémoire (par défaut 150)

ifconfig bridge0 maxaddr 150

Maintenant configurons les interfaces via lesquelles seront connues les machines du LAN (par défaut toute interface ajoutée au bridge)

ifconfig bridge0 learn bnx0
ifconfig bridge0 -learn bnx1

Configurons maintenant la durée de vie maximale des entrées dans le cache ARP (par défaut 240, 0 pour l’infini, non recommandé):

ifconfig bridge0 timeout 70

Si vous voulez forcer une entrée dans la table ARP afin qu’un hôte ne soit, par exemple, joignable que d’un côté du bridge (au niveau 3)

ifconfig bridge0 static bnx0 00:11:22:33:44:55

Pour terminer, nettoyons le cache ARP, dans le premier cas uniquement les entrées apprises dynamiquement et dans le second cas toutes les entrées.

ifconfig bridge0 flush
ifconfig bridge0 flushall

Interface virtuelle type CARP

Les interfaces de type CARP s’appuyent sur le protocole du même nom. Il s’agit d’un protocole développé par BSD pendant que CISCO et d’autres acteurs développaient VRRP. Le fonctionnement du protocole est quasiment identique, mais les dernières version de CARP (sur OpenBSD uniquement) gèrent des fonctions plus abouties comme le load balancing.

Dans sa configuration la plus primaire, CARP permet d’assurer une redondance au niveau IP, permettant par exemple que, si votre routeur OpenBSD tombe en panne, le second prenne le relai.

Créons tout d’abord une interface de type CARP

ifconfig carp0 create

Une interface CARP s’appuie sur des avertissements périodiques afin de s’annoncer sur un réseau, ce qui permet d’assurer la cohérence de l’ensemble des noeuds. Chaque noeud peut avoir 3 statuts: maître, backup et init, et chaque interface se greffe sur une interface physique ou virtuelle (vlan ou bridge par exemple).

La première étape est de rattacher l’interface CARP avec une interface de niveau inférieur

ifconfig carp0 carpdev vlan45

Pour configurer l’intervalle entre deux avertissements CARP, il suffit de changer la valeur advbase (1-255). Assurez vous d’être cohérent sur chaque noeud pour éviter d’avoir des surprises (en mode master/backup).

ifconfig carp0 advbase 10

Dans une configuration de failover, il faut absolument que chaque noeud aie une priorité différente, sinon le noeud maître sera celui en cours jusqu’à ce qu’il tombe. Cette priorité se change via la commande suivante (la valeur la plus petite étant prioritaire)

ifconfig carp0 advskew 4

Il faut ensuite configurer 2 paramètres qui vont définir les machines faisant partie du groupe CARP, le vhid (1-255) et un mot de passe (conseillé mais non obligatoire). Ce mot de passe transitera sur le réseau sous forme de hash MD5

ifconfig carp0 vhid 40 pass MYPW6Z

Ajoutez ensuite une adresse IP (qui sera commune à tous les noeuds, et différente des interfaces physiques dans l’idéal !) à l’interface

ifconfig carp0 10.4.5.2/27

Réitérez la configuration sur l’ensemble des machines du groupe CARP.

Afin de gagner en sécurité, il est possible d’éviter que les avertissements CARP se propagent sur tout le réseau en spécifiant un hôte précis (par ce procédé il est possible d’encapsuler les avertissements dans une couche IPSec).

ifconfig carp0 carppeer 10.4.5.18

Voici ce qui devrait apparaître sur le maître si tout va bien

carp0: flags=28843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        lladdr 00:00:5e:00:01:01
        priority: 0
        carp: MASTER carpdev vlan45 vhid 40 advbase 10 advskew 4 carppeer 10.4.5.18
        groups: carp
        status: master
        inet 10.4.5.2 netmask 0xffffffe0 broadcast 10.4.5.31

Pour terminer sur CARP, apparu depuis OpenBSD 5.1, le load balancing CARP permet de créer quelque chose de similaire à la technologie VSS de CISCO en regroupant un ensemble de machines sous une seule adresse IP virtuelle et en répartissant le trafic entre elles. Il existe 4 moyens de répartir la charge: arp, ip, ip-stealth, ip-unicast.

Le premier moyen (arp) de répartition n’est adapté que dans le cas où le loadbalancer est dans un LAN. Ce mode s’appuyant sur du hashage d’adresse MAC, il ne peut convenir à une configuration de routage entre des hôtes distants.

Le second moyen (ip) permet de gérer le load balancing au niveau routage entre hôtes distants.

Le troisième moyen (ip-stealth) force les noeuds CARP a utiliser leur adresse MAC physique plutôt que l’adresse MAC CARP, permettant ainsi, dans un environnement de switching, d’éviter le flood sur chaque port.

Enfin, le dernier moyen (ip-unicast) est une amélioration du précédent dans un environnement de switch monitorés.

Passons à la configuration, sur chaque hôte configurez le load balacing:

ifconfig carp0 10.50.3.4/30 carpnodes 1:50,2:90 balancing ip-unicast

Les 2 interfaces devraient apparaître en MASTER.

Interface virtuelle type pflow

Les interfaces de type pflow permettent d’exporter les données d’accounting d’une interface en utilisant le protocole netflow v5, qui se base sur des trames ICMP. Ce type d’interface s’appuie sur le module Packet Filter.

Créons tout d’abord l’interface

ifconfig pflow0 create

Chaque interface nécessite une IP source et une IP de destination+port afin de faire transiter les paquets netflow. La configuration est on ne peut plus triviale

ifconfig pflow0 flowsrc 10.4.2.4 flowdst 10.6.7.34:44566

Il est également possible de changer la version du protocole netflow pour les anciens systèmes de collecte:

ifconfig pflow0 pflowproto 4

Interface virtuelle type pfsync

L’interface pfsync sert, comme son nom l’indique à synchroniser les différents Packet Filter au sein d’un même LAN. Appuyé sur le protocole PFSync (240), celui permet, lors de la modification des différentes tables d’état de Packet Filter, d’envoyer des mises à jour en multicast sur le LAN. Ce protocole niveau 4 étant non authentifié, il convient dès lors d’utiliser un réseau dédié afin d’éviter des usurpations de mise à jour (un câble croisé entre 2 machines peut suffir).

Configurons pfsync0 sur l’interface bnx0

ifconfig pfsync0 create
ifconfig pfsync0 syncdev bnx0

Vous pouvez également spécifier un hôte à contacter en unicast, et encapsuler les mises à jour via IPSec pour chiffrer les mises à jour sur le réseau.

ifconfig pfsync0 syncpeer 10.4.1.3

Pour terminer il est possible de changer le nombre de mises à jour dans une seule trame pfsync (1-255):

ifconfig pfsync0 maxupd 200

Interface virtuelle type trunk

Une interface de type trunk permet d’agréger un ensemble de cartes physiques pour ne former qu’une seule carte virtuelle. Ceci permet par exemple l’équilibrage de charge ou du failover au niveau 1 OSI.

Pour créer un trunk et ajouter/supprimer des interfaces physiques:

ifconfig trunk0 create
ifconfig trunk0 trunkport bnx0
ifconfig trunk0 trunkport bnx1
ifconfig trunk0 -trunkport bnx0

Plusieurs protocoles sont supportés par OpenBSD dans le cas d’interfaces agrégées:

  • broadcast: envoi/réception des trames sur tous les ports
  • failover: une seule interface est maître, les autres sont la en backup
  • lacp: toutes les interfaces sont comme une seule, augmentant le débit et fournissant de la redondance (802.3ad)
  • loadbalance: répartit la charge par le biais d’algorithmes de hash sur les en-têtes
  • none: désactive le trafic sans pour autant éteindre l’interface elle-même
  • roundrobin: répartit la charge dynamiquement dans l’ordre des interfaces

Il est possible de modifier le mode d’agrégation par le biais de la commande:

ifconfig trunk0 trunkproto lacp

Interface virtuelle type tunnel

OpenBSD supporte nativement 2 types de tunnels, GIF et GRE. Le type de tunnel est déterminé par le nom que vous donnerez à l’interface à sa création. Ces deux types de tunnels sont des tunnels sans état. Ils sont très légers, mais en cas d’interruption de la liaison entre les 2 points, ils agiront comme des trous noirs. L’idéal est d’utiliser un protocole de routage dynamique, qui se chargera de couper le trafic entre les 2 LAN reliés par le tunnel lorsque la liaison sera interrompue.

ifconfig gif12 create
ifconfig gre2 create
ifconfig gre2 10.0.0.1/32

Passons à la configuration. Chaque tunnel a besoin d’une source et d’une destination:

ifconfig gre2 tunnel 10.4.5.1 192.168.6.2

Pour supprimer le tunnel:

ifconfig gre2 deletetunnel 10.4.5.1 192.168.6.2

Dans le cas particulier de GRE, il est possible d’activer la fonction keepalive, permettant d’assurer que le lien existe, et de mettre le flag à down si ce n’est pas le cas. Le keepalive nécessite un intervalle de temps ainsi qu’un nombre d’échec acceptable (2 minimum)

ifconfig gre2 keepalive 60 6

Pour finir, il est possible de définir un domaine de routage spécifique au tunnel

ifconfig gre2 tunneldomain 2

Interface virtuelle type vlan

Les interfaces de type VLAN permettent l’encapsulation 802.1Q des paquets, ce qui permet d’avoir plusieurs réseaux tagués sur la même interface physique.

Une interface de type trunk s’appuie sur une interface physique. Il n’est pas obligé que le nom de l’interface soit le même que le tag appliqué (sur 12 bits, 1-4095), néanmoins pour des cohérences d’administration je vous le recommande. La configuration est triviale:

ifconfig vlan452 create
ifconfig vlan452 vlan 452 vlandev bnx0

Sources:

http://www.kernel-panic.it/openbsd/carp/carp4.html http://www.undeadly.org/cgi?action=article&sid=20080909151202 http://www.countersiege.com/doc/pfsync-carp/