5. Configuration PPPoE d'un routeur Spoke

Dans le scénario défini dans la Section 3, « Topologie Hub & Spoke - Protocole PPPoE », ce routeur ne peut accéder aux autres réseaux que par le routeur Hub. Son interface WAN joue donc le rôle de route par défaut pour le réseau local Branch. Ce genre de routeur est aussi appelé routeur d'extrémité.

5.1. Côté réseau étendu - WAN

Cette partie vient en vis-à-vis de la Section 4.1, « Côté réseaux étendus - WAN » d'un routeur Hub. Le routeur Spoke utilise lui aussi un démon pppd sur le VLAN Data pour établir une session PPP avec le routeur Hub. À la différence de ce dernier, il n'est pas à l'initiative du dialogue PPPoE mais il doit être capable de gérer l'encapsulation des trames PPP sur un réseau local Ethernet.

Q22.

Comment utiliser l'encapsulation des trames PPP dans Ethernet à partir du démon pppd fourni avec le paquet ppp ?

Rechercher dans le répertoire de documentation du paquet ppp.

Dans le répertoire /usr/share/doc/ppp/, on trouve le fichier README.pppoe qui indique que l'appel au module rp-pppoe.so permet d'encapsuler des trames PPP sur un réseau local Ethernet.

Toujours à partir du même répertoire, on trouve dans la liste des fichiers d'exemples de configuration un modèle adapté à notre contexte : peers-pppoe.

Q23.

Dans quel fichier sont stockés les paramètres d'identité et d'authentification utilisés par le protocole CHAP ?

Consulter les pages de manuels du démon pppd à la section AUTHENTICATION.

C'est le fichier /etc/ppp/chap-secrets qui contient les couples login/password utilisés lors de l'authentification.

Voici un exemple du contenu de ce fichier. Le nom du client ainsi que son mot de passe secret doivent être identiques à chaque extrémité de la session PPP.

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
"spoke1"        *       "5p0k3-1-53cr3t"        *

Q24.

Quelles sont les options de configuration du démon pppd à placer dans le fichier /etc/ppp/peers/pppoe-provider pour assurer l'établissement de la session PPP entre les routeurs ?

Utiliser le fichier exemple PPPoE fourni avec la documentation du paquet ppp.

Voici une copie du fichier /etc/ppp/peers/pppoe-provider avec les options correspondant au contexte d'un routeur Spoke.

# There should be a matching entry with the password in /etc/ppp/chap-secrets.
user "spoke1"

# Load the PPPoE plugin.
plugin rp-pppoe.so

# Ethernet interface to which the modem is connected.
vlan26

# Assumes that your IP address is allocated dynamically by the ISP.
noipdefault
# Try to get the name server addresses from the ISP.
usepeerdns
# Use this connection as the default route.
defaultroute

# Makes pppd "dial again" when the connection is lost.
persist

# Do not ask the remote to authenticate.
noauth

debug
+ipv6

Q25.

Comment lancer le démon pppd pour qu'il prenne en compte les paramètres définis dans le fichier complété à la question précédente ?

Consulter les pages de manuels du démon pppd.

C'est l'option file qui permet de désigner le fichier de configuration à utiliser. Voici une copie d'écran du lancement de pppd.

# pppd file /etc/ppp/peers/pppoe-provider

Q26.

Quels sont les noms des deux sous-couches du protocole PPP qui apparaissent dans les journaux systèmes ? Quels sont les rôles respectifs de ces deux sous-couches ?

Consulter la page Point-to-Point Protocol.

La consultation des journaux système lors du dialogue PPP fait apparaître des informations suivantes.

pppd[18]:  dst e6:92:9d:7a:9a:98  src b8:ca:3a:9e:85:56
pppd[18]:  [service-name]
pppd[18]: PADS: Service-Name: ''
pppd[18]: PPP session is 3
pppd[18]: Connected to b8:ca:3a:9e:85:56 via interface vlan26
pppd[18]: using channel 40
pppd[18]: Using interface ppp0
pppd[18]: Connect: ppp0 <--> vlan26
pppd[18]: sent [LCP ConfReq id=0x1 <mru 1492> <magic 0xd9acc3c9>]
pppd[18]: rcvd [LCP ConfReq id=0x1 <mru 1492> <auth chap MD5> <magic 0xf7fb217b>]
pppd[18]: sent [LCP ConfAck id=0x1 <mru 1492> <auth chap MD5> <magic 0xf7fb217b>]
pppd[18]: sent [LCP ConfReq id=0x1 <mru 1492> <magic 0xd9acc3c9>]
pppd[18]: rcvd [LCP ConfAck id=0x1 <mru 1492> <magic 0xd9acc3c9>]
pppd[18]: sent [LCP EchoReq id=0x0 magic=0xd9acc3c9]
pppd[18]: rcvd [LCP EchoReq id=0x0 magic=0xf7fb217b]
pppd[18]: sent [LCP EchoRep id=0x0 magic=0xd9acc3c9]
pppd[18]: rcvd [CHAP Challenge id=0x3 <330acf7fa955f3bf549595f45a700c00fe8b7bf934198b>, name = "corellia"]
pppd[18]: sent [CHAP Response id=0x3 <4b3c887e7581087b5d97718f91d1a372>, name = "spoke1"]
pppd[18]: rcvd [LCP EchoRep id=0x0 magic=0xf7fb217b]
pppd[18]: rcvd [CHAP Success id=0x3 "Access granted"]
pppd[18]: CHAP authentication succeeded: Access granted
pppd[18]: CHAP authentication succeeded
pppd[18]: peer from calling number B8:CA:3A:9E:85:56 authorized
pppd[18]: sent [IPCP ConfReq id=0x1 <addr 0.0.0.0> <ms-dns1 0.0.0.0> <ms-dns2 0.0.0.0>]
pppd[18]: sent [IPV6CP ConfReq id=0x1 <addr fe80::bc5e:a5f6:6402:1a31>]
pppd[18]: rcvd [CCP ConfReq id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
pppd[18]: sent [CCP ConfReq id=0x1]
pppd[18]: sent [CCP ConfRej id=0x1 <deflate 15> <deflate(old#) 15> <bsd v1 15>]
pppd[18]: rcvd [IPCP ConfReq id=0x1 <compress VJ 0f 01> <addr 192.168.1.29>]
pppd[18]: sent [IPCP ConfRej id=0x1 <compress VJ 0f 01>]
pppd[18]: rcvd [IPV6CP ConfReq id=0x1 <addr fe80::34a0:f09f:e323:94be>]
pppd[18]: sent [IPV6CP ConfAck id=0x1 <addr fe80::34a0:f09f:e323:94be>]
pppd[18]: rcvd [IPCP ConfNak id=0x1 <addr 192.168.1.30> <ms-dns1 172.16.16.2> <ms-dns2 172.16.16.2>]
pppd[18]: sent [IPCP ConfReq id=0x2 <addr 192.168.1.30> <ms-dns1 172.16.16.2> <ms-dns2 172.16.16.2>]
pppd[18]: rcvd [IPV6CP ConfAck id=0x1 <addr fe80::bc5e:a5f6:6402:1a31>]
pppd[18]: local  LL address fe80::bc5e:a5f6:6402:1a31
pppd[18]: remote LL address fe80::34a0:f09f:e323:94be
pppd[18]: Script /etc/ppp/ipv6-up started (pid 18817)
pppd[18]: rcvd [CCP ConfAck id=0x1]
pppd[18]: rcvd [CCP ConfReq id=0x2]
pppd[18]: sent [CCP ConfAck id=0x2]
pppd[18]: rcvd [IPCP ConfReq id=0x2 <addr 192.168.1.29>]
pppd[18]: sent [IPCP ConfAck id=0x2 <addr 192.168.1.29>]
pppd[18]: rcvd [IPCP ConfAck id=0x2 <addr 192.168.1.30> <ms-dns1 172.16.16.2> <ms-dns2 172.16.16.2>]
pppd[18]: local  IP address 192.168.1.30
pppd[18]: remote IP address 192.168.1.29
pppd[18]: primary   DNS address 172.16.16.2
pppd[18]: secondary DNS address 172.16.16.2
pppd[18]: Script /etc/ppp/ip-up started (pid 18819)
pppd[18]: Script /etc/ppp/ipv6-up finished (pid 18817), status = 0x0
pppd[18]: Script /etc/ppp/ip-up finished (pid 18819), status = 0x0

Q27.

Quels sont les en-têtes du dialogue qui identifient les requêtes (émises|reçues), les rejets et les acquittements ?

Consulter les journaux système contenant les traces d'une connexion PPP.

La copie d'écran donnée ci-dessus fait apparaître les directives Conf* pour chaque paramètre négocié.

  • ConfReq indique une requête.

  • ConfAck indique un acquittement.

  • ConfNak indique un rejet.

5.2. Côté réseau local - LAN fictif

En théorie, le réseau local d'extrémité desservi par le routeur Spoke suppose l'ajout d'un commutateur et de plusieurs hôtes pour caractériser l'interconnexion des différents réseaux de la topologie étudiée dans ces travaux pratiques. Pour éviter l'utilisation de matériel supplémentaire qui demande des étapes de configuration longues et non pertinentes, on utilise une technique très répandue : les interfaces de boucles locales. Ces interfaces viennent se substituer au réseau local d'extrémité.

L'ajout et la configuration d'une interface de boucle locale provoque l'arrivée d'une nouvelle entrée dans la table de routage du routeur Spoke. Vu des autres réseaux de la topologie, cette technique permet de qualifier le bon fonctionnement d'un service Internet sans ajouter de matériel. Dans le cas de ces travaux pratiques, c'est le service Web qui est utilisé pour valider la disponibilité d'un réseau au niveau application.

Q28.

Quelles sont les opérations à effectuer pour pouvoir utiliser des interfaces réseau virtuelles de type boucle locale sur un système GNU/Linux ?

Avec le noyau Linux, il est conseillé d'utiliser des interfaces de type dummy pour ce genre d'usage. Consulter les pages de manuels ma ip-link pour obtenir la syntaxe de création d'une interface de ce type.

On commence par créer une interface à l'aide de l'instruction suivante.

# ip link add dummy0 type dummy

On passe ensuite à la configuration de l'interface dummy0 comme dans l'exemple qui suit.

# ip link set dev dummy0 up
# ip addr add 10.2.6.1/28 brd + dev dummy0
# ip -6 addr add 2001:678:3fc:1a::1/64 dev dummy0
# ip addr ls dev dummy0
7: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 \
                        qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether ce:9f:3e:c1:c5:e2 brd ff:ff:ff:ff:ff:ff
    inet 10.2.6.1/28 brd 10.2.6.15 scope global dummy0
       valid_lft forever preferred_lft forever
    inet6 2001:678:3fc:1a::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::cc9f:3eff:fec1:c5e2/64 scope link
       valid_lft forever preferred_lft forever

Q29.

Quelles sont les opérations à effectuer pour installer un service Web en écoute exclusivement sur les adresses IPv4 et IPv6 de l'interface dummy0 ?

Installer le paquet lighttpd et modifier sa configuration pour que le service ne soit accessible que sur les adresses de l'interface dummy0.

# aptitude install lighttpd
<snipped/>

On modifie ensuite le fichier de configuration /etc/lighttpd/lighttpd.conf de façon à limiter l'accès aux adresses voulues.

# cd /etc/lighttpd/
# diff -uBb lighttpd.conf.orig lighttpd.conf
--- lighttpd.conf.orig  2018-10-07 16:37:55.579183757 +0200
+++ lighttpd.conf       2018-10-07 16:33:31.093675213 +0200
@@ -22,6 +22,9 @@
 compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

 # default listening port for IPv6 falls back to the IPv4 port
-include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
+#include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
 include_shell "/usr/share/lighttpd/create-mime.assign.pl"
 include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
+
+server.bind = "10.2.6.1"
+$SERVER["socket"] == "[2001:678:3fc:1a::1]:80" { server.use-ipv6 = "enable" }

On redémarre le service et on affiche la liste des prises réseau ouvertes sur le système pour confirmer que les adresses choisies sont bien prises en compte.

# systemctl restart lighttpd

# lsof -i tcp:80
COMMAND    PID     USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
lighttpd 25745 www-data    4u  IPv4 4990017      0t0  TCP 10.2.6.1:http (LISTEN)
lighttpd 25745 www-data    5u  IPv6 4990018      0t0  TCP [2001:678:3fc:1a::1]:http (LISTEN)

Q30.

Comment valider l'accès à ce service Web au niveau du routeur Spoke ?

Il s'agit de faire un test au niveau de la couche application. À la console, les deux outils adaptés sont wget et curl.

Voici deux exemples de tests avec wget.

$ wget -O /dev/null http://10.2.6.1
--2018-10-07 16:50:16--  http://10.2.6.1/
Connexion à 10.2.6.1:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 3378 (3,3K) [text/html]
Sauvegarde en : « /dev/null »

/dev/null    100%[======================>]   3,30K  --.-KB/s    ds 0s

2018-10-07 16:50:16 (267 MB/s) — « /dev/null » sauvegardé [3378/3378]
$ wget -O /dev/null http://[2001:678:3fc:1a::1]
--2018-10-07 16:51:38--  http://[2001:678:3fc:1a::1]/
Connexion à [2001:678:3fc:1a::1]:80… connecté.
requête HTTP transmise, en attente de la réponse… 200 OK
Taille : 3378 (3,3K) [text/html]
Sauvegarde en : « /dev/null »

/dev/null    100%[======================>]   3,30K  --.-KB/s    ds 0s

2018-10-07 16:51:38 (193 MB/s) — « /dev/null » sauvegardé [3378/3378]