Table des matières

Routage conditionnel avec OpenBSD

Introduction

Ceci est une grande qualité de PF : Le pouvoir de faire des choses qui peuvent paraître compliquées techniquement au premier abord, mais qui finalement, se résument à une ligne de configuration.

Ce que j'appelle ici routage conditionnel se représente de la manière suivante :

Cas classique :

  1. La machine a souhaite joindre la machine B sur un port TCP particulier.
  2. Le firewall décide de savoir si il doit laisser passer cette communication.
  3. Les tables de routage décident par la suite par quelle interface et quelle passerelle doit passer le paquet.

Le cas présenté ici :

  1. La machine a souhaite joindre la machine B sur un port TCP particulier.
  2. Le firewall décide de savoir si il doit laisser passer cette communication, et l'envoie directement sur l'interface et à la passerelle qui va bien , indépendemment de la route définie table de routage.

Dans la pratique

Admettons maintenant que l'on ait deux connexions à internet , mais une seule route par défaut sur la passerelle (au hasard, la plus performante), et un deuxième accès , muni d'un débit plus élevé. On souhaite répartir la charge :

Dans le cas classique, il faut bien souvent avoir plusieurs tables de routage et marquer les packets pour que la le processus de routage puisse comprendre que ce packet est destiné à telle interface à telle passerelle. Sous linux, on utilise la table mangle du firewall iptables pour marquer le paquet réseau, et iproute2 pour gérer le routage en fonction du marquage pour se faire, et si on a beaucoup d'interfaces, de règles de firewall, et de passerelles à contacter, cela devient vite ingérable.

Avec un Openbsd, on simplifie grandement les choses. Puisque tout peut être géré par le simple PF.

Exemple :

La machine a veut contacter la machine B sur le port 80, mais il faut que les paquets passent par l'interface vlan201 et l'adresse de passerelle 172.18.1.9. Cela se résume à la ligne suivante :

pass in quick on $inf_if inet proto tcp from $machine_a to $machine_b port 80 route-to (vlan201 172.18.1.9) keep state

Cas des routes assymétriques

Toujours dans notre configuration précédente de deux accès ) internet, route par défaut sur le vlan 200 , passerelle 172.18.1.1 et accès secondaire sur le vlan 201, passerelle 172.18.1.9.

Mais une connexion entrante de l'internet arrive sur l'interface qui n'est pas la route par défaut, parce que l'on a par exemple inscrit les adresses IP de nos deux accès internet dans un enregistrement DNS , pour équilibrer la charge.

Le comportement classique est que le paquet entrant arrive bien sur la machine à laquelle il est destiné, mais lorsque le paquet de réponse part, il sort par la route par défaut , et la : Problème , surtout si ce sont deux opérateurs différents.

PF a une solution à cela : avec le mot clé reply-to

Exemple :

Nous avons deux accès internet : un principal (vlan200 : 172.18.1.1), car c'est celui qui a une latence meilleure, et un accès secondaire (vlan201 : 172.18.1.9), celui qui a un débit supérieur. Les enregistrements DNS font que, des paquets entrants peuvent arriver sur l'interface secondaire (équilibrage de charge par exemple).

Notre route par défaut reste toujours sur l'interface vlan200, et le paquet entrant arrive par l'interface vlan201.

Voici le parcours de notre paquet entrant :

Internet ⇒ Routeur d'accès 2vlan201 ⇒ firewall ⇒ Machine

Lorsque le paquet repart :

Machine ⇒ firewall ⇒ vlan200 ⇒ Routeur d'accès 1Perte du paquet dans les méandres d'internet

Pour cela , on traite ces paquets de la manière suivante :

pass in on vlan201 inet proto tcp from any to $machine port www reply-to ( vlan201 172.18.1.9 ) keep state

Pages relatives