Création d'un serveur PPP sous Linux

Cet article décrit la mise en place d'un serveur PPP sous Linux. Ce serveur pourra être accessible depuis n'importe quel système équipé d'un modem et d'un logiciel d'accès à un réseau distant supportant le protocole PPP. Ceci permettra par exemple de créer simplement un BBS (Bulletin Board System) accessible depuis un navigateur standard. Ce stype d'accès est très intéressant pour donner la possibilité à des utilisateurs éloignés d'accéder à un Intranet d'entreprise. La distribution Linux utilisée dans cet exemple est une Red Hat 5.0 version française.

1. Comment accéder à Linux par modem ?

Un serveur Linux équipé d'un modem peut être facilement accédé depuis une machine distante en utilisant un terminal équipé d'un modem, un micro ordinateur ou même un simple Minitel (voir article du numéro 1 de LMF). Linux utilise pour cela un programme bien connu sur toutes les versions d'Unix appelé getty. Le comportement de getty est paramétrable, entre-autres, par le fichier /etc/inittab :

# Run gettys in standard runlevels
1:12345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

Dans l'exemple ci-dessus, le PC utilise 6 consoles virtuelles. Ce fichier devra être modifié ultérieurement afin de permettre l'utilisation d'une entrée modem.

2. Qu'est-ce que PPP ?

PPP (Point to Point Protocol) permet d'accéder à un réseau distant en utilisant le support physique d'une ligne série (de type RS-232) ou bien d'une connexion modem (cas le plus souvent utilisé). Une fois la connexion établie, la machine connectée peut accéder au réseau distant en utilisant les mêmes commandes que dans le cas d'une connexion réseau classique (ping, telnet, ftp, etc...). Ce protocole est aujourd'hui utilisé pour quasiment tous les types d'accès à des réseaux distants et ce quel que soit le système d'exploitation utilisé. Il faut cependant noter que certaines configurations utilisent des protocoles supplémentaires pour l'authentification lors de la connexion à un serveur, comme par exemple le protocole PAP (Password Authentification Protocol) sur le système Windows 95. Le serveur Linux devra donc pouvoir supporter ce type de protocole s'il veut pouvoir recevoir des appels de PC Windows 95.

Le support du protocole PPP est intégré au noyau Linux à supposer que celui-ci ait été validé lors de la configuration du noyau. Cette option peut-être validée en cochant PPP (point-to-point) support lors de la config du noyau par exemple par un make menuconfig :

[*] Network device support
<M> Dummy net driver support
< > EQL (serial line load balancing) support
< > Frame ralay DLCI support (EXPERIMENTAL)
< > PLIP (parallel port) support
<M> PPP (point-to-point) support

Dans le cas présent, le support PPP est présent sous forme de module chargeable. Notez que le support de PPP est validé dans le noyau installé par défaut par la Red Hat 5.0

3. Le programme mgetty

Le programme mgetty est une version très efficace du concept getty permettant de gèrer sur une même ligne série des connexions modems entrantes et sortantes, des connexions FAX et des connexions directes par terminal série. Ce programme est l'oeuvre de Gert Doering (gdoering@physik.tumuenchen.de). Il est livré sous forme d'archives RPM binaires et sources sur les distriburions Red Hat 4 et 5.

3.1 Installer et configurer mgetty

Vous devez tout d'abord vérifier que mgetty est installé sur votre système. Pour cela, tapez :

rpm -qa | grep mgetty

Qui doit répondre quelque chose comme mgetty-1.1.9-3. S'il répond par une ligne vide, vous devez installer le package par :

rpm -ivh /mnt/cdrom/RedHat/RPMS/mgetty-1.1.9-3.i386.rpm

En supposant que votre CD Red Hat est monté sur /mnt/cdrom. Les fichiers de configuration de mgetty sont localisés dans le répertoire /etc/mgetty+sendfax :

total 32
drwxr-xr-x    2 root     root         1024 Jun  9 14:10 .
drwxr-xr-x   32 root     root         3072 Jun  9 15:03 ..
-rw-------    1 root     root         1172 May 11 23:26 dialin.config
-rw-r--r--    1 root     root           85 May 11 23:26 faxheader
-rw-------    1 root     root         1439 May 11 23:26 faxrunq.config
-rw-------    1 root     root         2593 May 11 23:26 login.config
-rw-------    1 root     root         1559 May 11 23:26 mgetty.config
-rw-r--r--    1 root     root         1051 May 11 23:26 sendfax.config
-rw-------    1 root     root        14984 May 11 23:26 voice.conf

Le fichier dialin.config (qui définit les numéros ayant le droit d'appeler votre système) n'a normalement pas besoin de modification. Le fichier login.config nécessite de valider la ligne commençant par /AutoPPP/. Ceci a pour effet de valider la réponse à des connexions entrantes de type PPP :

#
# Automatic PPP startup on receipt of LCP configure request (AutoPPP).
#  mgetty has to be compiled with "-DAUTO_PPP" for this to work.
#  Warning: Case is significant, AUTOPPP or autoppp won't work!
#  Consult the "pppd" man page to find pppd options that work for you.
#
#  NOTE: for *some* users, the "-detach" option has been necessary, for
#        others, not at all. If your pppd doesn't die after hangup, try it.
#
#  NOTE2: "kdebug 7 debug" creates lots of debugging info. If all works,
#         remove those!
#

/AutoPPP/ -	a_ppp	/usr/sbin/pppd auth -chap +pap login kdebug 7 debug

L'option +pap valide la reconnaissance d'une connexion utilisant le protocole PAP. Le fichier mgetty.config est le plus important pour la réalisation d'un premier test de connexion modem car il permet de régler, entre-autres, l'initialisation des modems connectés aux diverses lignes séries. La première partie du fichier définit les paramètres communs à toutes les lignes séries comme par exemple :

# access the modem(s) with 38400 bps
speed 38400

La deuxième partie définit le paramètrage de chaque port, exemple :

port ttyS1
speed 57600
init-chat "" \dAT&F&C1E0\d\r OK ATQ0&K3&D2S0=0 OK
modem-type data

Dans le cas de la ligne /dev/ttyS1 (équivalent à COM2), la vitesse de la jonction PC / modem sera de 57600 bps, la séquence d'initialisation du modem sera :

\dAT&F&C1E0\d\r OK ATQ0&K3&D2S0=0 OK

Le modem étant de type data. Cette séquence d'initialisation sera envoyée lors de chaque démarrage du programme mgetty sur cette ligne (au démarrage de la machine ou bien lorsque mgetty reprend le contrôle de la ligne après utilisation de celle-ci par un autre programme). Cette séquence est bien entendu à adapter suivant le type du modem.

Quelques remarques :

Contrairement à d'autres programmes équivalents comme getty_ps, le programme mgetty n'utilise pas la fonctionnalité de réponse automatique du modem (Auto Answer). Il est donc NORMAL d'envoyer une séquence ATS0=0 qui indique au modem de ne PAS répondre. C'est mgetty qui force la réponse du modem en lui envoyant une commande ATA au bout d'un nombre défini de sonneries (2 par défaut).

Si vous utilisez mgetty par exemple sur /dev/ttyS1, le device /dev/cua1 habituellement utilisé pour des appels sortants n'est plus utilisable (on obtient l'erreur device busy). Il faut OBLIGATOIREMENT utiliser /dev/ttyS1 quel que soit le type d'accès au port série.

3.2 Configurer /etc/inittab

Il reste maintenant à indiquer au système que la ligne /dev/ttyS1 sera désormais utilisée par mgetty. Il suffit pour cela d'ajouter au fichier /etc/inittab la ligne :

m1:2345:respawn:/sbin/mgetty -D /dev/ttyS1

Et de taper init q afin de forcer le système à lire de nouveau le fichier /etc/inittab. On peut alors suivre l'initialisation des modems en consultant le fichier /var/log/log_mg.ttyS1 :

09/18 16:27:18 yS1 mgetty: experimental test release 1.1.9-Aug17
09/18 16:27:18 yS1 check for lockfiles
09/18 16:27:18 yS1 locking the line
09/18 16:27:19 yS1 lowering DTR to reset Modem
09/18 16:27:20 yS1 send: \dAT&F&C1E0\d[0d][0d]
09/18 16:27:21 yS1 waiting for ''OK'' ** found **
09/18 16:27:21 yS1 send: ATQ0N2&K3&D2S0=0[0d]
09/18 16:27:21 yS1 waiting for ''OK'' ** found **
09/18 16:27:21 yS1 waiting...

Le modem est alors en attente d'un appel entrant. L'appel du serveur par un simple émulateur de terminal (plus un modem bien sûr) doit permettre d'obtenir le login sur le serveur.

4. Accès par PPP

4.1 Configuration de l'accès

L'accès PPP peut être validé simplement en créant un ou plusieurs comptes spécifiques ainsi qu'une adresse IP affectée au client PPP pour le temps de sa connexion. Il suffit pour cela d'ajouter la ligne suivante au fichier /etc/passwd :

pppuser::501:500:Accès PPP:/tmp:/usr/sbin/ppd

Il suffit ensuite de définir le mot de passe de cet utilisateur en utilisant la commande passwd pppuser et ce, en étant super-utilisateur (root). Pour l'adresse IP, il faut ajouter une ligne du type :

192.168.3.2 ipguest

Au fichier /etc/hosts. Il faut également spécifier cette adresse dans le fichier /etc/ppp/options (fichier de paramétrage du démon pppd) :

lock
:192.168.3.2

La config ci-dessus indique :

- que pppd doit vérouiller la ligne série (lock)
- que l'adresse affectée au client est 192.168.3.2

Remarques :

1. Si vous désirez que le PC serve de passerelle vers le réseau local (c'est à dire que le client connecté ait accès à d'autres machines du réseau), il faut :

- ajouter au fichier /etc/ppp/options la ligne : proxyarp
- valider l'IP forwarding dans le système. Dans le cas de la Red Hat 5.0, ceci peut être fait en éditant le fichier /etc/sysconfig/network : FORWARD_IPV4=yes

2. Si vous utilisez plusieurs lignes séries, les options de chacune des connexions seront à spécifier dans /etc/ppp/options.tty

4.2 Test de l'accès par un client

Il faut maintenant tester la connexion au serveur en appelant celui-ci à l'aide d'une autre machine équipée elle aussi d'un modem et d'un logiciel compatible PPP. Nous donnerons ci-dessous les procédures à utiliser pour tester depuis Linux et Windows 95.

Test depuis Linux

Sous Linux, il existe diverses méthodes pour définir une connexion PPP cliente comme par exemple l'utilisation d'un utilitaire graphique comme Vppp (Visual PPP) ou EZppp (Easy PPP). Une autre méthode est de définir un bon vieux script comme ci-dessous :

#!/bin/sh
/usr/sbin/pppd connect /etc/ppp/connect_test
/dev/modem 57600 -detach +ua \
/etc/ppp/test.pap lock debug crtscts modem defaultroute

Puis de définir les deux fichiers auxiliaires /etc/ppp/connect_test :

#!/bin/sh
/usr/sbin/chat -v ABORT BUSY ABORT "NO CARRIER" \
" " AT\&F\&K3\&D2\&C1M1 OK ATDTnuméro_de_téléphone
CONNECT

Et /etc/ppp/test.pap :

pppuser
mot_de_passe

Quelques remarques :

Le fichier /etc/ppp/connect_test doit être EXECUTABLE (faire un chmod +x pour le rendre exécutable). Pour des raisons de sécurité, le fichier /etc/ppp/test.pap ne doit pas être lisible par d'autres utilisateurs (faire un chmod g-rw,o-rw).

Si tout se passe bien, l'utilisation du script doit aboutir à l'établissement d'une connexion PPP entre votre client et le serveur. Une fois cette connexion établie, vous pouvez utiliser n'importe quelle fonctionnalité réseau entre les deux machines. Vous pouvez par exemple accéder directement au serveur à travers Netscape en utilisant une URL du type http://192.168.1.3 (si l'on suppose que c'est l'adresse affectée au serveur Linux). Si vous n'utilisez pas de DNS, le mieux sera d'ajouter le serveur dans votre fichier /etc/hosts :

192.168.1.3 leserveur # Serveur PPP Linux

L'arrêt de la connexion se fera par exemple en tuant le processus pppd par un :

kill 'cat /var/run/ppp0.pid'

Test depuis Windows 95

Le plus simple est de configurer un nouvel accès réseau distant. Je ne vous ferais pas l'affront d'expliquer comment on définit l'accès à un réseau distant sous Windows 95, je me bornerai à préciser la configuration du Type de serveur comme indiqué ci-dessous (obtenue par les propriétés de la connexion définie). Première remarque : il semblerait qu'à Redmond, les seuls types de serveurs connus soient Win 95 / NT et vaguement 'Internet' ;-)

Il est conseillé, dans notre cas, de décocher toutes les options sauf TCP / IP, puis de définir la config en cliquant sur Paramètres TCP / IP. L'adresse sera normalement affectée automatiquement par le serveur Linux (voir paramètres du fichier /etc/ppp/options. Si vous désirez utiliser un serveur de nom (DNS), il faudra préciser son adresse IP à ce niveau là.

Une fois la configuration terminée, il suffit de double cliquer sur l'icône de connexion définie puis de cliquer sur Connecter. Si vous n'utilisez pas de DNS, il faudra ajouter le serveur dans votre fichier C:\Windows\Hosts :

192.168.1.3 leserveur

5. Conclusion

Linux contient de base tous les composants logiciels pour la création d'un serveur PPP destiné soit à servir de passerelle d'accès à un réseau local existant, soit à supporter directement une arborescence de documents HTML. Dans ce dernier cas, le logiciel serveur HTTP Apache devra être installé sur la machine Linux (ce qui est en général le cas lors d'une installation d'un serveur Linux).

How-to français sur les DNS
How-to français sur les modems
FAQ sur PPP
How-to français sur PPP
Mini How-to français sur Apache
Mini How-to français sur la connexion à la demande

Pierre Ficheux - Septembre 1998
pierre@alienor.fr - Linux Magazine France n° 2