Linux Dial-On-Demand mini-HOWTO
Rodney van den Oever,
[email protected]
Version 1.0, 28 Juillet 1996 mise a jour le 29 fevrier 1997
(Adaptation francaise par Olivier Fourmaux,
[email protected],
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,
[email protected]. 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.