Linux Dial-On-Demand mini-HOWTO Rodney van den Oever, Rodney.van.den.Oever@tip.nl Version 1.0, 28 Juillet 1996 mise a jour le 29 fevrier 1997 (Adaptation francaise par Olivier Fourmaux, Olivier.Fourmaux@lip6.fr, 28 Novembre 1997). Mini-HOWTO decrivant comment utiliser une machine de son reseau local comme routeur PPP avec connexion a la demande. Le ddiiaall--oonn--ddeemmaanndd correspond a l'utilisation au besoin du modem, soit litteralement : _c_o_m_p_o_s_i_t_i_o_n _a _l_a _d_e_m_a_n_d_e que nous traduisons en ccoonn-- nneexxiioonn aa llaa ddeemmaannddee. 11.. PPrreeaammbbuullee 11..11.. BBllaabbllaa lleeggaall (C)opyright 1997 Olivier Fourmaux pour la version francaise. Toute ressemblance avec les docs Linux de mon co-burote et neanmoins ami Christophe Deleuze, traducteur forcene depuis sa tendre enfance, serait purement fortuite. 11..22.. BBllaabbllaa ddee ll''aauutteeuurr ((_D_i_s_c_l_a_i_m_e_r)) Ce document decrit une configuration qui fonctionne pour moi, utilisez la a vos propres risques. S'il manque quoi que ce soit d'important ou si quelque chose est completement faux, s'il vous plait, communiquez le moi ! Une chose que l'on peut rajouter, c'est la maniere de configurer un serveur de noms local. 11..33.. BBllaabbllaa dduu ttrraadduucctteeuurr Les commentaires sur la traduction sont a envoyer a Olivier Fourmaux, Olivier.Fourmaux@lip6.fr. De meme si vous trouvez des erreurs de fond, demandez moi d'abord, j'ai peut-etre traduit un peu vite :) 22.. IInnttrroodduuccttiioonn Ce document decrit comment gerer une connexion _d_i_a_l_-_o_n_-_d_e_m_a_n_d et comment utiliser un hote Linux connecte a un reseau local en tant que _r_o_u_t_e_u_r _P_P_P gerant la connexion a la demande. Le _k_e_r_n_e_l_d_-_m_i_n_i_-_H_O_W_T_O decrit deja comment kerneld (daemon du noyaux linux) execute le script request-route pour l'ajout dynamique de route. Pour plus d'information, le _k_e_r_n_e_l_d_-_m_i_n_i_-_H_O_W_T_O existe en francais. Ici nous ne decrivons qu'une configuration detaille adaptee a l'ajout de route avec une connexion modem. Si vous utilisez un petit reseau local chez vous, la connexion a la demande fournit une solution interessante de gestion transparente d'un acces Internet pour plusieurs machines. ______________________________ __|__ ___|___ Liens PPP vers le | | reseau local | | ______ fournisseur d'acces | PC | 192.168.1.0 |Routeur|--| modem|------------------> | | | Linux | |______| x.x.x.x |_____| |_______| (adresse IP named dynamique) pppd Cette configuration necessite : +o Noyau 2.0.0 ou plus recent +o ppp-2.2.0f.tar.gz ou plus recent +o modules-2.0.0.tar.gz ou plus recent +o ipfwadm-2.3.tar.gz (http://www.xos.nl/linux/ipfwadm) Les etapes suivantes sont a realiser : 1. Configuration du noyau 2. Installation des modules 3. Installation de PPP 4. Configuration du port serie et du modem 5. Configuration de PPP 6. Installation de la connexion a la demande 7. Configuration du reseau 8. Configuration de l' IP-Masquerade 9. Configuration des stations 33.. CCoonnffiigguurraattiioonn dduu NNooyyaauu Avant tout, il faut compiler un noyau avec _k_e_r_n_e_l_d, _P_P_P et _I_P_- _m_a_s_q_u_e_r_a_d_e. Ci-dessous sont indiquees les options necessaires pour cette configuration (en Majuscule), les autres options reseau telles que _f_i_r_e_w_a_l_l _l_o_g_g_i_n_g ou _t_r_a_n_s_p_a_r_e_n_t _p_r_o_x_y_i_n_g peuvent etre choisies mais ne sont pas obligatoires. cd /usr/src/linux make config ou make menuconfig ______________________________________________________________________ * * 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/?] ______________________________________________________________________ Cette derniere option depend bien sur de la carte reseau utilisee. Compilez le noyau avec : make zlilo make modules make modules_install Si vous n'utilisez pas LILO, copiez /usr/src/linux/arch/i386/boot/zImage a la bonne place pour l'initialisation. Les modules sont installes dans /lib/modules/x.x.x, avec x.x.x correspondant a la version du noyau utilise. 44.. IInnssttaallllaattiioonn ddeess MMoodduulleess Les programmes suivants sont necessaires : //ssbbiinn//iinnssmmooddee Charge les modules necessaires. //ssbbiinn//rrmmmmoodd Supprime les modules inutiles. //ssbbiinn//ddeeppmmoodd Cree les dependances. //ssbbiinn//kkeerrnneelldd Extension de Kerneld pour charger les modules automatiquement. Si vous ne les avez pas encore, installez les avec : cd /usr/src tar zxf modules-2.0.0.tar.gz make install Pour charger _K_e_r_n_e_l_d au demarrage, vous devez editer /etc/rc.d/rc.S ou creer un script rc.modules qui est appele par rc.S. Ajoutez ou modifiez les lignes suivantes : ______________________________________________________________________ /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 ______________________________________________________________________ La premiere partie verifie les dependances des modules et les cree si elles n'existent pas encore. 55.. IInnssttaallllaattiioonn ddee PPPPPP Les programmes suivants sont necessaires pour l'installation d'un lien PPP : //uussrr//ssbbiinn//ppppppdd Daemon PPP. //uussrr//ssbbiinn//ppppppssttaattss Statistiques PPP. //uussrr//ssbbiinn//cchhaatt Execution de scripts. A installer avec : cd /usr/src tar zxf ppp-2.2.0f.tar.gz cd ppp-2.2.0f make kernel Les noyaux recents incluent le code de PPP, make kernel ne remplacera donc rien du tout. Verifier les fichiers README et Makefile pour le support du kit _S_h_a_d_o_w. Executez alors : make make install 66.. CCoonnffiigguurraattiioonn dduu PPoorrtt SSeerriiee eett dduu MMooddeemm Cette configuration necessite un modem. La configuration du port serie est realisee dans le fichier rc.serial : ______________________________________________________________________ /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 ______________________________________________________________________ Dans cette configuration, COM1 (cua0) est utilise par la souris et COM2 (cua1) par un modem interne a 28,8 kb/s. Le parametre spd_vhi remplace la valeur 38400 bps par 115200 bps dans la table des vitesses, de meme spd_hi est utilise pour la valeur 57600 bps. Il faut utiliser spd_vhi pour un modem a 28,8 kb/s et spd_hi pour un a 14,4 kb/s. Mais on peut demarrer par prudence avec la valeur 38400 bps. Verifiez votre configuration modem a l'aide d'un programme de type emulation de terminal, tel que _m_i_n_i_c_o_m. Le modem doit afficher (_e_c_h_o) les caracteres frappes. Utilisez Ctrl-A P pour changer les parametres de communication. Verifiez si cela fonctionne encore a 57600 ou 115200 b/s. Tapez ATZ, le modem devrait repondre OK. Utilisez Ctrl-A X pour quitter minicom. Minicom peut aussi etre utilise pour se connecter a son fournisseur de services manuellement. Notez prealablement ce que vous devez taper pour initier la connexion et quelles sont les reponses du serveur distant. Si votre fournisseur de services n'utilise pas PAP ou CHAP (protocoles d'echange de mots de passe), il faudra probablement entrer un nom d'utilisateur et un mot de passe, et peut etre aussi une commande pour initialiser la liaison en mode PPP. 77.. CCoonnffiigguurraattiioonn ddee PPPPPP Le daemon pppd recherche dans le repertoire /etc/ppp les scripts et le fichier options : ______________________________________________________________________ /etc/ppp/options: /dev/modem 38400 crtscts modem noipdefault defaultroute idle-disconnect 120 ______________________________________________________________________ Ce qui signifie : //ddeevv//mmooddeemm Dans ma configuration, un lien vers /dev/cua1. 3388440000 A remplacer par 115200 (parametre spd_vhi dans /etc/rc.d/rc.serial) ccrrttssccttss Controle de flux materiel, RTS/CTS, _n_e _p_a_s _u_t_i_l_i_s_e_r _l_e _c_o_n_t_r_o_l_e _d_e _f_l_u_x _X_o_n_-_X_o_f_f_! mmooddeemm Utilisation avec un modem. nnooiippddeeffaauulltt L'adresse IP est attribuee automatiquement. ddeeffaauullttrroouuttee Affecte la route par defaut a l'interface PPP. iiddllee--ddiissccoonnnneecctt Avec PPP-2.2.0f deconnecte automatiquement un lien inutilise apres 120 secondes. Nous creons maintenant un script, nomme defaut, pour la connexion vers notre fournisseur de service habituel. Pour d'autres connexions, creer d'autres scripts vers ces autres sites et les nommer avec leur adresse IP distante, par exemple. ______________________________________________________________________ /etc/ppp/defaut: "" ats11=55dtXXXXXXXX CONNECT "" rname: UUUUU sword: PPPPP > ppp ______________________________________________________________________ Ce qui signifie : aattss1111==5555 Racourcit la duree des tonalites pour accelerer la connexion. XXXXXXXXXXXXXXXX Correspond au numero de telephone du fournisseur de service. CCOONNNNEECCTT chat attend que le modem renvoi CONNECT. rrnnaammee:: chat attend rname, et entre UUUUU. sswwoorrdd:: chat attend sword, et entre PPPPP. Remplacez UUUUU et PPPPP par votre nom d'utilisateur et votre mot de passe. Utilisez rname et sword (a la place de username et password) car quelquefois les premieres lettres sautent ou sont soit en majuscules soit en minuscules. Certains fournisseurs de services demandent l'entree du mot ppp apres le nom d'utilisateur et le mot de passe, d'ou l'attente de l'invite du routeur (>). Si vous avez des erreurs du type serial line looped back ou serial line not 8-bit clean, la liaison n'est pas encore sous PPP. La commande de lancement est assez longue pour meriter un petit script : ______________________________________________________________________ /etc/ppp/ppp: #!/bin/sh /usr/sbin/pppd connect '/usr/sbin/chat -v -f /etc/ppp/default' ______________________________________________________________________ Vous devriez etre capable de vous connecter a votre fournisseur de service. Vous pouvez rajouter le parametre debug au fichier /etc/ppp/options et augmenter le _l_o_g_l_e_v_e_l de syslogd pour voir ce qui ce passe : ______________________________________________________________________ /etc/syslog.conf: *.debug /var/log/messages ______________________________________________________________________ Si vous editez syslog.conf, soyez sur d'indiquer au daemon syslogd le changement. Suivant la localisation de son fichier PID, faites : kill -1 `cat /var/run/syslog.pid` ou kill -1 `cat /etc/syslog.pid` Apres que la connexion soit etablie, verifiez avec ifconfig l'existence de l'interface ppp0. Verifiez la route par defaut avec netstat -r, elle devrait indiquer le fournisseur de service. Essayer aussi de _p_i_n_g_u_e_r (ping) un serveur distant, tel que le serveur de noms du fourniseur de service. Si ca marche, vous pouvez ajouter ce serveur de noms dans le fichier /etc/resolv.conf : ______________________________________________________________________ /etc/resolv.conf: search your.isp.domain nameserver x.x.x.x ______________________________________________________________________ 88.. IInnssttaallllaattiioonn ddee llaa CCoonnnneexxiioonn aa llaa DDeemmaannddee Le daemon kerneld peut etre utilise pour charger a la demande des modules tels que PPP. Une autre possibilite signalee dans le kkeerrnneelldd-- HHOOWWTTOO est le lancement d'un script si une route est absente. Kerneld surveille le fichier /sbin/request-route. Le script qui suit est la copie de celui fourni dans modules-2.0.0.tar.gz : ______________________________________________________________________ /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 # # Verifie 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 ______________________________________________________________________ Kerneld execute ce script en utilisant la route absente comme argument : /sbin/request-route x.x.x.x Le script utilise un fichier verrou pour eviter plusieurs request- route simultanes. Au debut, j'utilisais un script qui etait declenche par une requete au serveur de noms, mais depuis je prefere fonctionner avec un serveur de noms local, le resultat sera dans la memoire cache et un second acces ne declenchera pas la connexion. C'est la raison pour laquelle j'ai change le script pour utiliser un script chat si aucun n'existe. Cela permet aussi de creer de multiples scripts chat pour les differentes liaisons et d'utiliser un script chat par defaut pour se connecter a son fournisseur de service. Apres que la liaison ait ete initiee, le daemon pppd execute le script /ppp/ip-up qui retire le fichier verrou. Ajoutez les commandes que vous voulez executer a chaque fois que la liaison est initiee, par exemple surveiller la queue de sseennddmmaaiill : ______________________________________________________________________ #!/bin/ash LOCK=/var/run/request-route.pid [ -f $LOCK ] && kill `cat $LOCK` # # Execute ces commandes apres la connexion (exemple) : # /usr/sbin/sendmail -q ______________________________________________________________________ L'option idle-disconnect deconnecte automatiquement une liaison inutilisee. Pour se deconnecter immediatement, utilisez ppp-off : ______________________________________________________________________ /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 ______________________________________________________________________ 99.. CCoonnffiigguurraattiioonn dduu RReesseeaauu Si votre machine Linux a une autre interface reseau, tel qu'une carte ethernet ou si vous utilisez PLIP pour vous connecter vers un autre hote, vous pouvez configurer la machine multi-interface comme un routeur. C'est ainsi que j'ai configure mon reseau. J'entre toujours toutes mes adresses IP dans /etc/hosts pour n'avoir qu'un fichier a modifier. ______________________________________________________________________ /etc/hosts: 127.0.0.1 localhost 10.0.0.1 your.domain.com host 10.0.0.2 some.other.machine ______________________________________________________________________ ______________________________________________________________________ /etc/networks: loopback 127.0.0.0 localnet 10.0.0.0 ______________________________________________________________________ ______________________________________________________________________ /etc/rc.d/inet1: # Loopback interface: ifconfig lo localhost route add -net loopback # Local interface: ifconfig eth0 host route add -net localnet eth0 ______________________________________________________________________ La derniere ligne ajoute une route au reseau local. Nous n'avons pas besoin d'entrer la passerelle par defaut ici, puisque nous n'en avons pas, tant que la liaison PPP n'existe pas. 1100.. CCoonnffiigguurraattiioonn ddee ll''IIPP--MMaassqquueerraaddee Si vous devez connecter differentes machines, mais possedez seulement une adresse IP, vous pouvez utiliser les fonctionnalites d'IP- masquerade de Linux. Cela vous permet de configurer des adresses IP interne a un reseau qui seront converties en l'adresse IP assignee a l'intreface PPP. Vous pouvez utiliser librement les adresses de reseau suivantes : 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 (NdT : _a _u_t_i_l_i_s_e_r _s_a_n_s _a_n_g_o_i_s_s_e_, _a_d_r_e_s_s_e_s _n_o_n _r_o_u_t_e_e_s _d_a_n_s _l_'_I_n_t_e_r_n_e_t) Ajouter ensuite les lignes suivantes a /etc/rc.d/rc.inet1 : ______________________________________________________________________ /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 ______________________________________________________________________ Les deux lignes d'IP-masquerade vont adapter les trafics UDP et TCP a l'adresse IP utilisee par la passerelle par defaut (l'interface PPP). Les autres protocoles ne fonctionneront pas a partir des autres hotes. Par exemple ping qui utilise le protocole ICMP, ne fonctionnera que du routeur. Ici on utilise le reseau 1100..00..00..00 avec le masque de sous reseau 225555..00..00..00, ou en notation CIDR : //88. Les lignes suivantes evitent la fin prematuree des connexions FTP, en augmentant la valeur des temporisation TCP (timeout). Les modules sont necessaires seulement si vous desirez utiliser ces protocoles a travers un pare-feu (firewall). C'est a dire, si vous voulez utiliser un FTP normal a travers un pare-feu, vous devez charger le module ip_masq_ftp. 1111.. CCoonnffiigguurraattiioonn ddeess SSttaattiioonnss Configurez vos autres machines (stations) pour votre reseau local, puis pour utiliser la machine Linux (routeur) comme passerelle par defaut. .