Linux Dial-On-Demand mini-HOWTO <author>Rodney van den Oever, <tt/Rodney.van.den.Oever@tip.nl/ <date>Version 1.0, 28 Juillet 1996 mise à jour le 29 février 1997 <abstract> (Adaptation française par Olivier Fourmaux, <tt/Olivier.Fourmaux@lip6.fr/, 28 Novembre 1997). Mini-HOWTO décrivant comment utiliser une machine de son réseau local comme routeur PPP avec connexion à la demande. Le <bf/dial-on-demand/ correspond à l'utilisation au besoin du modem, soit littéralement : <em/composition à la demande/ que nous traduisons en <bf/connexion à la demande/. </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>Préambule <sect1>Blabla légal <p>(C)opyright 1997 Olivier Fourmaux pour la version française. Toute ressemblance avec les docs Linux de mon co-burote et néanmoins ami Christophe Deleuze, traducteur forcené depuis sa tendre enfance, serait purement fortuite. <sect1>Blabla de l'auteur (<em/Disclaimer/) <p>Ce document décrit une configuration qui fonctionne pour moi, utilisez la à vos propres risques. S'il manque quoi que ce soit d'important ou si quelque chose est complètement faux, s'il vous plait, communiquez le moi ! <p>Une chose que l'on peut rajouter, c'est la manière de configurer un serveur de noms local. <sect1>Blabla du traducteur <p>Les commentaires sur la traduction sont à envoyer à Olivier Fourmaux, <tt/Olivier.Fourmaux@lip6.fr/. De même si vous trouvez des erreurs de fond, demandez moi d'abord, j'ai peut-être traduit un peu vite :) <sect>Introduction<label id="intro"> <p>Ce document décrit comment gérer une connexion <em/dial-on-demand/ et comment utiliser un hôte Linux connecté à un réseau local en tant que <em/routeur PPP/ gérant la connexion à la demande. <p>Le <em/kerneld-mini-HOWTO/ décrit déjà comment kerneld (daemon du noyaux linux) exécute le script <tt/request-route/ pour l'ajout dynamique de route. Pour plus d'information, le <em/kerneld-mini-HOWTO/ existe en francais. Ici nous ne décrivons qu'une configuration détaillé adaptée à l'ajout de route avec une connexion modem. <p>Si vous utilisez un petit réseau local chez vous, la connexion à la demande fournit une solution intéressante de gestion transparente d'un accès Internet pour plusieurs machines. <tscreen><verb> ______________________________ __|__ ___|___ Liens PPP vers le | | réseau local | | ______ fournisseur d'accès | PC | 192.168.1.0 |Routeur|--| modem|------------------> | | | Linux | |______| x.x.x.x |_____| |_______| (adresse IP named dynamique) pppd </verb></tscreen> <p>Cette configuration nécessite : <itemize> <item>Noyau 2.0.0 ou plus récent <item><tt/ppp-2.2.0f.tar.gz/ ou plus récent <item><tt/modules-2.0.0.tar.gz/ ou plus récent <item><tt/ipfwadm-2.3.tar.gz/ (<tt>http://www.xos.nl/linux/ipfwadm</tt>) </itemize> <p>Les étapes suivantes sont à réaliser : <enum> <item>Configuration du noyau <item>Installation des modules <item>Installation de PPP <item>Configuration du port série et du modem <item>Configuration de PPP <item>Installation de la connexion à la demande <item>Configuration du réseau <item>Configuration de l' IP-Masquerade <item>Configuration des stations </enum> <sect>Configuration du Noyau <p>Avant tout, il faut compiler un noyau avec <em/kerneld/, <em/PPP/ et <em/IP-masquerade/. Ci-dessous sont indiquées les options nécessaires pour cette configuration (en Majuscule), les autres options réseau telles que <em/firewall logging/ ou <em/transparent proxying/ peuvent être choisies mais ne sont pas obligatoires. <tscreen><verb> cd /usr/src/linux make config </verb></tscreen> ou <tscreen><verb> make menuconfig </verb></tscreen> <code> * * Code maturity level options * Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [Y/n/?] * * Loadable module support * Enable loadable module support (CONFIG_MODULES) [Y/n/?] Set version information on all symbols for modules (CONFIG_MODVERSIONS) [N/y/?] Kernel daemon support (e.g. autoload of modules) (CONFIG_KERNELD) [Y/n/?] * Networking support (CONFIG_NET) [Y/n/?] * * Networking options * Network firewalls (CONFIG_FIREWALL) [Y/n/?] TCP/IP networking (CONFIG_INET) [Y/n/?] IP: forwarding/gatewaying (CONFIG_IP_FORWARD) [Y/n/?] IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?] IP: masquerading (EXPERIMENTAL) (CONFIG_IP_MASQUERADE) [Y/n/?] * * Protocol-specific masquerading support will be built as modules. * IP: always defragment (CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?] IP: optimize as router not host (CONFIG_IP_ROUTER) [Y/n/?] * * Network device support * Network device support (CONFIG_NETDEVICES) [Y/n/?] * PPP (point-to-point) support (CONFIG_PPP) [M/n/y/?] * * CCP compressors for PPP are only built as modules. * Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?] NE2000/NE1000 support (CONFIG_NE2000) [Y/m/n/?] </code> Cette dernière option dépend bien sur de la carte réseau utilisée. <p>Compilez le noyau avec : <tscreen><verb> make zlilo make modules make modules_install </verb></tscreen> <p>Si vous n'utilisez pas LILO, copiez <tt>/usr/src/linux/arch/i386/boot/zImage</tt> à la bonne place pour l'initialisation. Les modules sont installés dans <tt>/lib/modules/x.x.x</tt>, avec <tt/x.x.x/ correspondant à la version du noyau utilisé. <sect>Installation des Modules <p>Les programmes suivants sont nécessaires : <descrip> <tag>/sbin/insmode</tag> Charge les modules nécessaires. <tag>/sbin/rmmod</tag> Supprime les modules inutiles. <tag>/sbin/depmod</tag> Crée les dépendances. <tag>/sbin/kerneld</tag> Extension de <tt/Kerneld/ pour charger les modules automatiquement. </descrip> <p>Si vous ne les avez pas encore, installez les avec : <tscreen><verb> cd /usr/src tar zxf modules-2.0.0.tar.gz make install </verb></tscreen> <p>Pour charger <em/Kerneld/ au démarrage, vous devez éditer <tt>/etc/rc.d/rc.S</tt> ou créer un script <tt/rc.modules/ qui est appelé par <tt/rc.S/. Ajoutez ou modifiez les lignes suivantes : <code> /etc/rc.d/rc.modules: if [ ! -f /lib/modules/`uname -r`/modules.dep ] ; then echo "Updating module dependencies for Linux `uname -r`:" /sbin/depmod -a fi [ -x /sbin/kerneld ] && /sbin/kerneld </code> La première partie vérifie les dépendances des modules et les crée si elles n'existent pas encore. <sect>Installation de PPP <p>Les programmes suivants sont nécessaires pour l'installation d'un lien PPP : <descrip> <tag>/usr/sbin/pppd</tag> Daemon PPP. <tag>/usr/sbin/pppstats</tag> Statistiques PPP. <tag>/usr/sbin/chat</tag> Exécution de scripts. </descrip> <p>A installer avec : <tscreen><verb> cd /usr/src tar zxf ppp-2.2.0f.tar.gz cd ppp-2.2.0f ./configure make kernel </verb></tscreen> <p>Les noyaux récents incluent le code de PPP, <tt/make kernel/ ne remplacera donc rien du tout. Vérifier les fichiers <tt/README/ et <tt/Makefile/ pour le support du kit <em/Shadow/. Exécutez alors : <tscreen><verb> make make install </verb></tscreen> <sect>Configuration du Port Série et du Modem <p>Cette configuration nécessite un modem. La configuration du port serie est réalisée dans le fichier <tt/rc.serial/ : <code> /etc/rc.d/rc.serial: ${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4 ${SETSERIAL} /dev/cua1 uart 16550A port 0x2F8 irq 3 spd_vhi </code> <p>Dans cette configuration, COM1 (<tt/cua0/) est utilisé par la souris et COM2 (<tt/cua1/) par un modem interne à 28,8 kb/s. Le paramètre <tt/spd_vhi/ remplace la valeur <tt/38400 bps/ par <tt/115200 bps/ dans la table des vitesses, de même <tt/spd_hi/ est utilisé pour la valeur <tt/57600 bps/. <p>Il faut utiliser <tt/spd_vhi/ pour un modem a 28,8 kb/s et <tt/spd_hi/ pour un à 14,4 kb/s. Mais on peut démarrer par prudence avec la valeur <tt/38400 bps/. <p>Vérifiez votre configuration modem à l'aide d'un programme de type émulation de terminal, tel que <em/minicom/. Le modem doit afficher (<em/echo/) les caractères frappés. Utilisez <tt/Ctrl-A P/ pour changer les paramètres de communication. Vérifiez si cela fonctionne encore à 57600 ou 115200 b/s. Tapez <tt/ATZ/, le modem devrait répondre <tt/OK/. Utilisez <tt/Ctrl-A X/ pour quitter minicom. <p>Minicom peut aussi être utilisé pour se connecter à son fournisseur de services manuellement. Notez préalablement ce que vous devez taper pour initier la connexion et quelles sont les réponses du serveur distant. Si votre fournisseur de services n'utilise pas PAP ou CHAP (protocoles d'échange de mots de passe), il faudra probablement entrer un nom d'utilisateur et un mot de passe, et peut être aussi une commande pour initialiser la liaison en mode PPP. <sect>Configuration de PPP <p>Le daemon <tt/pppd/ recherche dans le repertoire <tt>/etc/ppp</tt> les scripts et le fichier <tt/options/ : <code> /etc/ppp/options: /dev/modem 38400 crtscts modem noipdefault defaultroute idle-disconnect 120 </code> Ce qui signifie : <descrip> <tag>/dev/modem</tag> Dans ma configuration, un lien vers <tt>/dev/cua1</tt>. <tag>38400</tag> A remplacer par 115200 (paramètre <tt/spd_vhi/ dans <tt>/etc/rc.d/rc.serial</tt>) <tag>crtscts</tag>Contrôle de flux matériel, RTS/CTS, <em/ne pas utiliser le controle de flux Xon-Xoff!/ <tag>modem</tag> Utilisation avec un modem. <tag>noipdefault</tag> L'adresse IP est attribuée automatiquement. <tag>defaultroute</tag> Affecte la route par défaut à l'interface PPP. <tag>idle-disconnect</tag> Avec PPP-2.2.0f déconnecte automatiquement un lien inutilisé apres 120 secondes. </descrip> <p> Nous créons maintenant un script, nommé <tt/defaut/, pour la connexion vers notre fournisseur de service habituel. Pour d'autres connexions, créer d'autres scripts vers ces autres sites et les nommer avec leur adresse IP distante, par exemple. <code> /etc/ppp/defaut: "" ats11=55dtXXXXXXXX CONNECT "" rname: UUUUU sword: PPPPP > ppp </code> Ce qui signifie : <descrip> <tag>ats11=55</tag>Racourcit la durée des tonalités pour accélérer la connexion. <tag>XXXXXXXX</tag>Correspond au numéro de téléphone du fournisseur de service. <tag>CONNECT</tag><tt/chat/ attend que le modem renvoi <tt/CONNECT/. <tag>rname:</tag><tt/chat/ attend <tt/rname/, et entre <tt/UUUUU/. <tag>sword:</tag><tt/chat/ attend <tt/sword/, et entre <tt/PPPPP/. </descrip> <p>Remplacez <tt/UUUUU/ et <tt/PPPPP/ par votre nom d'utilisateur et votre mot de passe. Utilisez <tt/rname/ et <tt/sword/ (à la place de <tt/username/ et <tt/password/) car quelquefois les premières lettres sautent ou sont soit en majuscules soit en minuscules. Certains fournisseurs de services demandent l'entrée du mot <tt/ppp/ après le nom d'utilisateur et le mot de passe, d'où l'attente de l'invite du routeur (<tt/>/). <p>Si vous avez des erreurs du type <tt/serial line looped back/ ou <tt/serial line not 8-bit clean/, la liaison n'est pas encore sous PPP. <p> La commande de lancement est assez longue pour mériter un petit script : <code> /etc/ppp/ppp: #!/bin/sh /usr/sbin/pppd connect '/usr/sbin/chat -v -f /etc/ppp/default' </code> <p>Vous devriez être capable de vous connecter à votre fournisseur de service. Vous pouvez rajouter le paramètre <tt/debug/ au fichier <tt>/etc/ppp/options</tt> et augmenter le <em/loglevel/ de <tt/syslogd/ pour voir ce qui ce passe : <code> /etc/syslog.conf: *.debug /var/log/messages </code> <p>Si vous éditez <tt/syslog.conf/, soyez sûr d'indiquer au daemon <tt/syslogd/ le changement. Suivant la localisation de son fichier PID, faîtes : <tscreen><verb> kill -1 `cat /var/run/syslog.pid` </verb></tscreen> ou <tscreen><verb> kill -1 `cat /etc/syslog.pid` </verb></tscreen> <p>Après que la connexion soit établie, vérifiez avec <tt/ifconfig/ l'existence de l'interface <tt/ppp0/. Vérifiez la route par défaut avec <tt/netstat -r/, elle devrait indiquer le fournisseur de service. Essayer aussi de <em/pinguer/ (<tt/ping/) un serveur distant, tel que le serveur de noms du fourniseur de service. Si ça marche, vous pouvez ajouter ce serveur de noms dans le fichier <tt>/etc/resolv.conf</tt> : <code> /etc/resolv.conf: search your.isp.domain nameserver x.x.x.x </code> <sect>Installation de la Connexion à la Demande <p> Le daemon <tt/kerneld/ peut être utilisé pour charger à la demande des modules tels que PPP. Une autre possibilité signalée dans le <bf/kerneld-HOWTO/ est le lancement d'un script si une route est absente. <tt/Kerneld/ surveille le fichier <tt>/sbin/request-route</tt>. Le script qui suit est la copie de celui fourni dans <tt>modules-2.0.0.tar.gz</tt> : <code> /sbin/request-route: #!/bin/sh LOCK=/var/run/request-route.pid export PATH=/usr/sbin:$PATH # for ppp-2.2* # # Ce script sera appele par kerneld avec la route demandee $1 # chatfile=/etc/ppp/$1 # # Si aucun script chat utilise une valeur par defaut (lien symbolique # vers le script prefere) : # [ ! -f $chatfile ] && chatfile=/etc/ppp/default # # Vérifie si le programme tourne toujours : # if [ ! -f $LOCK ] ; then pppd connect "chat -f $chatfile" & # # Temporisation supprimee par ip-up, a regler. Verifier les # delais de kerneld aussi. # sleep 60 & sleepid=$! echo $sleepid > $LOCK wait $sleepid rm -f $LOCK exit 0 fi exit 1 </code> <tt/Kerneld/ exécute ce script en utilisant la route absente comme argument : <tscreen><verb> /sbin/request-route x.x.x.x </verb></tscreen> <p>Le script utilise un fichier verrou pour eviter plusieurs <tt/request-route/ simultanés. <p>Au début, j'utilisais un script qui était déclenché par une requête au serveur de noms, mais depuis je préfère fonctionner avec un serveur de noms local, le resultat sera dans la mémoire cache et un second accès ne déclenchera pas la connexion. C'est la raison pour laquelle j'ai changé le script pour utiliser un script <tt/chat/ si aucun n'existe. <p>Cela permet aussi de créer de multiples scripts <tt/chat/ pour les différentes liaisons et d'utiliser un script <tt/chat/ par défaut pour se connecter à son fournisseur de service. <p>Après que la liaison ait été initiée, le daemon <tt/pppd/ exécute le script <tt>/ppp/ip-up</tt> qui retire le fichier verrou. Ajoutez les commandes que vous voulez exécuter à chaque fois que la liaison est initiée, par exemple surveiller la queue de <bf/sendmail/ : <code> #!/bin/ash LOCK=/var/run/request-route.pid [ -f $LOCK ] && kill `cat $LOCK` # # Execute ces commandes apres la connexion (exemple) : # /usr/sbin/sendmail -q </code> L'option <tt/idle-disconnect/ déconnecte automatiquement une liaison inutilisée. Pour se déconnecter immédiatement, utilisez <tt/ppp-off/ : <code> /usr/sbin/ppp-off:. #!/bin/sh LOCK=/var/run/request-route.pid DEVICE=ppp0 rm -f $LOCK # # Si le fichier ppp0.pid est present alors le programme tourne. Stoppez # le. # if [ -r /var/run/$DEVICE.pid ]; then kill -INT `cat /var/run/$DEVICE.pid` # # Si ca marche, verifier que le fichier pid est retire. # if [ ! "$?" = "0" ]; then echo "removing stale $DEVICE pid file." rm -f /var/run/$DEVICE.pid exit 1 fi # # Reussite. Terminer avec le bon statut. # echo "$DEVICE link terminated" exit 0 fi # # La liaison n'est pas active # echo "$DEVICE link is not active" exit 1 </code> <sect>Configuration du Réseau <p>Si votre machine Linux a une autre interface réseau, tel qu'une carte ethernet ou si vous utilisez PLIP pour vous connecter vers un autre hôte, vous pouvez configurer la machine multi-interface comme un routeur. C'est ainsi que j'ai configuré mon réseau. J'entre toujours toutes mes adresses IP dans <tt>/etc/hosts</tt> pour n'avoir qu'un fichier à modifier. <code> /etc/hosts: 127.0.0.1 localhost 10.0.0.1 your.domain.com host 10.0.0.2 some.other.machine </code> <code> /etc/networks: loopback 127.0.0.0 localnet 10.0.0.0 </code> <code> /etc/rc.d/inet1: # Loopback interface: ifconfig lo localhost route add -net loopback # Local interface: ifconfig eth0 host route add -net localnet eth0 </code> La dernière ligne ajoute une route au réseau local. Nous n'avons pas besoin d'entrer la passerelle par défaut ici, puisque nous n'en avons pas, tant que la liaison PPP n'existe pas. <sect>Configuration de l'IP-Masquerade <p>Si vous devez connecter différentes machines, mais possédez seulement une adresse IP, vous pouvez utiliser les fonctionnalités d'IP-masquerade de Linux. Cela vous permet de configurer des adresses IP interne à un réseau qui seront converties en l'adresse IP assignée à l'intreface PPP. <P>Vous pouvez utiliser librement les adresses de réseau suivantes : <tscreen><verb> Class A: 10.0.0.0 Class B: 172.16.0.0 - 172.31.0.0 Class C: 192.168.0.0 - 192.168.254.0 </verb></tscreen> (NdT : <em/à utiliser sans angoisse, adresses non routées dans l'Internet/) <p>Ajouter ensuite les lignes suivantes à <tt>/etc/rc.d/rc.inet1</tt> : <code> /etc/rc.d/rc.inet1: FW=/sbin/ipfwadm ${FW} -F -f ${FW} -F -a m -P tcp -S localnet/8 -D default/0 ${FW} -F -a m -P udp -S localnet/8 -D default/0 # Masquerading timeout-values (tcp tcpfin udp), defaults: ${FW} -M -s 3600 0 0 # Load module for special protocols: /sbin/modprobe ip_masq_ftp /sbin/modprobe ip_masq_raudio /sbin/modprobe ip_masq_irc </code> <p>Les deux lignes d'IP-masquerade vont adapter les trafics UDP et TCP à l'adresse IP utilisée par la passerelle par défaut (l'interface PPP). Les autres protocoles ne fonctionneront pas à partir des autres hôtes. Par exemple <tt/ping/ qui utilise le protocole ICMP, ne fonctionnera que du routeur. Ici on utilise le réseau <bf/10.0.0.0/ avec le masque de sous réseau <bf/255.0.0.0/, ou en notation CIDR : <bf>/8</bf>. <p>Les lignes suivantes évitent la fin prématurée des connexions FTP, en augmentant la valeur des temporisation TCP (timeout). <p> Les modules sont nécessaires seulement si vous désirez utiliser ces protocoles à travers un pare-feu (firewall). C'est à dire, si vous voulez utiliser un FTP normal à travers un pare-feu, vous devez charger le module <tt/ip_masq_ftp/. <sect>Configuration des Stations <p>Configurez vos autres machines (stations) pour votre réseau local, puis pour utiliser la machine Linux (routeur) comme passerelle par defaut. </article>