Documentation Rhizome

Documentation de l'association Rhizome, contribution bienvenue !

Outils pour utilisateurs

Outils du site


Panneau latéral

technique:routeur:configuration_routeur_linux

Routeur IP Rhizome

Si le routeur est un dreamplug, voir Prise en main dreamplug pour la configuration initiale. Pour comprendre l'adressage Rhizome de manière globale, voir adressage
La configuration du routage IPv6 est traitée dans un autre document : Routeur IPv6, de même pour la mise en place de la qualité de service en fair-queueing pour le partage de bande passante.

On passe maintenant à la configuration du dreamplug comme routeur IP. D'un côté, le réseau Rhizome (AP sur adresses privées et abonnés sur adresses publiques). Côté FDN,

  • Une adresse IPv4 publique est attribuée par le radius de FDN au modem (80.67.177.XX/32) ;
  • un bloc de 16 adresses (80.67.175.YY/28) est routé sur chaque ligne ADSL ;

On veut :

  • Que les abonnés soient routés vers internet
  • Que les AP sur le réseau privé ne soient pas routés vers internet
  • Qu'il n'y ait pas de routage entre le réseau abonné et le réseau backbone

Au niveau interfaces réseau, on aura à la fin de cette partie :

  • wlan0: désactivé
  • eth0: 10.42.0.0/16 (backbone radio, réseau privé des access-points).
  • eth0:abo : réseau des IPs publiques des abonnés routés sur cette connexion ADSL (80.67.YY.YY/28)
  • ppp0: 80.67.XX.XX/32 ptp (adresse attribuée par FDN via le modem), interface WAN, route par défaut.
  • eth1: 192.168.2.100/32 ptp (modem, adressage privé, pour configuration uniquement)

Il faut brancher le câble ethernet sur le port 1 du modem.

Configuration PPP/ADSL

Configurer le modem (cf modem)

  • Pour qu'il ne serve pas de DHCP,
  • Qu'il aie une adresse LAN statique 192.168.2.1
  • Qu'il fonctionne en mode bridge
  • Le brancher sur eth1 du dreamplug
pppoeconf

Puis se laisser guider (les choix par défaut conviennent très bien)! Les identifiants de connexion sont ceux envoyés par FDN par mail (XXX@fdn.nerim).

Mémo des commandes ppp :

  • Activer la connexion : pon dsl-provider
  • Désactiver: poff dsl-provider
  • Regarder le journal PPP plog

À l'issue de cette phase, le routeur devrait avoir un accès internet…

gingembre:~# ping -c1 -q 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
--- 8.8.8.8 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 45.889/45.889/45.889/0.000 ms

Reste à permettre aux abonnés d'être routés par cette interface.

Configuration réseau complète

Fichier /etc/network/interfaces

# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or
# /usr/share/doc/ifupdown/examples for more information.

auto lo
iface lo inet loopback

## eth0 - Interface backbone Rhizome
#
# Réseau privé des points d'accès radio
auto eth0
iface eth0 inet static
	address 10.42.12.2
	netmask 255.255.0.0


## eth0:abo Réseau abonnés
#
# Réseau des abonnés, contient les adresses publiques
# (quand on les aura, NAT en attendant…)
auto eth0:abo
iface eth0:abo inet static
	address 80.67.175.129
	netmask 255.255.255.240

## eth1:modem admin modem
#
# Le modem (son interface web/telnet)
# est accessible sur 192.168.2.1
auto eth1:modem
iface eth1:modem inet static
	address 192.168.2.2
	pointopoint 192.168.2.1
	netmask 255.255.255.255

## ppp0 interface WAN (ADSL FDN)
#
# Concerne le modem. L'activation de cette interface
#  - connecte le modem au réseau FDN
#  - crée une interface ppp0
#
# Ces lignes ont été créées automatiquement par la commande pppoeconf
auto dsl-provider
iface dsl-provider inet ppp
	pre-up /sbin/ifconfig eth1 up # line maintained by pppoeconf
	provider dsl-provider         # idem
	# configuration du pare-feu, cf partie suivante
	pre-up iptables-restore < /etc/iptables.up.rules

Routage

Le routage consiste du point de vue de la machine à recevoir un paquet IP qui ne lui est pas adressé et à le relayer vers son destinataire final. Pour savoir par où envoyer un paquet qu'il reçoit, le routeur consulte ses tables de routage.

Typiquement, les tables de routage des routeurs Rhizome vont ressembler à ça (de manière simplifiée):

62.4.16.ZZ/32      ppp0   # Routeur FDN de l'autre côté du tunnel PPP/ADSL (LNS)
80.67.175.128/28   eth0   # Bloc d'IP défini sur le routeur
192.168.2.0/24     eth1   # Réseau privé contenant uniquement le modem (IP d'administration)
10.42.0.0/16       eth0   # Réseau privé du backbone Rhizome (Access-points)
default            ppp0   # Route par défaut : le reste d'internet

La commande ip route permet d'afficher la table de routage courante d'une machine.

Par défaut, le routage est désactivé sous Linux. Pour l'activer :

nano /etc/sysctl.conf

Décommenter la ligne net.ipv4.ip_forward=1

Cela prendra effet au prochain reboot. Pour l'appliquer immédiatement

sysctl -p

Cela active le routage de et vers tous les réseaux. Le pare-feu permet de contrôler plus finement le routage.

Pare-feu

Le pare-feu répond à deux questions :

  • Quels sont les paquets que l'on accepte de router (en fonction de leur source/destination) ?
  • Quels sont les connexion entrantes destinées au routeur lui-même que l'on accepte ?

On utilise le pare-feu netfilter qui est intégré au noyau linux et qui se configure à l'aide des outils iptables.

Routage

On ne veut pas que le réseau backbone (10.42.0.0/16) ait accès à internet, ni que le routage soit effectif entre ce réseau et le réseau abonnés. Idem pour le réseau d'administration du modem.

Ces directives correspondent à la chaine FORWARD du pare-feu netfilter/iptables

Services sur le routeur

On ne veut pas non plus ouvrir le routeur à tous vents. Seuls certains services devront-être accessibles :

  • SSH depuis partout
  • ICMP (pings, rapports d'erreurs…) depuis partout
  • DNS depuis l'intérieur du réseau
  • IGMP (annonces multicast) depuis l'intérieur du réseau

Ces directives correspondent à la chaine INPUT du pare-feu netfilter/iptables

Configuration iptables

Pour simplifier la configuration d'IPtables on va définir des noms de réseau :

Contenu du fichier /etc/networks:

default		0.0.0.0
loopback	127.0.0.0
link-local	169.254.0.0

#blocs FDN
abo0.rhizome-fai.net		80.67.175.128	abo.rhizome-fai.net
abo1.rhizome-fai.net		80.67.175.144
abo2.rhizome-fai.net		80.67.175.160
abo3.rhizome-fai.net		80.67.175.176
backbone.rhizome-fai.net	10.42.0.0

#blocs TTNN
abo4.rhizome-fai.net            91.224.148.176

La configuration IPTables est la suivante

/etc/iptables.up.rules

# /etc/iptables.up.rules
# Script qui démarre les règles de filtrage IPv4
# Formation Debian GNU/Linux par Alexis de Lattre
# http://formation-debian.via.ecp.fr/

# iptables-restore(8) remet implicitement à zéro toutes les règles

# Les instructions qui suivent concernent la table « filter »,
# c'est-à-dire… le filtrage.
*filter

#########################
# Politiques par défaut #
#########################
# Les politiques par défaut déterminent le devenir d'un paquet auquel
# aucune règle spécifique ne s'applique.

# Les connexions entrantes sont bloquées par défaut
-P INPUT DROP
# Les connexions destinées à être routées sont refusées par défaut
-P FORWARD DROP
# Les connexions sortantes sont acceptées par défaut
-P OUTPUT ACCEPT

######################
# Règles de filtrage #
######################
# Nous précisons ici des règles spécifiques pour les paquets vérifiant
# certaines conditions.

# Pas de filtrage sur l'interface de "loopback"
-A INPUT -i lo -j ACCEPT

## Règles relatives au routage ##
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 --source abo0.rhizome-fai.net/28 -j ACCEPT
-A FORWARD --destination abo0.rhizome-fai.net/28 -j ACCEPT


## Règles relatives aux services ##

# Accepter le protocole ICMP (notamment le ping)
-A INPUT -p icmp -j ACCEPT

# Accepter le protocole IGMP (pour le multicast)
-A INPUT -p igmp -j ACCEPT

# Accepter les packets entrants relatifs à des connexions déjà
# établies : cela va plus vite que de devoir réexaminer toutes
# les règles pour chaque paquet.
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Accepter SSH de partout
-A INPUT -p tcp --dport ssh -j ACCEPT

# Accepter DNS depuis les IPs abonnés Rhizome
-A INPUT -i eth0 -p tcp --dport domain --source abo.rhizome-fai.net/26 -j ACCEPT
-A INPUT -i eth0 -p udp --dport domain --source abo.rhizome-fai.net/26 -j ACCEPT

# Accepter les requêtes/réponses DHCP
-A INPUT -i eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

COMMIT

####################
# Problème de MTU… #
####################

# Les instructions qui suivent concernent la table « mangle », c'est
# à dire l'altération des paquets
*mangle

# Règle les différences de MTU entre ppp0 et ethX
-A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS -o ppp0 --clamp-mss-to-pmtu

COMMIT

Il est préférable de tester les règles avant de les appliquer :

iptables-apply <fichier-de-règles>

Puis tester d'établir une nouvelle connexion SSH vers le serveur et répondre à la question…

Cela permet de tester un fichier de règles pendant 30s. Si le nouveau fichier de règles contient une erreur vous coupant le cordon SSH, l'ancien sera rétabli au bout de 30s.

À chaque démarrage, la configuration iptables sera appliquée par la ligne que nous avions placée dans /etc/network/interfaces (ndlr: “pre-up iptables-restore < /etc/iptables.up.rules”).

Attention à ne placer dans le fichier /etc/iptables.up.rules qu'un jeu de règles fonctionnel et testé sous peine de surprise au prochain reboot…

DHCP et DNS avec DNSMasq

DNSMasq joue un double rôle : 

  • Serveur DHCP : il attribue les adresses publiques aux équipements des abonnés et envoie les informations de configuration (route par défaut… etc).
  • Serveur DNS : il reçoit les requêtes de noms de la part des abonnés et y répond. Il résoud réellement les noms des machines abonnées et se contente de transmettre les autres aux serveurs DNS supérieurs (ceux de FDN pour l'instant)

Installer DNSMasq

apt-get intsall dnsmasq

Créer un fichier de conf /etc/dnsmasq.d/rhizome_dhcp pour le DHCP Rhizome (celui par défaut ne fait rien). (On considère que le routeur distribue les IPv4 publiques du bloc 192.0.2.0/24 et qu'il a lui-même dans ce bloc l'adresse 192.0.2.1)

# Fichier de configuration du serveur DHCP + DNS Rhizome
#
##-> DHCP : Attribue les adresses publiques des abonnes a leurs
#           equipements (box ou CPE, selon). N'alloue que des IP fixes
#           et publiques, en fonction de l'adresse MAC. N'alloue pas
#           d'adresses IP a des equipements inconnus (addr MAC).
#

# Ne pas attribuer d'adresse aux equipements inconnus

dhcp-ignore=#known

# On écoute que sur l'interface abonnés
interface=eth0

# La plage d'IP allouee par ce routeur
# -> http://doc.rhizome-fai.net/doku.php?id=technique:adressage

dhcp-range=80.67.175.147,80.67.175.158,60m

# Les correspondances @mac <-> @IP publique sont definies dans
# le fichier /etc/ethers

read-ethers

#
##-> DNS  : Fait office de serveur DNS (relaie vers les DNS FDN)
#           Garde les reponses en cache pour accelerer les suivantes.           


# Ne transfere pas les requetes DNS incompletes
domain-needed

# Ne transfere pas les requetes reverse-DNS sur des adresses privees.
bogus-priv

# les abonnes sont localement accessibles par 
# <nom_equipement>.abo.rhizome-fai.net
domain-suffix=abo.rhizome-fai.net

# Taille du cache DNS
cache-size=256

C'est le fichier ethers qui contient les associations @MAC ↔ @IP. On peut le remplir initialement avec une ligne prête pour chaque IP publique que le routeur est censé distribuer (cf adressage). Par exemple, si le routeur distribue 192.0.2.0/24 et que les IP 192.0.2.3-192.0.2.14 sont pour les abonnés, on peut préparer /etc/ethers comme suit :

# Pour ajouter un abonne, renseigner le commentaire et l'adresse MAC et
# décommenter la ligne contenant l'adresse MAC.

# <nom équipement> (<type équipement> par <nom_routeur> ) - Prénom NOM
#XX:XX:XX:XX:XX 192.0.2.3

# <nom équipement> (<type équipement> par <nom_routeur> ) - Prénom NOM
#XX:XX:XX:XX:XX 192.0.2.4

# <nom équipement> (<type équipement> par <nom_routeur> ) - Prénom NOM
#XX:XX:XX:XX:XX 192.0.2.5

#… etc

# <nom équipement> (<type équipement> par <nom_routeur> ) - Prénom NOM
#XX:XX:XX:XX:XX 192.0.2.14

… Puis redémarrer

/etc/init.d/dnsmasq restart

Il suffira de renseigner et décommenter une ligne pour ajouter les abonnés lors de la configuration du matériel pour un abonné.

Configuration kernel

Ici des options de kernel importantes à avoir actives sur les routeurs :

  • IP_ADVANCED_ROUTER (peut servir à activer rp_filter, inutilisé pour l'instant)
  • IP_MULTIPLE_TABLES (sert à faire du source-routing. Utile notamment pour les VPN ou les routeurs avec de multiple liens vers internet)
  • IPV6_MULTIPLE_TABLES (idem en v6)
  • IPV6_SUBTREE (permet de séparer le source-routing du routing en v6)
  • CONFIG_NET_SCH_INGRESS (permet de faire du QoS ingress)

Cross compilation du noyau

Sources

Au final, la partie la plus compliquée est de trouver des sources du noyau patché / fournies avec les bons patchs et qui fonctionne sur le dreamplug avec notre version de uboot. Ce n'est pas une chose aisée : on trouve facilement des noyaux compilés qui fonctionnent (ou pas !) mais qui n'ont pas les options que l'on souhaite. Les patchs appliqués sont souvent donnés en vrac alors qu'il faut n'en appliquer qu'une partie. La configuration du noyau est parfois manquante.

Voici les sources que l'on utilise pour le moment : http://www.rhizome-fai.net/sources/dreamplug/linux-2.6.33.6_ok.tar.7z

Noyaux avec patchs en vrac : http://www.xilka.com/sheeva/

Compilation

Il est possible de compiler le noyau sur le dreamplug, mais c'est extrêmement long (8H10 contre seulement 6min sur un PC !) et la carte SD a tendance à ne pas apprécier les grosses écritures.

Pour la cross compilation, on peut utiliser le cross compileur gentiment packagé par debian :

apt-get install binutils-arm-linux-gnueabi cpp-arm-linux-gnueabi g++-arm-linux-gnueabi gcc-arm-linux-gnueabi pkg-config-arm-linux-gnueabi uboot-mkimage

Compilation :

export PATH="$PATH:/usr/arm-linux-gnueabi/bin"
make clean
make ARCH=arm menuconfig
make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- uImage
make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules
 
modPath="$PWD/../modules"
mkdir "$modPath"
make -j6 ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules_install firmware_install INSTALL_MOD_PATH="$modPath"

Test par TFTP

Il est possible de tester un noyau sur un dreamplug par TFTP & UART : on indique à uboot de télécharger le noyau par TFTP et de le lancer. De cette façon, on peut tester un noyau sans casser le reste du système.

Installer un TFTP

L'installation d'un serveur TFTP sur votre PC dépend de votre distribution et est très bien documenté sur le net. Il faut placer le fichier uImage dans la racine du serveur TFTP.

Connexion avec le JTAG / UART
  1. Brancher le JTAG sur le port USB, en mode UART (bouton sur le JTAG) et le fil UART au dreamplug
  2. Lancer sudo screen /dev/ttyUSB0 115200 sur le PC
  3. Brancher le dreamplug
  4. Appuyer sur une touche dans la console screen pour stopper le boot normal
Boot par TFTP
setenv netmask 255.255.255.0
setenv ipaddr 192.168.1.30 # IP du dreamplug
setenv serverip 192.168.1.236 # IP du serveur TFTP
 
# Console UART pour le noyau
setenv bootargs console=ttyS0,115200 root=/dev/sda2 rootdelay=10
 
# Téléchargement
tftpboot 0x00800000 uImage
 
# Boot
bootm 0x00800000

Pour info, voici comment booter avec un initrd :

tftpboot 0x00800000 uImage
tftpboot 0x01100000 uInitrd
 
bootm 0x00800000 0x01100000 

Installation sur un dreamplug

# Envoi
scp uImage modules.tar.bz2 root@asperge.rhizome-fai.net:/root/
 
# SSH
ssh root@asperge.rhizome-fai.net
 
# Décompression & droits
mkdir ingressKernel
cd ingressKernel
mv ../modules.tar.bz2 ../uImage .
tar xjvf modules.tar.bz2
chown -R root .
chgrp -R root .
 
# Installation
cp /media/usb1/uImage uImage.back
cp uImage /media/usb1 ## Attention, il semble que uImage se trouve dans usb0 sur certains routeurs !
mv /lib/modules/2.6.33.6 /lib/modules/2.6.33.6.back
cp -a modules/lib/modules/2.6.33.6 /lib/modules
sync
 
# Vérification (à vérifier avec le uImage du PC)
md5sum /media/usb1/uImage 
#8a0e7390be64085071f722915d23ec0f  /media/usb1/uImage
 
# Reboot (on croise les droits)
reboot

Routage inter-routeur

Il serait dommage de faire passer les paquets échangés entre les abonnés de deux points fixes par internet. On met donc en place un routage entre les points fixes. En théorie, il faudrait mettre en place des IP publiques pour le routage, mais malheureusement nous n'en avons pas assez. Nous utiliserons donc le réseau en 10.42 pour le routage.

Voici la marche à suivre :

Trouver le bloc du routeur

cat /etc/network/interfaces
 
# On utilise ipcalc pour faire le calcule
ipcalc 80.67.175.161 255.255.255.240
# => Network:   80.67.175.160/28
 
# On fait de même sur gingembre
# On a donc :
# Sur bambou :
# abo1 : 80.67.175.160/28
# ip backbone : 10.42.12.1
#
# Sur gingembre :
# abo1 : 91.224.148.176/28 => On ne s'en occupe pas pour le moment (le routage sur gingembre est spécial pour ce block avec un retouge selon la source)
# abo2 : 80.67.175.128/28
# ip backbone : 10.42.12.2

Mise en place des routes

# Routage sur bambou
ip route add 80.67.175.128/28 via 10.42.12.2
 
# Sur gingembre
ip route add 80.67.175.160/28 via 10.42.12.1

Ajout des routes au démarrage de l'interface

# Ajout dans la conf (pour que les routes soient effectives au demarrage des routeurs)
# Sur gingembre, on ajoute dans l'interface eth0:abo grâce à nano /etc/network/interfaces
        post-up ip route add 80.67.175.160/28 via 10.42.12.1
# La route sera définie dès que l'interface sera up
 
# Sur bambou
        post-up ip route add 80.67.175.128/28 via 10.42.12.2

Références

technique/routeur/configuration_routeur_linux.txt · Dernière modification: 2017/08/27 13:29 par tfleuran