Connexion à Internet multi-comptes

De Lea Linux
Aller à la navigation Aller à la recherche

Connexion à Internet multi-comptes
Partie 4 : connexion multi-comptes

Connexion à Internet multi-comptes
Partie 4 : connexion multi-comptes
par Fred
Nous allons, dans ce chapitre, voir comment il est possible de rendre "simple" pour l'utilisateur la gestion de plusieurs connexions (plusieurs ISP) à internet

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'appel 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 de 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 coupée : 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.

Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédéric Bonnaud le 30/05/2000.

Copyright

Copyright © 30/05/2000, Frédéric Bonnaud

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 4.0 :
https://creativecommons.org/licenses/by-sa/4.0/


Autres ressources