LINUX et les communications

Pierre Ficheux (pierre@rd.lectra.fr)

28/29/30 mai 1997

1. Utilisation de SAMBA

SAMBA permet d'utiliser le protocole WFW (Windows For Workgroups) sur une station UNIX (la station peut devenir serveur WFW). LINUX permet en plus d'être client WFW (à partir du noyau 2.0). La page de référence de SAMBA est sur:

Un package samba-1.9.16p9-6.i386.rpm pour RedHat-4.1 est également disponible.

La configuration d'un serveur SAMBA basique est relativement simple:

A partir de la, le serveur LINUX devrait être visible sur le réseau WFW.

Si vous voulez dialoguer entre machines de réseaux différents, il faut configurer le fichier LSMHOSTS:

# lmhosts sample file
#
# This file should contain foreign SMB networks (which are not on
# the same sub-network), available for SMB browsing (visible in
# 'Network Neighborhood' Windows list)
# 
# just put a line such as 'broadcast_mask group G' for each sub-network
# Example:
#
#194.2.13.255 WORKGROUP G
#
# You should also configure your Windows computer for using LMHOSTS file
# There is an example of a Windows LMHOSTS file on C:\WINDOWS\LMHOSTS.SAM
#

SAMBA permet de partager une imprimante avec un environnement WFW en utilisant la commande smbclient. Par exemple, pour imprimer sur une imprimante connectée sur un serveur NT:

     smbclient \\\\serveur\\imprimante -P -U nom_utilisateur
puis au prompt smb:
     print nom_du_fichier
     quit

LINUX peut également être un client WFW. Pour cela il faut compiler le noyau (2.0/2.1) avec le support du filesystem SMB (dans le noyau ou bien par module smbfs.o). Il faut également récupérer les utilitaires smbmount et smbumount.

Ces utilitaires font partie du package smbfs-2.0.1 disponible sur:

La syntaxe de montage est simple:

     smbmount //serveur/repertoire /point_de_montage

2. Démonstration de WABI Caldera

WABI sous LINUX est le portage de l'émulateur Windows-3.11 développé par Sun Microsystems pour Solaris. Cet émulateur nécessite une license Windows-3.11 (ou 3.1). Il ne fonctionne pas avec Windows-95 mais marche très bien avec des applicatifs de bureautique complexe comme le pack Microsoft Office (Word-6, ...).

L'archive est au format .rpm.

3. Configuration de client et serveur PPP

Ce paragraphe est extrait du Guide du ROOTard.

3.1 Introduction

PPP (Point to Point Protocol) permet d'établir une connexion IP sur une voie série de manière plus efficace que SLIP (Serial Line Internet Protocol). Une fois la connexion établie, tous les protocoles supérieurs à IP (FTP, telnet, NFS, http, X...) sont disponibles.

Pour établir une connexion PPP, il faut:

PPP est supporté par un grand nombre de systèmes (même MS-Windows) et on peut normalement se connecter d'un système à l'autre. Cependant, cette documentation ne traite que le cas de Linux !

3.2 Accès à un serveur PPP

Pour accéder à un serveur PPP installé, ton noyau doit être compilé avec le support TCP/IP. Pour cela, lors du make config il faut répondre comme suit :

Networking support (CONFIG_NET) [y] y
TCP/IP networking (CONFIG_INET) [y] y
IP forwarding/gatewaying (CONFIG_IP_FORWARD) [y] n
Network device support? (CONFIG_NETDEVICES) [y] y
PPP (point-to-point) support (CONFIG_PPP) [y] y

Tu dois en plus récupérer les sources des programmes d'accès à PPP (dans l'archive ppp-2.1.2a.tar.gz, voire b, c, ou d) de manière à installer les programmes suivants :

Tu peux par exemple installer pppd et chat dans le répertoire /usr/sbin.

Ensuite, tu dois configurer tes shell-scripts de boot de manière à configurer la couche TCP/IP (par exemple dans un fichier /etc/rc.d/rc.net qui sera lancé par /etc/rc.d/rc.local). En voici un exemple :

echo -n "/etc/rc.net: "
INETD=/sbin/inetd
PORTMAP=/sbin/portmap

# loopback
/sbin/ifconfig lo 127.0.0.1 up netmask 255.255.255.0
/sbin/route add 127.0.0.1 lo

# demarrage des demons

if [ -x $PORTMAP ]; then
        echo -n ", `basename $PORTMAP`"
        $PORTMAP
fi

if [ -x $INETD ]; then
        echo -n ", `basename $INETD`"
        $INETD
fi

echo ""

Il faut ensuite ajoute l'adresse IP de ta machine dans le fichier /etc/hosts :

     127.0.0.1          loopback localhost      # useful aliases
     199.103.124.170    pcpf pcpf.lectra.fr     # Mon beau PC en PPP

L'adresse IP de la machine correspond à celle affectée par l'administrateur du serveur PPP pour la connexion associée à un numéro de téléphone donné. Cela signifie que le copain qui se connecte 10 minutes après utilisera la même adresse IP que toi.

Enfin, tu dois configurer ton domaine dans le fichier /etc/resolv.conf :

 domain lectra.fr
 nameserver 192.1.2.1

La deuxième ligne est utilisée si tu veux utiliser un serveur de noms, bécane qui te renvoie l'adresse IP correspondant au nom de machine fourni. Si tu n'as pas de serveur de noms, tu ne pourras utiliser que des adresses numériques (199.103.124.x) ou bien tu devras mettre dans ton /etc/hosts toutes les machines auxquelles tu veux accéder avec leurs adresses IP...

Tu peux également mettre ton nom de domaine dans le fichier /etc/ppp/options qui doit exister même vide (si tu ne veux pas que pppd demande /etc/ppp/options, il faut le compiler avec l'option -DREQ_SYSOPTIONS=0).

Tu peux maintenant fébrilement tester ta connexion en utilisant un shell-script du style (attention : tout cela constitue une seule ligne) :

/usr/sbin/pppd connect '/usr/sbin/chat -v ABORT ERROR ABORT "NO CARRIER" \
ABORT BUSY "" ATB0 OK ATDTxxxxxxxx CONNECT "" ogin: ppp \
word: ppp0' /dev/modem 9600 -detach debug crtscts modem \
defaultroute 199.103.124.170:

La commande chat permet d'effectuer la connexion en appelant le numéro de téléphone de ton serveur. Attention de ne pas oublier les options de la deuxième ligne en particulier modem et defaultroute.

La spécification de la vitesse (9600) ainsi que le chat-script à utiliser (ABORT ERROR ABORT "NO CARRIER" ABORT BUSY "" ATB0 OK ATDTxxxxxxxx CONNECT) dépendent bien entendu de ton modem et de la configuration du serveur (voir également le login et le password).

L'adresse IP doit être celle déclarée en tant qu'adresse de ta machine en PPP dans /etc/hosts (tu peux également mettre le nom de ta machine en PPP).

Les informations de debug doivent sortir sur la console (si tu as configuré le syslog pour celà).

A partir de là, tu es connecté sur le réseau distant et tu peux faire par exemple:

  $ ping 199.103.124.50
  PING 199.103.124.50 (199.103.124.50): 56 data bytes
  64 bytes from 199.103.124.50: icmp_seq=0 ttl=255 time=268 ms
  64 bytes from 199.103.124.50: icmp_seq=1 ttl=255 time=247 ms
  64 bytes from 199.103.124.50: icmp_seq=2 ttl=255 time=266 ms
pour tester ta connexion. Si le ping marche et que ton réseau est connecté à l'Internet, alors tu as l'Internet chez toi !

Si ça ne marche pas, tu peux tester en tapant /sbin/ifconfig et le résultat doit ressembler à ça :

lo        Link encap Local Loopback
          inet addr 127.0.0.1  Bcast 127.255.255.255  Mask 255.0.0.0
          UP LOOPBACK RUNNING  MTU 2000  Metric 1
          RX packets 0 errors 0 dropped 0 overrun 0
          TX packets 0 errors 0 dropped 0 overrun 0

ppp0      Link encap Serial Line IP
          inet addr 199.103.124.170  P-t-P 199.103.124.50  Mask 255.255.255.0
          UP POINTOPOINT RUNNING  MTU 1500  Metric 1
          RX packets 33 errors 0 dropped 0 overrun 0
          TX packets 42 errors 0 dropped 0 overrun 0

Surtout, tu dois avoir une ligne commençant par ppp0 sinon, no good. Tu peux également tester ton routage par netstat -nr qui doit donner un truc du style :

Kernel routing table
Destination     Gateway         Genmask         Flags Metric Ref Use    Iface
199.103.124.50  0.0.0.0         255.255.255.255 UH    0      0        6 ppp0
127.0.0.0       0.0.0.0         255.0.0.0       U     0      0        0 lo
0.0.0.0         199.103.124.50  0.0.0.0         UG    0      0     6298 ppp0

Avec une ligne 0.0.0.0 contenant l'adresse IP de ton serveur PPP. Si tu n'as pas cette ligne, il se peut que tu ais oublié l'option defaultroute.

3.3 Protocole PAP

Certains serveur PPP utilisent un protocole d'authentification appelé PAP (Password Authentification Protocol). Ceci permet d'ajouter un niveau de sécurité supplementaire avant l'identification login/passwd. Pour utiliser PAP, il suffit de créer une fichier /etc/ppp/pap.login contenant les lignes:

  mon_login_pap
  mon_password_pap
et d'ajouter à la ligne d'appel a pppd l'option:
  +ua /etc/ppp/pap.login

3.4 Lancement de script à l'établissement du protocole

Lors, de l'établissement du protocole PPP, le shell-script /etc/ppp/ip-up est lancé. Ceci permet de lancer l'exécution d'une suite de commandes (envoi de mail, récupération de mail par POP3). Pour cela il faut déclarer les mailers SMTP comme expensive dans le fichier sendmail.cf (Voir article de Stéphane Bortzmeyer ici).

# Expensive mailers
Oct
Le messages ne seront plus directement envoyés mais stockés dans la file d'attente (/usr/spool/mqueue).

Exemple:

#!/bin/sh
# Recupere le mail par POP3
popclient -3 -k -u pierre -p xxxx -f /usr/spool/mail/pierre -o /usr/spool/mail/pierre gwladys

# Vide la file sendmail
/usr/lib/sendmail -q

3.5 Arrêt du protocole

La coupure de la connexion peut être lancée par un script ppp-off du genre:

#!/bin/sh
PIDFILE=/var/run/ppp0.pid
if [ -r $PIDFILE ]; then
	kill -INT `cat $PIDFILE`
fi

3.6 Interfaçage avec FVWM

On peut définir des entrées dans le .fwmrc du genre:

 Exec	"Netscape"	exec netscape&
 Exec	"PPP Lectra 1"	exec /usr/etc/go.ppp1 &
 Exec	"PPP Lectra 2"	exec /usr/etc/go.ppp2 &
 Exec	"PPP Aliénor"	exec /usr/etc/go.alienor &
 Exec	"Déconnexion"	exec /usr/etc/ppp-off
les scripts go.* correspondant à:
#!/bin/sh
/usr/sbin/pppd connect '/usr/sbin/chat -v ABORT ERROR ABORT BUSY ABORT \
"NO ANSWER" ABORT "NO CARRIER" "" AT\&FM0\&K3 OK ATDT0556693080 CONNECT "" \ 
ogin: pierre word: xxxx' /dev/modem 57600 -detach crtscts modem defaultroute \

3.7 Configuration d'un serveur PPP

Pour cela, tu dois installer les mêmes logiciels que dans le chapitre précédent (configurer le noyau, installer pppd). En plus de ça, il faut que tu crées un login spécial pour les connexions PPP dans /etc/passwd, par exemple :

ppp::61:60:Connexion PPP:/:/usr/bin/ppp_login

Le script /usr/bin/ppp_login étant :

#!/bin/sh
# Connexion PPP --> adresse IP = 199.103.124.170
exec /usr/sbin/pppd -d -detach -ip modem proxyarp :199.103.124.170

L'option proxyarp permet à la machine connectée d'accèder à tout le réseau :

 199.103.124.170                   199.103.124.50
+-----------+      PPP link       +----------+
| pcpf      | ------------------- |  ondee   |
+-----------+                     +----------+
                                        |           Ethernet
                    ----------------------------------- 199.103.124.x

4. Configuration d'UUCP

4.1 Introduction à UUCP

UUCP (Unix to Unix CoPy) fut développé dans le premières versions d'UNIX du temps ou les machines communiquaient le plus souvent par lignes téléphoniques. C'est donc un vieux Monsieur, qui n'est plus trop à la mode depuis l'avènement d'Internet mais qui a pourtant des fonctionnalités très puissantes surtout au niveau de l'automatisation des transferts.

Voici un extrait d'un article de Stéphane Bortzmayer défendant UUCP:

Vous avez certainement entendu parler d'UUCP. Vous savez bien, le vieux truc pour le courrier électronique... Les adresses du genre "...!uunet!bilbo!galadriel!durand"... Ce qu'on utilisait avant les zotoroutes de l'information, avant que les journalistes ne s'aperçoivent que les réseaux existent...

Eh bien, UUCP peut encore être utilisé aujourd'hui. Pas par nostalgie, pas par perversité, mais simplement parce que c'est le système le plus adapté dans certains cas. UUCP a reçu de nombreuses améliorations ces dernières années qui ont complètement changé sa facilité d'utilisation. Mais dans quels cas utiliser UUCP ?

Si tout votre courrier électronique peut passer à travers de liens Internet permanents et rapides, laissez tomber. SMTP (et POP) conviennent tout à fait.

Mais si vous avez à desservir des sites (pas seulement des micro-ordinateurs mono-utilisateur, des sites avec plusieurs personnes et qui ont peut-être d'autres sites derrière eux) qui ne sont reliés que de façon intermittente, UUCP a des chances d'être la meilleure solution.

Par exemple, une Université peut souhaiter permettre à ses étudiants d'avoir chez eux un BBS ("babillard" en toubonien) avec plusieurs comptes. (Linux marche très fort chez les étudiants en informatique en ce moment et c'est une excellente expérience pour eux que de gérer un BBS.)

Ou un centre de recherches peut avoir une annexe reliée uniquement par RNIS ou simplement uniquement par le réseau téléphonique car on ne va pas payer une ligne spécialisée pour une annexe avec cinq personnes, trois PC et un Machinetoc.

Dans ces deux cas, sendmail/SMTP convient mal. Imaginons qu'une liaison PPP puisse être établie, les moments où sendmail va essayer d'envoyer le courrier ont peu de chances de coïncider avec ceux où la liaison est fonctionnelle. Quant à POP, il n'est vraiment pas adapté au cas où le site distant a plusieurs utilisateurs et veut pouvoir en ajouter à volonté.

Il semble que sendmail 8.7 (la 8.8 vient de sortir) aie ajouté des fonctions pratiques pour de tels cas. Mais je connais peu de monde qui l'utilise encore et UUCP a, lui, dès le début été conçu pour l'intermittence (alors que SMTP est bâti autour de l'idée que la connectivité est la règle et que les pannes sont l'exception.)

Au niveau de la configuration, il existe un document UUCP-HOWTO. Un chapitre d'introduction existe également dans le Guide du ROOTard.

Voici une documentation générale concernant la configuration d'UUCP (parue dans TRIBUNIX en 1993):

Les principaux fichiers

La configuration de UUCP est complexe du fait du grands nombre de fichiers utilisés pour le paramètrage. Dans le cas de la version BNU de UUCP (disponible sur les versions System V), les fichiers de configuration sont rassemblés sur le répertoire :


	/usr/lib/uucp

Nous allons décrire les plus importants :


Un exemple simple

Par exemple, si nous voulons tester notre connexion MODEM avec UUCP (et non avec Kermit), nous pouvons utiliser l'utilitaire cu (Call Unix) disponible dans le package UUCP. Après configuration, nous pourrons accèder à la ligne tty05 par :


	cu -l tty05

Pour configurer UUCP dans ce cas simple, il suffit de modifier le fichier Devices pour y ajouter la ligne :


	Direct tty05 - Any direct

Le pseudo-device Direct est associé au device /dev/tty05.

Il est IMPERATIF que le device /dev/tty05 appartienne à uucp (et non à root ou autre), sinon vous obtiendrez le message d'erreur :


	Connect failed: CAN'T ACCESS DEVICE

ce qui n'est pas très parlant à première vue. Il faut donc faire :


	chown uucp /dev/tty05

Moyennant cela, on peut obtenir le dialogue suivant :


$ cu -l tty05
Connected
at
OK
~[ondee].           taper ~. pour sortir

Disconnected        en général ca fait bip en sortant !

On peut compliquer un peu en ajoutant la ligne :


	modem5 Any Direct Any

dans le fichier Systems. A ce moment là, on accède au MODEM sur tty05 par le nom symbolique modem5 .


$ cu modem5
Connected

Configurer l'accès à un site distant

Considérons un site nommé transpac accessible par UUCP à travers le device /dev/tty05 par le numéro de téléphone 36062424. Il est intéressant d'accèder à ce site simplement en faisant :


	cu transpac

Pour cela, il faut ajouter les lignes suivantes au fichier Systems :


transpac Any ACU 2400 36062424

Le pseudo-device ACU signifie Automatic Call Unit (Modem en gros). Ce nom de pseudo-device est traditionnellement réservé aux connexions MODEM. Le mot-clé Any signifie que le système peut être appelé à n'importe quelle heure (on peut également spécifier des plages horaires pour diminuer les cou\*^ts de connexion).

Dans le fichier Devices, on peut définir :


ACU tty05 - 2400 aj2422_init "" hayes_direct

La macro aj2422_init représente la séquence d'initialisation du MODEM (ici un Anderson AJ2422, V22bis), la macro hayes_direct, représente la séquence de composition d'un numéro par un MODEM compatible HAYES. Ces macros sont à définir dans le fichier Dialers . On peut également remplacer les spécifications de vitesse 2400 par Any pour indiquer que tout cela se règle tout seul !

Au niveau du fichier Dialers, on définira les macros de dialogue avec le MODEM sous forme de chat-script dont la syntaxe est une suite de séquences :


	chaine_envoyée chaine_attendue

exemple:

        AT&V1\\r OK\\r        on envoit AT&V1 + Return
                            le MODEM doit répondre OK + Return

.fi

On peut donc définir les macros du fichier Dialers :


aj2422_init =,-, "" AT&F0\\d\\r VALIDE\\r AT&V1\\r OK\\r AT&D2\\r OK\\r ATS40=255\\r OK\\r
hayes_direct	=,-,	"" \\dAT\\r\\c OK\\r \\EATDT\\T\\r\\c CONNECT

La macro aj2422_init est dépendante du type de MODEM mais hayes_direct peut être utilisée avec tous les MODEM(s) compatibles HAYES. Elle effectue la séquence suivante :


La chaine \\d permet d'insérer une temporisation de une seconde.

Une fois que tout est configuré, on peut tester par :


	cu -d transpac     (-d est l'option de debug de cu)

et l'on obtient :


$ cu -d transpac
conn(transpac)
Device Type ACU wanted
fixline(10, 2400)
expect: ("")
got it
sendthem (AT&F0DELAY
^M^M)
expect: (VALIDE^M)
T&F0^M^M^M^JVALIDE^Mgot it
sendthem (AT&V1^M^M)
expect: (OK^M)
^JAT&V1^M^M^M^JOK^Mgot it
sendthem (AT&D2^M^M)
expect: (OK^M)
^JAT&D2^M^M^M^JOK^Mgot it
sendthem (ATS40=255^M^M)
expect: (OK^M)
^JATS40=255^M^M^M^JOK^Mgot it
expect: ("")
got it
sendthem (DELAY
AT^M)
expect: (OK^M)
^JAT^M^M^JOK^Mgot it
sendthem (ECHO CHECK ON
A^JATTDDTT3366006622442244^M^M)
expect: (CONNECT)
^M^JCONNECTgot it
getto ret 10
device status for fd=10
F_GETFL=2,iflag=`12045',oflag=`0',cflag=`2273',lflag=`0',line=`0'
cc[0]=`177',[1]=`34' , [2]=`43' , [3]=`100' , [4]=`1' , [5]=`0' , [6]=`0' , [7]=`0
' ,
call _mode(1)
Connected
_receive started
transmit started
 2400

TRANSPAC 083019195
~[ondee].
call tilda(.)
call _quit(0)
call _bye(0)

Disconnected
call cleanup(0)
call _mode(0)

Transfert de fichiers binaires

Le transfert de fichiers binaires ne peut se faire par cu. Il faut pour cela utiliser la commande uucp du package UUCP. Par exemple, le transfert du fichier (binaire) all.tar.Z depuis le site éloigné loin vers /usr/spool/uucppublic se fera par :


	uucp loin!~/all.tar.Z /usr/spool/uucppublic

La chaine ~/ symbolise le répertoire /usr/spool/uucppublic normalement réservé aux transferts UUCP.

Le transfert se fait de manière automatique ce qui implique un login automatisé sur le site distant (un général, un login particulier nuucp ou équivalent est réservé pour les transferts). La séquence de login est définie grâce à un chat-script. On définira le site de la manière suivante dans le fichier Systems :


loin Any ACU Any 12345678 "" \\r gin--gin: nuucp ord: xxxx

ce qui signifie :


 \\r           on commence par envoyer un Return
 gin--gin:     on attend "gin" (de login:) si on ne l'obtient pas
               on envoit Return et on attend de nouveau "gin:"

 nuucp         on envoit "nuucp" (login de transfert)
 ord:          on attend "ord:" (de password:)
 xxxx          on envoit "xxxx"

Dans le fichier /etc/passwd de la machine distante, on devra avoir une ligne du type :


  nuucp:wjk:10:10:0000-uucp(0000):/usr/spool/uucppublic:/usr/lib/uucp/uucico

On peut également retarder le transfert (placer la commande dans la file UUCP mais ne pas l'exécuter tout de suite) par l'option -r :


	uucp -r loin!~/all.tar.Z /usr/spool/uucppublic

La file UUCP sera vidée par la commande :


        /usr/lib/uucp/uucico -r1 -x1 -sloin

        -r1            le système local est mai\*^tre du dialogue
        -x1            niveau de debug = 1
        -sloin         dialogue avec le système "loin"

Toutes les tâches UUCP en attente (courrier, transfert, ...) sont exécutées.

Les requêtes UUCP sur le site distant pour le site local sont également exécutées (le protocole est retourné).

Cette commande peut bien entendu être appelée automatiquement (dans un crontab par exemple) de manière à automatiser la gestion de la file UUCP.