Routage

De Wiki LDN
Aller à : navigation, rechercher

Interfaces

Configuration détaillée du fichier /etc/network/interfaces de la machine de routage.

Boucle locale :

# Boucle locale
auto lo

iface lo inet loopback

Les adresses de la machine (issues des blocs du FAI) sont définies sur une interface dummy pour que la machine puisse sortir avec d'autres IP que celles d'interco (même si certains semblent considérer qu'on devrait les utiliser pour sortir, WideVOIP les filtre en sortie) :

# Adresses de la machine de routage
auto dummy0

iface dummy0 inet6 static
       address 2a00:5881:8100::1
       netmask 128

iface dummy0 inet static
       address 89.234.141.1
       netmask 255.255.255.255

Le VLAN 801 a été proposé par WideVOIP pour accueillir les annonces BGP de ARN et récupérer le transit ARN. Les IP d'interco que WideVOIP a fournies sont utilisées ici :

# VLAN transit de ARN
auto eth0.801

iface eth0.801 inet6 static
       address 2a00:1bf8:600:2:632:6:630:1
       netmask 80
 
iface eth0.801 inet static
       address 92.43.131.197
       netmask 255.255.255.248

Le second port ethernet est relié directement à la machine de services (l'IPv6 de lien local suffit, et le réseau privé IPv4 disparaîtera probablement par la suite) :

# Interco avec la machine de services
auto eth1

iface eth1 inet6 auto

iface eth1 inet static
       address 10.0.0.254
       netmask 255.255.255.0

Annonces BGP

Après une hésitation entre Quagga et Bird, nous avons tranché pour ce second principalement sur la base de témoignages concernant des problèmes rencontrés avec ce premier.

IPv6

Installer bird6 (version 1.3.7-1 sur wheezy) sur la machine de routage :

# apt-get install bird6

Configuration détaillée du fichier /etc/bird6.conf.

Le router id est utilisé en tant qu'identifiant pour résoudre les conflits des sessions BGP. Il sera utilisé comme un simple entier, mais la convention impose d'utiliser une adresse IP (de son propre bloc) pour en assurer l'unicité. La documentation de bird6 stipule que ça doit être une adresse IPv4 (même pour le BGP IPv6) et qu'il vaut mieux utiliser la plus petite :

router id 92.43.131.197;

Définition des constantes qui serviront par la suite (ici les numéros d'AS) :

define asarn = 60630;

Possibilité d'avoir des journaux en temps réel pour débugguer :

# log "/tmp/bird6.log" all;
# debug protocols whichwan;

Définition du range à annoncer :

protocol static static_arn_subnet {
#	debug all;
	route 2a00:5881:8100::/40 reject;
}

Un filtre est créé par sous-réseau du FAI pour avoir l'assurance qu'il n'y a aucune autre destination de la table de routage qui soit annoncée :

filter arn_subnet {
       if (net ~ [2a00:5881:8100::/40]) then accept;
       else reject;
}

Le filtre anonyme qui a été utilisé à la place du export all permet de fixer la valeur de l'option krt_prefsrc, destinée à demander à ce que la table de routage soit construite en forçant les sorties directement depuis le routeur (par exemple les mises à jour du système) avec une adresse des blocs du FAI plutôt que l'IP d'interco (conséquence du filtrage en sortie des IP d'interco par WideVOIP) :

protocol kernel {
#      persist;                # Don't remove routes on bird shutdown
       scan time 20;           # Scan kernel routing table every 20 seconds

#      export all;
       export filter {
               krt_prefsrc = 2a00:5881:8100::1;
               accept;
       };
}

protocol device {
       scan time 10;           # Scan interfaces every 10 seconds
}

Configuration BGP, avec le neighbor qui est l'adresse fournie par WideVOIP, correspondant à l'autre bout de l'interco, et l'AS de ce dernier. On retrouve le filtre avec krt_prefsrc malgré que la documentation de Bird ne liste pas cet attribut dans ceux correspondant au protocole bgp (mystère à élucider). Les filtres pour les annonces sont utilisés ici pour conditionner les exports de la table de routage vers le protocole bgp :

protocol bgp whichwan {
#      debug all;
       description "upstream whichwan";

       local as asarn;
       neighbor 2a00:1bf8:600:2:632:6:630:61 as 42456;

#      import all;
       import filter {
               krt_prefsrc = 2a00:5881:8100::1;
               accept;
       };
       export filter arn_subnet;
}

IPv4

Installer bird (version 1.3.7-1 sur wheezy) sur la machine de routage :

# apt-get install bird

Configuration du fichier /etc/bird.conf (similaire à la configuration pour IPv6) :

router id 92.43.131.197;

define asarn = 60630;

# log "/tmp/bird.log" all;
# debug protocols whichwan;

filter arn_subnet {
       if (net ~ [89.234.141.0/24]) then accept;
       else reject;
}

protocol static static_arn_subnet {
#	debug all;

route 89.234.141.0/24 reject;

}

protocol kernel {
#      persist;                # Don't remove routes on bird shutdown
       scan time 20;           # Scan kernel routing table every 20 seconds

#      export all;
       export filter {
               krt_prefsrc = 89.234.141.1;
               accept;
       };
}

protocol device {
       scan time 10;           # Scan interfaces every 10 seconds
}

protocol bgp whichwan {
       debug all;
       description "upstream whichwan";

       local as asarn;
       neighbor 92.43.131.193 as 42456;

#      import all;
       import filter {
               krt_prefsrc = 89.234.141.1;
               accept;
       };

       export filter arn_subnet;
}

Validation et tests

Relancer les interfaces :

# service networking restart

Pour vérifier la syntaxe et appliquer les changements de l'un des deux fichiers de configuration (inutile de relancer le service ensuite, sauf s'il y a des modifications sur les filtres, pour refiltrer la table actuelle) de Bird :

# birdc6
BIRD 1.3.7 ready.
bird> conf
Reading configuration from /etc/bird6.conf
Reconfiguration in progress.
# birdc
BIRD 1.3.7 ready.
bird> conf
Reading configuration from /etc/bird.conf
Reconfiguration in progress.

Les tables de routage devraient se remplir petit à petit jusqu'à atteindre ces ordres de grandeur :

# ip -6 r | wc -l
13349
# ip -4 r | wc -l
453861

Dans l'autre sens, une visite dans un looking glass devrait faire apparaître petit à petit les AS du FAI aux quatre coins du monde.

Mode routeur

S'assurer que le fichier /etc/sysctl.conf contient bien :

net.ipv6.conf.all.forwarding=1
net.ipv4.ip_forward=1

Activer :

# sysctl -p /etc/sysctl.conf

À faire

Il reste :

  • plein de vérifs à ajouter (préfixes réservés, etc.) ;
  • l'AS et les blocs LDN (dès qu'on les aura) ;
  • le peering EuroGIX (dès qu'on aura les IP d'interco) ;
  • what else?