Connexion à Internet multi-comptes
Connexion à Internet multi-comptes
Partie 4 : connexion multi-comptes
Partie 4 : connexion multi-comptes
Pré requis, Introduction
Pour pouvoir comprendre ce chapitre, vous devez savoir comment établir une connexion à internet, comment récupérer du courrier d'internet sur plusieurs comptes en même temps et savoir quels sont les scripts qui sont lancés lors de l'établissement de la connexion. Tous ces points sont le sujet des articles précédents (voir les parties [multi1_pppd-config.php3 1], [multi2_sendmail-config.php3 2] et [multi3_ipupdown.php3 3]).
Avec la prolifération actuelle des ISP, notamment les gratuits, nous sommes souvent tentés de nous connecter via un nouvel ISP, ne serait-ce que pour l'essayer (vérifier l'état de sa ligne, sa rapidité, etc.).
En utilisant ce que nous avons vu, il n'est pas très difficile de créer plusieurs scripts de connexion à Internet. Mais cette méthode oblige l'administrateur à modifier ou créer plusieurs scripts (en tout au moins 4 par fournisseur d'accès) pour pouvoir ajouter un nouvel ISP. Ce n'est pas très souple. De plus il nous faut modifier pour chaque ISP le fichier /etc/sendmail.cf ; en effet dans celui-ci nous avons mis l'adresse de notre serveur de mail sortant, mais le serveur de mail sortant n'accepte pas en général de connexion depuis un PC qui n'est pas relié localement au réseau "local" de l'ISP. Il est assez évident que la modification de ce fichier devra se faire depuis /etc/ppp/ip-up, car elle doit se faire à chaque connexion.
Note : tout ce qui suit, sauf indication contraire, est exécuté avec les droits de root.
Le principe retenu
Voici la solution que j'ai retenue. Toutes les informations relatives à toutes les connexions sont stockées dans le même et unique fichier : /etc/ppp.conf. Le fichier est en ASCII pur pour que l'on puisse l'éditer facilement.
L'établissement de la connexion à Internet se fera par un seul script : /etc/ppp/scripts/pppconnect. Celui-ci devra ouvrir une boite de dialogue dans laquelle on pourra choisir l'une quelconque des connexions configurées dans /etc/ppp.conf.
La rupture de la liaison se fera via le script /etc/ppp/scripts/pppdisconnect.
Syntaxe du fichier /etc/ppp.conf
Comme un dessin vaut mieux qu'un long discours, voici mon fichier /etc/ppp.conf :
{free name}Free (max 20h)
{free smtp}smtp.free.fr
{free search}free.fr
{free autodns}
{free login}yyyyyyyyyyy
{free password}xxxxxxxx
{free telephone}0359602000
{wanadoo name}wanadoo (max 36h)
{wanadoo smtp}smtp.wanadoo.fr
{wanadoo search}wanadoo.fr
{wanadoo dns}193.252.19.3
{wanadoo dns}193.252.19.4
{wanadoo login}yyyyyyyyyyy
{wanadoo password}xxxxxxxx
{wanadoo telephone}0860888080
{offline smtp}
{offline search}tux
{global modeminit}ATM0L0
Chaque ligne de ce fichier est de la forme :
{ident motclef}valeur
ident peut être n'importe quoi (du moment que ça ne contient pas d'espace), mais il y a deux valeurs particulières :
- offline : pour indiquer que les paramètres qui suivent ne s'appliquent que lorsque la connexion est inactive.
- global : pour indiquer que ces paramètres s'appliquent pour toutes les connexions (même offline).
motclef est une valeur parmi :
Â
Mot clef | Type de la valeur | Utilisation |
name | chaîne de caractère quelconque | le nom de la connexion ident |
dns | une adresse IP | adresse d'un DNS (serveur de noms de domaine), vous pouvez en mettre autant que vous le souhaitez (sur des lignes distinctes). |
autodns | rien | si vous précisez cette option pour une connexion (ou pour toutes via global), pppd demandera à votre ISP les adresses de deux DNS. Dans ce cas (que cela fonctionne ou pas) les DNS que vous précisez par l'option dns sont ignorés. |
search | nom de domaine (valide ?) | un nom de domaine qui sera ajouté automatiquement aux noms qui n'auront pu être résolus sans celui-ci. |
smtp | nom d'un serveur smtp ou une adresse IP | ce nom doit alors être le nom du serveur de mails sortant de l'ISP correspondant à cette connexion. |
login | chaîne de caractère | le login correspondant à cet ISP. |
password | chaîne de caractère | le mot de passe de ce login (attention au propriétaire de ce fichier : il doit être en clair !) |
telephone | numéro de téléphone | de l'ISP |
modeminit | chaîne de caractère | ce doit alors être une chaîne d'initialisation de votre modem renvoyant 'OK' ; vous pouvez avoir autant de chaîne d'initialisation que vous le souhaitez. |
Attention : le parseur distingue les majuscules des minuscules.
Attention : l'ordre des différentes lignes de ce fichiers sont essentielles : elles détermine la validité des diverses options (c'est à dire : si vous préciser deux fois la même option, seule la dernière valeurs est prise en compte).
/etc/ppp/scripts/initcnx
Maintenant, il nous faut un script capable de lire un tel fichier, et de générer les fichiers nécessaires à la connexion à Internet :
- /etc/ppp/chat/auto : le script de numérotation de l'isp.
- /etc/ppp/peers/auto : le script de commande de pppd.
- /etc/ppp/pap-secrets : le fichier contenant les mots de passe pour l'isp.
- /etc/resolv.conf : le fichier charger de la résolution des noms (association adresse IP <-> nom de machine).
Voici un tel script (appelez le /etc/ppp/scripts/initcnx) :
#!/usr/bin/perl
# lecture du fichier de configuration /etc/ppp.conf pour
# la création des paramètres de configurations !
# /etc/ppp/chat/auto
# /etc/ppp/peers/auto
# /etc/ppp/pap-secrets
# /etc/resolv.conf
($cnx,$ipup) = @ARGV ;
open(PPPCONF,"/etc/ppp.conf") ;
@modeminit = () ;
@resolv = () ;
$search = "org" ;
$autodns = 0 ;
while (<PPPCONF>) {
if (($p) = /{$cnx login}(.*)/) { $login = $p ; }
if (($p) = /{global login}(.*)/) { $login = $p ; }
if (($p) = /{$cnx password}(.*)/) { $password = $p ; }
if (($p) = /{global password}(.*)/) { $password = $p ; }
if (($p) = /{$cnx smtp}(.*)/) { $smtp = $p ; }
if (($p) = /{global smtp}(.*)/) { $smtp = $p ; }
if (($p) = /{$cnx telephone}(.*)/) { $telephone = $p ; }
if (($p) = /{global telephone}(.*)/) { $telephone = $p ; }
if (($p) = /{$cnx modeminit}(.*)/) { push(@modeminit,$p) ; }
if (($p) = /{global modeminit}(.*)/) { push(@modeminit,$p) ; }
if (($p) = /{$cnx dns}(.*)/) { push(@resolv,$p) ; }
if (($p) = /{global dns}(.*)/) { push(@resolv,$p) ; }
if (($p) = /{$cnx search}(.*)/) { $search = $p ; }
if (($p) = /{global search}(.*)/) { $search = $p ; }
if (($p) = /{$cnx autodns}(.*)/) { $autodns = 1 ; }
if (($p) = /{global autodns}(.*)/) { $autodns = 1 ; }
}
if ($autodns) {
$resolv = () ;
}
if ($ENV{"DNS1"} ne "") {
push(@resolv,$ENV{"DNS1"}) ;
}
if ($ENV{"DNS2"} ne "") {
push(@resolv,$ENV{"DNS2"}) ;
}
open(CHAT,">/etc/ppp/chat/auto") ;
print CHAT "'ABORT' 'BUSY'
'ABORT' 'ERROR'
'ABORT' 'NO CARRIER'
'ABORT' 'NO DIALTONE'
'ABORT' 'Invalid Login'
'ABORT' 'Login incorrect'
'' 'ATZ'
'OK' " ;
foreach (@modeminit) { print CHAT "'$_'\n'OK' " ; }
print CHAT "'ATDT$telephone'
'CONNECT' ''
'TIMEOUT' '5'
'~--' ''
" ;
close CHAT ;
open (PEERS,">/etc/ppp/peers/auto");
print PEERS "connect '/usr/sbin/chat -v -f /etc/ppp/chat/auto'
user $login
ipparam $cnx
" ;
if ($autodns) {
print PEERS "usepeerdns\n" ;
}
close PEERS ;
open (PAP,"/etc/ppp/pap-secrets") ;
$file = "" ;
while (<PAP>) { $file .= $_ ; }
close PAP ;
open (PAP,">/etc/ppp/pap-secrets") ;
# on supprime les occurrences précédentes :
$file =~ s/#AUTOBEGIN#.*#AUTOEND#//s ;
if ($login ne "") {
$file .= "#AUTOBEGIN#\n$login * $password\n#AUTOEND#";
}
print PAP $file ;
close PAP ;
open (SENDSRC,"/etc/sendmail.BASE") ;
open (SENDDST,">/etc/sendmail.cf") ;
while (<SENDSRC>) {
s/{MAILHOST}/$smtp/g ;
print SENDDST ;
}
close SENDSRC ;
close SENDDST ;
# on modifie le ns :
open (RESOLV,">/etc/resolv.conf") ;
print RESOLV "search $search\n" ;
foreach $nameserver (@resolv) {
print RESOLV "nameserver $nameserver\n" ;
}
close RESOLV ;
# on relance sendmail (seulement si
# c'est ip-up ou ip-down qui à lancé le
# script, en effet il faut être root) :
if ($ipup =~ /ip(up|down)/) {
`/etc/rc.d/init.d/sendmail restart`
} ;
Ce script est un compromis : je ne voulais pas écrire plusieurs fois la lecture de /etc/ppp.conf (je ne sais pas écrire de bibliothèque en perl !) pour des raisons évidentes de maintenance, donc j'ai écrit ce script qui fait, pour chaque opération, bien plus que ce qui est nécessaire. Mais cela ne doit être pénalisant que si vous avez des dizaines de connexions ;).
Le script n'appelle pas de commentaire particulier, si ce n'est pour les 12 lignes en gras. Ce sont ces lignes qui vont demander à l'isp des adresses de ses dns. Les 9 premières regardent si les variables d'environnement DNS1 et DNS2 existent (quand on est en mode autodns). Les 3 dernières ajoutent au script de commande de pppd l'option qui lui réclame ces information.
Pour que ce script puisse fonctionner, il faut que vous créiez un fichier /etc/sendmail.BASE dont le nom de serveur smtp est {MAILHOST} (à la place du nom du serveur de mail sortant d'un de vos isp). Si votre serveur sendmail est configuré et fonctionne, il suffit de copier /etc/sendmail.cf dans /etc/sendmail.BASE et cherchez dans /etc/sendmail.BASE la ligne (ou quelque chose de semblable...) :
DSsmtp:smtp.isp.fr
et vous la changez en :
DSsmtp:{MAILHOST}
Attention : le fichier /etc/sendmail.cf est très sensible, ne le modifiez que si vous savez ce que vous faites.
Un fichier /etc/ppp/ip-up à peine plus complexe
(que celui de la partie 3)
#!/bin/sh
# le paramètre $6 correspond au paramètre ipparam
# du fichier /etc/ppp/peers/script
# ceci nécessite que l'option usepeerdns
# soit activée dans /etc/ppp/peers/script
# dans ce cas DNS1 et DNS2 reçoivent les
# adresse des deux dns du provider.
# dans le cas où ces variables ne sont pas
# initialisées, les options {connexion dns}***
# doivent être utilisées pour préciser le dns !
# en lieu et place de autodns
export DNS1
export DNS2
/etc/ppp/scripts/initcnx $6 ipup
# récupération des mail et envoie des mails en attente :
/usr/bin/fetchmail
/usr/sbin/sendmail -q
# on récupère automatiquement les mails toutes les 11 minutes
# (11 minutes car netcourrier n'aime pas qu'on consulte
# les comptes pop trop souvent !)
/usr/bin/fetchmail --daemon 660
# mettons notre pc à l'heure :
ntpdate ntp-sop.inria.fr
Vu ce que l'on a déjà dit, ce script ce passe de commentaire.
Un fichier /etc/ppp/ip-down
#!/bin/sh
# comme on n'est plus connecté au net, on quitte fetchmail
/usr/bin/fetchmail --quit
# y'a plus de dns a priori...
export DNS1=""
export DNS2=""
/etc/ppp/scripts/initcnx offline ipdown
# on peut effacer les fichiers auto :
rm -f /etc/ppp/chat/auto
rm -f /etc/ppp/peers/auto
Idem.
/etc/ppp/scripts/pppconnect
Pour ce script, nous allons un peu compliquer les choses : en effet, c'est lui qui doit permettre le choix de l'isp que nous souhaitons contacter. Comme, dans la partie 3, nous allons utiliser Xdialog pour nous permettre ce choix. Voici le script :
#!/usr/bin/perl
open(PPPCONF,"/etc/ppp.conf") ||
`/opt/apps/bin/Xdialog --title Erreur --msgbox\
"impossible d\'ouvrir /etc/ppp.conf\nchangez\
les droits de ce fichier\nou bien créez le."\
0 0` ||
die "/etc/ppp.conf illisible.\n" ;
# on cherche les lignes : {connexion name}isp
while (<PPPCONF>) {
 if (($tag,$name) = /{(.*?) name}(.*)/) {
 $cnx{$tag} = $name ;
 }
}
$cmdline = "" ;
$num = 0 ;
foreach $key (sort keys %cnx) {
 $cmdline .= "\"$key\" \"$cnx{$key}\" false " ;
 $num++ ;
}
$cnx = `/opt/apps/bin/Xdialog --stdout\
--radiolist Connexion 0 0 $num $cmdline` ;
chop($cnx);
if ($cnx ne "") {
 # initialisation (sauf le dns !) qui est fait par
 # ip-up
 `/etc/ppp/scripts/initcnx $cnx` ;
 # connexion !
 `/usr/sbin/pppd call auto` ;
 # ce qui suit n'est pas nécessaire, mais
 # agréable :
 # attendons l'établissement de la liaison
 `sleep 60s`
 # et rapatrions les mails de l'utilisateur
 # pour peu qu'il ai configuré fetchmail
 `fetchmail`
 # ceci permet à un utilisateur de se configurer
 # un compte que le root ne connait pas.
} else {
`/opt/apps/bin/Xdialog --title Information\
--infobox "Aucune connexion n'a été sélectionnée."\
0 0 1500` ;
}
(note(pour jcc), je ne me rappelle plus si perl comprend la continuation des lignes par \ ?)
(note : saisissez les lignes terminés par \ sur une seule ligne !)
(note : en lieu et place de /opt/apps/bin précisez le path complet de Xdialog)
Vous pouvez, dès maintenant, vérifier que l'établissement est fonctionnel (si vous avez un fichier /etc/ppp.conf) en tapant : /etc/ppp/scripts/pppconnect. Si vous aviez des mails en attente et si vous aviez configuré fetchmail, ce script doit établir la connexion, envoyer les mails en attente, et rapatrier vos mails (et ceux de vos utilisateurs).
/etc/ppp/scripts/pppdisconnect
La déconnexion est semblable à ce que nous avons déjà fait :
#!/bin/sh
if [ -e /var/run/ppp*.pid ] ; then
 kill `cat /var/run/ppp*.pid` 2>&1 > /dev/null
fi
/opt/apps/bin/Xdialog --title "Informations:"\
--infobox "La liaison internet est maintenant\
coupée." 0 0 2000
Sans commentaire.
Les permissions
Pour l'instant, cet ensemble de script, ne fonctionne que si vous êtes root. C'est un peu limitatif. Pour arranger les choses, je vous conseille de créer un groupe pppusers auquel vous ferez appartenir les utilisateurs ayant le droit de choisir leur connexion. Puis, dans le répertoire /etc/ppp faites :
pour faire appartenir tout ce que contient /etc/ppp à pppusers :
chown -R root:pppusers /etc/ppp/*
pour autoriser les membres du groupe pppusers à modifier les fichiers /etc/ppp/peers/auto etc. :
chmod -R g+rwx /etc/ppp/scripts/ /etc/ppp/chat /etc/ppp/pap-secrets
pour que les étrangers le reste :
chmod -R o-rwx /etc/ppp/* /etc/ppp.conf /etc/sendmail.BASE
Attention : seuls les utilisateurs ayant établi la connexion auront le droit de la couper : ce qui est somme toute assez logique. Le root ayant lui, comme toujours, tous les droits.
Utilisation
Chez moi, j'ai mis deux icônes sur mon bureau, une vers pppconnect et l'autre vers pppdisconnect. Comme ça, je peux établir et couper la liaison à Internet de manière très simple.
Voilà, bon surf.
Reste le problème des spammers ! La suppression automatique des mails dits "spam", mails de publicité non sollicités, fera l'objet d'un prochain article.
Copyright
Copyright © 30/05/2000, Frédéric Bonnaud
Ce document est publié sous licence Creative Commons Attribution, Partage à l'identique 4.0 : https://creativecommons.org/licenses/by-sa/4.0/ |