You are on page 1of 201

Linux, serveur réseaux

Jacques Morel
morel@phase.c-strasbourg.fr

v0.6, 7 juillet 2005


2

0.1 Présentation
Ce document est un cours. Il est largement inspiré de l’aide directe, de
conseils, d’écrits ou de contributions dans différents forums des personnes sui-
vantes : Benoı̂t Speckel (PLIP, SSF, clonage), Guy Brand (sécurité, sendmail),
Joel Kociolek (PPP, Hylafax, Masquerading), Alain Thivillon (Samba, ipchains),
Pascal Gris (Apache), Marc Grunberg (PPP), Alain Cote et Jean Jacques Pan-
siot (TCP-IP), Jean Luc Archimbaud (sécurité), Frédéric Couchet de April
(CGI) et enfin Olaf Kirch pour tout. Il reste sans nul doute bien des lacunes
et des erreurs. Les chapitres sur SNMP, PHP sont en préparation. Je publie
néammoins ce texte parce qu’il peut être utile à certains et qu’en retour la cri-
tique est stimulante. Si ce texte est réutilisé, veuillez être assez aimable pour
faire référence à mon labeur. Ce cours a été fait avec la distribution Linux De-
bian 2.1 et le noyau 2.2.16. Il est en cours de modification pour la Debian 3.1.

Avertissement :
Ce document date d’un cours fait en 2000 et n’a jamais été repris, hormis
quelques corrections d’erreurs. Voici quelques remarques que l’on peut faire sur
les chapitres :
– TCP-IP : reste valable. Il n’y a rien sur IPv6. Des notes sur dhcp ont été
rajoutées.
– Serveur DNS BIND : un peu mis à jour mais incomplet.
– PLIP : reste valable
– PPP : à reprendre. Il manque une introduction sur le port série et les
modems. PPPOE pour connexions ADSL est à écrire.
– Sécurité réseau : totalement à reprendre.
– Filtrage, routage : obsolète. A refaire pour iptables.
– Cryptage par ssf : obsolète. A refaire pour openssh (interdit en France à
l’époque).
– Clonage machine Debian : à refaire pour la distributions sarge. Mais les
idées restent valables.
– Sendmail : totalement insuffisant et obsolète.
– Apache : reste valable. Manque apache-ssl.
– Samba : reste valable.
– Netatalk : reste valable.
– Hylafax : incomplet mais reste valable.
Sont à rédiger les chapitres :
– openssl
– php
– Webmail IMP
– Base de données Postgres
– snmp
– Wifi ! ! !
Table des matières

0.1 Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

1 Introduction 11
1.1 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2 TCP-IP : les protocoles de l’INTERNET sur Linux 13


2.1 TCP-IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2 La pile TCP-IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Le protocole de réseau local Ethernet . . . . . . . . . . . . . . . . 14
2.3.1 CSMA/CD . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.2 Adressage . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.3 Câblage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.4 Adaptateurs . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.3.5 Drivers Ethernet . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.4.1 Adresses IP, réseaux IP . . . . . . . . . . . . . . . . . . . 18
2.4.2 Sous-réseau . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2.4.3 Paquet IP (datagram) . . . . . . . . . . . . . . . . . . . . 22
2.4.4 Routage IP . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.5 TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.5.1 Ports TCP . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.5.2 En-tête TCP . . . . . . . . . . . . . . . . . . . . . . . . . 26
2.5.3 Etats d’une connexion TCP . . . . . . . . . . . . . . . . . 28
2.6 Encapsulation des protocoles . . . . . . . . . . . . . . . . . . . . 28
2.7 UDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.8 ICMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.9 ARP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.10 Noms de machines . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.10.1 Domain Name System . . . . . . . . . . . . . . . . . . . . 30
2.11 Démarrage du réseau . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.11.1 Configuration du noyau . . . . . . . . . . . . . . . . . . . 31
2.11.2 Identification d’une machine . . . . . . . . . . . . . . . . . 32
2.11.3 Initialisation de l’interface réseau . . . . . . . . . . . . . . 32
2.11.4 La commande ifconfig . . . . . . . . . . . . . . . . . . . 33
2.11.5 La commande route . . . . . . . . . . . . . . . . . . . . . 34
2.11.6 Configuration de l’interface loopback . . . . . . . . . . . . 35
2.12 Configuration d’un routeur . . . . . . . . . . . . . . . . . . . . . 36
2.13 Résolution de noms de domaines . . . . . . . . . . . . . . . . . . 36
2.13.1 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . 36

3
4 TABLE DES MATIÈRES

2.13.2 Résolution de noms de domaine . . . . . . . . . . . . . . . 37


2.13.3 Résolution inverse de noms de domaine . . . . . . . . . . 40
2.14 Outils de diagnostic . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.14.1 ping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.14.2 traceroute . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
2.14.3 netstat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
2.14.4 telnet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
2.14.5 nc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.14.6 tcpdump . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2.14.7 arp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
2.14.8 Causes de panne réseau . . . . . . . . . . . . . . . . . . . 48
2.15 IP aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
2.16 Proxy ARP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.17 RARP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.18 DHCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.18.1 DHCP client . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.18.2 DHCP serveur . . . . . . . . . . . . . . . . . . . . . . . . 51

3 Le serveur DNS BIND 53


3.1 Le Domain Name System (DNS) . . . . . . . . . . . . . . . . . . 53
3.2 Installation en Debian . . . . . . . . . . . . . . . . . . . . . . . . 54
3.3 Exemple de configuration d’un serveur cache . . . . . . . . . . . 54
3.4 Exemple de configuration d’un serveur secondaire . . . . . . . . . 55
3.5 La base de données des noms de domaines . . . . . . . . . . . . . 57
3.6 Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.6.1 Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4 PLIP : IP sur port parallèle 61


4.1 Le câble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.2 Client et serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
4.3 Module plip . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
4.3.1 Noyau de version < 2.2 . . . . . . . . . . . . . . . . . . . 62
4.3.2 Noyau de version > 2.2 . . . . . . . . . . . . . . . . . . . 62
4.4 Côté client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.5 Côté serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
4.6 Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
4.7 Routage par le serveur . . . . . . . . . . . . . . . . . . . . . . . . 65
4.8 Test de performances . . . . . . . . . . . . . . . . . . . . . . . . . 65
4.9 Documents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

5 PPP 67
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
5.1.1 Description de PPP : HDLC, LCP, IPCP, CCP . . . . . . 67
5.1.2 Documentation . . . . . . . . . . . . . . . . . . . . . . . . 68
5.2 Installation de PPP . . . . . . . . . . . . . . . . . . . . . . . . . 68
5.2.1 Support de PPP par le noyau . . . . . . . . . . . . . . . . 68
5.2.2 Logiciel ppp-2.3.5-2 . . . . . . . . . . . . . . . . . . . . . 69
5.2.3 mgetty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.2.4 Arborescence des fichiers PPP . . . . . . . . . . . . . . . 69
5.3 Configuration du modem et du port série. . . . . . . . . . . . . . 70
TABLE DES MATIÈRES 5

5.3.1 Configuration du port série. . . . . . . . . . . . . . . . . . 70


5.3.2 Configuration du modem . . . . . . . . . . . . . . . . . . 70
5.4 Premiers pas avec PPP . . . . . . . . . . . . . . . . . . . . . . . 71
5.4.1 Session PPP manuelle . . . . . . . . . . . . . . . . . . . . 71
5.4.2 Automatisation de pppd . . . . . . . . . . . . . . . . . . . 72
5.4.3 Authentification . . . . . . . . . . . . . . . . . . . . . . . 73
5.5 Configuration d’un client . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.1 Information à réunir sur le fournisseur d’accès Internet
(ISP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
5.5.2 Résolution d’adresse . . . . . . . . . . . . . . . . . . . . . 75
5.5.3 Paramétrage PPP . . . . . . . . . . . . . . . . . . . . . . 75
5.5.4 Test de pppd . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.6 Configuration d’un serveur . . . . . . . . . . . . . . . . . . . . . . 78
5.6.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 78
5.6.2 Affectation dynamique des adresses IP : . . . . . . . . . . 81
5.6.3 Fichier /etc/ppp/pap-secrets sur un serveur : . . . . . 81
5.6.4 Login d’un utilisateur PPP . . . . . . . . . . . . . . . . . 81
5.6.5 Log d’une session PPP sur le serveur : . . . . . . . . . . . 82
5.7 Réglages fins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.8 Sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.9 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.9.1 PPP sur câble null modem . . . . . . . . . . . . . . . . . 84
5.9.2 Relier deux réseaux par PPP . . . . . . . . . . . . . . . . 84
5.9.3 Routage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.9.4 /etc/ppp/ip-up . . . . . . . . . . . . . . . . . . . . . . . . 85
5.10 Client PPP sur Microsoft Wxx . . . . . . . . . . . . . . . . . . . 86
5.11 Divers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

6 Sécurité réseau sur Linux 87


6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
6.2 Arrêter sa machine quand elle n’est pas utilisée . . . . . . . . . . 87
6.3 Arrêter les serveurs inutiles . . . . . . . . . . . . . . . . . . . . . 88
6.3.1 Les daemons . . . . . . . . . . . . . . . . . . . . . . . . . 88
6.3.2 Les services activés par inetd . . . . . . . . . . . . . . . . 90
6.4 Contrôler l’accès aux serveurs : tcp-wrapper . . . . . . . . . . . 92
6.5 Contrôler l’accès à xdm . . . . . . . . . . . . . . . . . . . . . . . . 94
6.6 Les mots de passe . . . . . . . . . . . . . . . . . . . . . . . . . . 94
6.6.1 Qualité des mots de passe . . . . . . . . . . . . . . . . . . 94
6.6.2 Shadow passwords . . . . . . . . . . . . . . . . . . . . . . 95
6.7 Appliquer les mises à jour de sécurité sur les logiciels. . . . . . . 95
6.8 Détection d’incursions . . . . . . . . . . . . . . . . . . . . . . . . 95
6.8.1 tripwire : contrôle de l’intégrité des fichiers . . . . . . . 96
6.9 Précautions élémentaires . . . . . . . . . . . . . . . . . . . . . . . 96
6.10 Principales attaques réseau et parades . . . . . . . . . . . . . . . 96
6.10.1 SYN flooding . . . . . . . . . . . . . . . . . . . . . . . . . 96
6.10.2 smurf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
6.10.3 Denial of Service (DoS) attacks . . . . . . . . . . . . . . . 98
6.10.4 IP spoofing . . . . . . . . . . . . . . . . . . . . . . . . . . 98
6.10.5 Non-blind spoofing . . . . . . . . . . . . . . . . . . . . . . 98
6.10.6 Blind spoofing . . . . . . . . . . . . . . . . . . . . . . . . 98
6 TABLE DES MATIÈRES

6.10.7 Scan de ports . . . . . . . . . . . . . . . . . . . . . . . . . 98


6.10.8 Ecoute du réseau . . . . . . . . . . . . . . . . . . . . . . . 99
6.11 Cryptage des communications . . . . . . . . . . . . . . . . . . . . 100
6.12 En savoir plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

7 Filtrage, routage et masquage des paquets IP 101


7.1 Qu’est-ce qu’un firewall ? . . . . . . . . . . . . . . . . . . . . . . 101
7.2 Masquage : permettre à un réseau privé d’accéder à Internet . . . 102
7.2.1 Configuration du noyau ( > 2.2.0 ) . . . . . . . . . . . . . 103
7.2.2 Configuration du masquage . . . . . . . . . . . . . . . . . 104
7.2.3 Configuration d’une machine du réseau interne . . . . . . 106
7.2.4 Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
7.3 La commande ipchains . . . . . . . . . . . . . . . . . . . . . . . 107
7.3.1 Chaı̂nes prédéfinies . . . . . . . . . . . . . . . . . . . . . . 107
7.3.2 Manipulation des chaı̂nes . . . . . . . . . . . . . . . . . . 108
7.3.3 Spécification d’une règle . . . . . . . . . . . . . . . . . . . 108
7.4 Exemples de filtrage . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.4.1 Test du ping . . . . . . . . . . . . . . . . . . . . . . . . . 109
7.4.2 Masquage standard . . . . . . . . . . . . . . . . . . . . . . 110
7.4.3 Antispoofing . . . . . . . . . . . . . . . . . . . . . . . . . 111
7.5 Applications clientes supportant le masquage . . . . . . . . . . . 112
7.5.1 Autoriser l’accès TCP dans un sens . . . . . . . . . . . . 112
7.6 Forward de port . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.7 Serveurs proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.7.1 http . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.7.2 telnet, ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
7.8 Raccordement d’un réseau privé à Internet par PPP . . . . . . . 113
7.9 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

8 Cryptage des communications par ssh 115


8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.2 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
8.3 Configuration de ssh . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.4 ssh serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
8.4.1 Contrôles d’accès . . . . . . . . . . . . . . . . . . . . . . . 116
8.5 ssh client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
8.5.1 Création des clés RSA : ssh-keygen . . . . . . . . . . . . 117
8.5.2 Connexion : slogin ou ssh . . . . . . . . . . . . . . . . . 117
8.5.3 Transfert de fichiers : scp . . . . . . . . . . . . . . . . . . 119
8.5.4 Automatisation de l’authentification par clé publique . . . 119
8.6 Autres implémentations de ssh . . . . . . . . . . . . . . . . . . . 122

9 Clonage d’une machine Linux Debian 123


9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.2 Configuration d’une machine mère . . . . . . . . . . . . . . . . . 123
9.2.1 Compilation d’un noyau . . . . . . . . . . . . . . . . . . . 123
9.2.2 Packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
9.3 Préparation archive sur machine mère . . . . . . . . . . . . . . . 123
9.3.1 Fichier tar . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
9.3.2 Exportation . . . . . . . . . . . . . . . . . . . . . . . . . . 124
TABLE DES MATIÈRES 7

9.4 Installation de Debian sur la nouvelle machine . . . . . . . . . . 124


9.5 Reboot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

10 Sendmail 129
10.1 Le service de mail de l’Internet . . . . . . . . . . . . . . . . . . . 129
10.2 SMTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
10.2.1 Codes retour . . . . . . . . . . . . . . . . . . . . . . . . . 130
10.2.2 Test d’un service SMTP . . . . . . . . . . . . . . . . . . . 130
10.2.3 Vérification de l’existence d’une boı̂te aux lettres . . . . . 130
10.2.4 Vérification d’un alias . . . . . . . . . . . . . . . . . . . . 131
10.3 Extensions à SMTP : ESMTP, MIME . . . . . . . . . . . . . . . 131
10.4 Interaction avec le DNS . . . . . . . . . . . . . . . . . . . . . . . 132
10.5 Caractéristiques de Sendmail . . . . . . . . . . . . . . . . . . . . 132
10.6 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.7 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.7.1 Documentation sur la configuration . . . . . . . . . . . . . 133
10.8 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
10.8.1 Une configuration de ”mail host” . . . . . . . . . . . . . . 134
10.8.2 Limitation de la taille des messages . . . . . . . . . . . . . 135
10.8.3 Suppression de la résolution d’alias par EXPN . . . . . . 136
10.8.4 Une configuration de null client . . . . . . . . . . . . . . . 136
10.8.5 Sites miroirs pour tests . . . . . . . . . . . . . . . . . . . 136
10.9 Exploitation de sendmail . . . . . . . . . . . . . . . . . . . . . . . 137
10.9.1 Sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
10.9.2 Commandes d’exploitation . . . . . . . . . . . . . . . . . 137
10.9.3 Alias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
10.9.4 Réglages fins . . . . . . . . . . . . . . . . . . . . . . . . . 137
10.9.5 Fichier Log . . . . . . . . . . . . . . . . . . . . . . . . . . 138
10.10Routage d’un domaine virtuel avec sendmail . . . . . . . . . . . . 138

11 Apache 141
11.1 Le serveur WWW Apache . . . . . . . . . . . . . . . . . . . . . . 141
11.1.1 WWW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
11.1.2 HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
11.2 Caractéristiques de Apache . . . . . . . . . . . . . . . . . . . . . 144
11.3 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
11.4 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
11.5 Lancement de Apache . . . . . . . . . . . . . . . . . . . . . . . . 145
11.6 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
11.6.1 Paramètres généraux . . . . . . . . . . . . . . . . . . . . . 146
11.6.2 Configuration des ressources . . . . . . . . . . . . . . . . . 147
11.6.3 Restrictions d’accès . . . . . . . . . . . . . . . . . . . . . 147
11.7 Les modules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
11.8 Virtual hosts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
11.9 Content negotiation . . . . . . . . . . . . . . . . . . . . . . . . . 153
11.9.1 Multiviews . . . . . . . . . . . . . . . . . . . . . . . . . . 153
11.9.2 Handler type-map . . . . . . . . . . . . . . . . . . . . . . 154
11.10Restrictions d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . 154
11.11Autres capacités de Apache . . . . . . . . . . . . . . . . . . . . . 155
11.12Maintenance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
8 TABLE DES MATIÈRES

11.12.1 Erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155


11.12.2 Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . 156

12 Exécution de programmes CGI sur un serveur WWW 157


12.1 Introduction à la Common Gateway Interface . . . . . . . . . . . 157
12.1.1 Pourquoi utiliser les programmes CGI . . . . . . . . . . . 157
12.1.2 Prérequis et choix techniques . . . . . . . . . . . . . . . . 157
12.1.3 Configuration du serveur Web . . . . . . . . . . . . . . . . 158
12.2 Notions fondamentales . . . . . . . . . . . . . . . . . . . . . . . . 158
12.3 Un programme en Bourne shell . . . . . . . . . . . . . . . . . . . 159
12.4 Saisie et traitement des champs d’un formulaire . . . . . . . . . . 161
12.4.1 Récupération des informations en Perl et en shell . . . . . 163
12.4.2 Les variables d’environnement . . . . . . . . . . . . . . . . 166
12.5 Déboguer un script CGI . . . . . . . . . . . . . . . . . . . . . . . 167

13 Samba 171
13.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
13.2 Protocoles Microsoft . . . . . . . . . . . . . . . . . . . . . . . . . 171
13.2.1 Ports ouverts sur les machines Windows Microsoft . . . . 173
13.2.2 Configuration des clients réseau Microsoft sur Windows . 173
13.3 Commandes Lan-Manager sous DOS . . . . . . . . . . . . . . . . 174
13.3.1 Commandes net . . . . . . . . . . . . . . . . . . . . . . . 174
13.3.2 Interrogation de noms NetBIOS . . . . . . . . . . . . . . . 174
13.4 Le logiciel Samba . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
13.4.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . 174
13.4.2 Description . . . . . . . . . . . . . . . . . . . . . . . . . . 175
13.4.3 Utilitaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
13.4.4 Documentation . . . . . . . . . . . . . . . . . . . . . . . . 175
13.5 Configuration de Samba . . . . . . . . . . . . . . . . . . . . . . . 175
13.5.1 Structure et syntaxe . . . . . . . . . . . . . . . . . . . . . 176
13.5.2 Section ”global” . . . . . . . . . . . . . . . . . . . . . . . 176
13.5.3 Partage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
13.5.4 Section ”homes” . . . . . . . . . . . . . . . . . . . . . . . 178
13.5.5 Section ”printers” . . . . . . . . . . . . . . . . . . . . . . 178
13.5.6 Partage accessible par tous en lecture/écriture . . . . . . 179
13.5.7 Partage accessible par tous en lecture, réservé en écriture 179
13.5.8 Partage à accès réservé . . . . . . . . . . . . . . . . . . . 179
13.5.9 Authentification . . . . . . . . . . . . . . . . . . . . . . . 179
13.6 Audit : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
13.7 Incidents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
13.8 Accès depuis Unix aux ressources Windows . . . . . . . . . . . . 181
13.8.1 smbclient : accès aux fichiers Windows à la ftp . . . . . 181
13.8.2 Messages Winpopup . . . . . . . . . . . . . . . . . . . . . 182
13.8.3 smbtar . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
13.8.4 smbmount . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
13.8.5 smbprint . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
13.9 Applications de samba . . . . . . . . . . . . . . . . . . . . . . . . 183
13.9.1 Distribution de logiciels pour Windows . . . . . . . . . . . 183
13.9.2 Fonction Primary Domain Controller de Samba . . . . . 183
13.9.3 Installation partagée de drivers d’imprimante pour W9x . 184
TABLE DES MATIÈRES 9

13.9.4 Serveurs virtuels . . . . . . . . . . . . . . . . . . . . . . . 185

14 Netatalk : serveur AppleTalk 187


14.1 Une implémentation du protocole AppleTalk en Unix BSD like . 187
14.2 Implémentation en Linux . . . . . . . . . . . . . . . . . . . . . . 188
14.3 Documentation : . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
14.4 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
14.5 Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.5.1 atalkd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.5.2 afpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.5.3 papd . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.5.4 pap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.6 Commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
14.7 Incidents . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190

15 HylaFAX 191
15.1 Les normes de fax . . . . . . . . . . . . . . . . . . . . . . . . . . 191
15.1.1 Standard ITU : Groupes de Fax . . . . . . . . . . . . . . 191
15.1.2 Standards ITU de vitesse de transmission . . . . . . . . . 191
15.1.3 Protocoles d’envoi de fax . . . . . . . . . . . . . . . . . . 191
15.2 Fonctions de HylaFAX . . . . . . . . . . . . . . . . . . . . . . . . 194
15.3 Sur quelles machines fonctionne Hylafax ? . . . . . . . . . . . . . 194
15.4 Choisir et installer un modem : . . . . . . . . . . . . . . . . . . . 195
15.4.1 Hylafax et les modems : . . . . . . . . . . . . . . . . . . . 195
15.4.2 Les modems recommandés : . . . . . . . . . . . . . . . . . 195
15.4.3 Installer le modem sur un PC . . . . . . . . . . . . . . . . 195
15.5 Installation de HylaFAX . . . . . . . . . . . . . . . . . . . . . . . 196
15.5.1 Prérequis : . . . . . . . . . . . . . . . . . . . . . . . . . . 196
15.5.2 Procédure d’installation . . . . . . . . . . . . . . . . . . . 196
15.5.3 Documentation . . . . . . . . . . . . . . . . . . . . . . . . 196
15.6 Configuration de HylaFAX . . . . . . . . . . . . . . . . . . . . . 196
15.6.1 Les scripts de configuration . . . . . . . . . . . . . . . . . 196
15.6.2 Les fichiers de configuration : . . . . . . . . . . . . . . . . 197
15.6.3 Démarrage de HylaFAX . . . . . . . . . . . . . . . . . . . 197
15.7 Envoi d’un fax . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
15.7.1 Commande d’envoi de fax sur Unix : sendfax . . . . . . . 197
15.7.2 Contrôle de l’envoi : . . . . . . . . . . . . . . . . . . . . . 198
15.8 Réception d’un fax . . . . . . . . . . . . . . . . . . . . . . . . . . 198
15.9 Configuration des clients Hylafax sur une machine Linux . . . . . 199
15.10Les clients HylaFAX . . . . . . . . . . . . . . . . . . . . . . . . . 199
15.11Gestion du serveur HylaFAX . . . . . . . . . . . . . . . . . . . . 200
15.11.1 Optimisation des envois . . . . . . . . . . . . . . . . . . . 200
15.11.2 Contrôle d’accès . . . . . . . . . . . . . . . . . . . . . . . 200
15.11.3 Statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . 201
15.11.4 Incidents . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
15.12Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
10 TABLE DES MATIÈRES
Chapitre 1

Introduction

Linux sur PC Intel est une plateforme économique, fiable et polyvalente pour
faire un serveur réseau.
Linux supporte les protocoles :
– TCP/IP (v4) : logiciel fiable, drivers de qualité pour les cartes Ethernet
(10Base-T, 100Base-TX, Gigabit Ethernet) et les cartes PCMCIA, ser-
veurs les plus usités sur le net : Apache, sendmail, ...
– UUCP : ancien mais encore utile pour des connexions téléphoniques inter-
mittentes sur des réseaux peu fiables.
– IPv6, amélioration de IP v4 pour répondre à la croissance d’Internet
– IPX/SPX (Novell Netware) : routeur, serveur, client
– Ethertalk : serveur Netatalk : partage des fichiers par AFP, des impri-
mantes par PAP
– LAN-Netbios Microsoft : serveur Samba
– PPP : pppd client et serveur. Nombreuses cartes séries multiports pour
serveurs d’accès à Internet.
– ISDN (RNIS en français comme le service Numeris de FT), support dans
le noyau pour les cartes ISDN PC.
– PLIP : Ip sur port parallèle au moyen d’un câble Null-Printer ou Lap-Link
– ADSL : le support des modems Alcatel de France Telecom est assuré par
PPTP et PPPOE.
Linux est une excellente plateforme aussi bien comme serveur INTERNET
(www, ftp, mail) que comme serveur Intranet pour des PC Windows ou des
Apple Macintosh.
Linux dispose de logiciels permettant de supporter une charge réseau impor-
tante et de fonctionnalités comme le load balancing, le forward de port, permet-
tant de répartir la charge entre plusieurs serveurs. Environ 30% des serveurs sur
Internet sont des machines Linux.
Par ailleurs, Linux sait router, filtrer, masquer les paquets IP. Un simple PC
Linux muni de plusieurs interfaces réseaux permet de connecter un réseau privé
à Internet et d’assurer des fonctions de garde-barrière (firewall), pour protéger
le réseau privé des incursions et des fonctions de serveur proxy pour faire des
requêtes sur Internet par délégation pour le compte des machines du réseau
privé.
Linux sait également faire du tunelling qui permet de faire voir une machine
distante (un PC portable connecté via un ISP et bientôt par téléphone portable)

11
12 CHAPITRE 1. INTRODUCTION

comme si elle était sur le réseau local.


Plus généralement, Linux est un Unix. Il a pour but la conformité Posix,
il utilise tous les produits de développement Gnu. C’est pourquoi il est très
facile d’installer un logiciel Unix sur Linux. Il faut d’ailleurs dire, en toute
honnêteté, que les Unix libres pour PC de la série BSD, NetBSD, FreeBSD, ...
sont souvent plus en avance en matière de logiciels réseau que Linux, sans doute
à cause de Unix BSD mis au point en 1983 à l’université de Berkeley qui fut
l’implémentation la plus populaire des protocoles TCP/IP, ceux de l’Internet,
largement utilisés aujourd’hui de par le monde.
L’objet ici étant de faire fonctionner un serveur, c’est la distribution Linux
Debian (2.1 slink ici) qui est choisie pour sa stabilité, la facilité des mises à jour
par réseau et sa promptitude à corriger les trous de sécurité.

1.1 Documentation
Avant tout il faut lire The Linux Network Administrator’s Guide, ver-
sion 1.0 de Olaf Kirch dernière mise à jour de mars 96. Edité chez O’Reilly et
déchargeable sur le net :
ftp://ftp.lip6.fr/pub/linux/sunsite/docs/LDP/network-guide/nag-1.0.ps.tar.gz
ftp://ftp.lip6.fr/pub/linux/sunsite/docs/LDP/network-guide/nag-1.0.src.tar.gz
ftp://ftp.lip6.fr/pub/linux/sunsite/docs/LDP/network-guide/nag-1.0.html.tar.gz
Cet ouvrage est bien sûr assez ancien. Le chapitre sur sendmail est un peu
dépassé, les possibilités de filtrage de masquerading ne sont pas abordées. Mais
sa lecture est recommandée pour les néophytes en matière réseau et en rien
inutile pour les autres.
Il y a aussi les How-To et la documentation fournie avec chaque logiciel.
Chapitre 2

TCP-IP : les protocoles de


l’INTERNET sur Linux

2.1 TCP-IP
Les protocoles de l’Internet sont désignés par le terme générique de TCP-IP.
Ils peuvent être utilisés aussi en réseau local, sans connexion avec Internet, c’est
ce qu’on appelle maintenant l’Intranet.
La lecture des documents suivants de Charles Hedrick est recommandée :
Introduction à TCP/IP
Ce document se trouve à la fois sur
ftp://athos.rutgers.edu/runet/tcp-ip-intro.doc
en version texte et
ftp://athos.rutgers.edu/runet/tcp-ip-intro.ps
en version postscript.
Administration TCP/IP
ce document se trouve à la fois sur
ftp://athos.rutgers.edu/runet/tcp-ip-admin.doc
en version texte et
ftp://athos.rutgers.edu/runet/tcp-ip-admin.ps
en version postscript.
On trouvera les documents techniques sur TCP/IP, les RFC (Request For
Comment) sur de nombreux sites comme :
http://www.pasteur.fr/other/computer/RFC

2.2 La pile TCP-IP


C’est une simplification du modèle en 7 couches de l’OSI mais qui a révélé
sa robustesse et son adaptabilité.
TCP/IP n’a que 4 couches :
– La couche application : telnet, ftp, smtp, rpc, X11, http, ... utilisent le
transport TCP ; tftp, domain, nfs utilisent le transport UDP

13
14CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

– La couche transport soit TCP, soit UDP qui recourent tous deux à la
couche IP en dessous.
– La couche réseau : IP avec en plus ICMP pour les messages de services
– La couche protocole de réseau local. Une des forces de IP est qu’il
peut s’adapter à de nombreux protocoles de réseau : Ethernet, Token
Ring, FDDI, Fast Ethernet, Gigabit Ethernet, ...

OSI TCP/IP
+-----------------------+-----------------------+-------------+
| 7 Application | TELNET, FTP | |
+-----------------------+ SMTP | TFTP |
| 6 Présentation | RPC | DOMAIN |
+-----------------------+ X11 | NFS |
| 5 Session | HTTP | |
+-----------------------+-----------------------+-------------+
| 4 Transport | TCP | UDP |
+-----------------------+-----------------------+-------------+
| 3 Réseau | IP (Internet Protocol), ICMP, ARP |
+-----------------------+-------------------------------------+
| 2 Data Link | Local Network Protocol |
+-----------------------+ (Ethernet, Fast Ethernet, FDDI...) |
| 1 Physique | |
+-----------------------+-------------------------------------+

Protocol Relationships

Le protocole de réseau local est en général géré de manière hardware par


une carte interface ou adaptateur réseau appelé aussi NIC (Network Interface
Card ). C’est la carte Ethernet classique. Un logiciel, le driver, fait l’interface
entre cette carte et le noyau. Ce driver ne dépend pas de IP mais uniquement
de l’adaptateur et du noyau Linux.
Le protocole de réseau local peut aussi être géré de manière logicielle. C’est
le cas de PPP pour le port série et le modem téléphonique ou de PLIP pour le
port parallèle.

2.3 Le protocole de réseau local Ethernet


C’est la norme IEEE 802.3. Il fonctionne sur le principe de la diffusion (an-
glais broadcast). Les machines sont toutes connectées au même câble (bus). Un
message envoyé par l’une est reçu par toutes les autres. Toutes les machines
peuvent parler en même temps.

2.3.1 CSMA/CD
Comment éviter la cacaphonie ? On peut comme dans les réunions nommer
un président de séance qui donne la parole quand on la lui demande ou bien se
mettre en cercle (ring) se passer un jeton (token) et ne prendre la parole que
lorsqu’on a le jeton. Non, Ethernet utilise une autre méthode moins directive et
non déterministe : CSMA/CD
2.3. LE PROTOCOLE DE RÉSEAU LOCAL ETHERNET 15

Que se passe t’il quand la machine x veut émettre ?


– x s’assure que le bus est libre (Carrier Sense)
– si oui, x commence à émettre
– si y émet aussi (Multiple Access), alors une collision est détectée (Collision
Detect), il y a signal jam. Alors,
– x attend durant un temps t1 fixé de manière aléatoire puis essaie d’émettre
– y attend durant un temps t2 fixé de manière aléatoire puis essaie d’émettre

2.3.2 Adressage
Comment une machine peut-elle s’adresser à une autre ? Chaque machine a
une adresse Ethernet unique formée de 6 octets (48 bits) et notée sous forme de 6
nombres hexadécimaux comme on le voit dans le champ HWaddr 00 :50 :04 :F9 :33 :82
quand on fait ifconfig eth0 :

ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:50:04:F9:33:82
inet addr:193.54.230.20 Bcast:193.54.230.255 Mask:255.255.255.0
EtherTalk Phase 2 addr:65280/102
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65483155 errors:0 dropped:0 overruns:0 frame:0
TX packets:99422413 errors:0 dropped:0 overruns:0 carrier:0
Collisions:1887649
Interrupt:12 Base address:0xe000

Comment une machine reçoit les paquets qui lui sont destinés ?
Les paquets circulant sur le bus sont analysés par chaque interface Ethernet.
Si le paquet comporte l’adresse de l’interface en adresse destinataire, il l’envoie à
IP, sinon il le jette. Sauf dans le cas où l’interface est mis en mode promiscuous.
Quel est le débit ? Le débit nominal est 10 Mégabits/sec (Mbps). En raison
des collisions, il est fonction de la charge, c’est à dire du nombre de machines
connectées qui veulent émettre en même temps. Il est aussi fonction du temps
de parcours du paquet, donc de la longueur du bus. En pratique le débit est de
5 Mbps.
Comment mesurer les collisions ? Elles se voient sur les voyants ”Col” des
hubs. Elles sont aussi comptabilisés et leur nombre s’affiche quand on fait
ifconfig eth0 (voir ci-dessus) ou cat /proc/net/dev
Comment diminuer le nombre de collisions ? En utilisant des switchs plutôt
que des hubs.
Structure d’un paquet Ethernet : Il fait 1500 octets (c’est pour cela qu’on
fixe MTU=1500 par défaut dans ifconfig).
Code Type indique un protocole comme TCP/IP, DECnet, Xerox NS, IPX :
on peut utiliser plusieurs protocoles différents simultanément sur un même
réseau.
Le checksum est calculé sur tout le paquet.

2.3.3 Câblage
– 10Base-5 Ethernet 10Mbps, câble coaxial thick (jaune) lmax=200m. Trans-
ceiver ”piqué” sur le câble avec prise AUI à 15 broches. Obsolète.
16CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

+----------------------------------------------------------------------+
| Adresse Ethernet destination (32 premiers bits) |
+----------------------------------------------------------------------+
| Ethernet dest (16 derniers bits) | Ethernet source (16 premiers bits)|
+----------------------------------------------------------------------+
| Adresse Ethernet source (32 derniers bits) |
+----------------------------------------------------------------------+
| Code Type | |
+----------------------------------------------------------------------+
| En-t^
ete IP, En-t^ete TCP, ensuite vos données |
| ... |
| |
| Fin de vos données |
+----------------------------------------------------------------------+
| Checksum Ethernet |
+----------------------------------------------------------------------+

Fig. 2.1 – Structure d’un paquet Ethernet

– 10Base-2 Ethernet 10Mbps, câble coaxial thin lmax=500m. Il faut mettre


un bouchon aux 2 bouts. Prise BNC en T. Si une machine est déconnectée,
le réseau est coupé. Déconseillé.
– 10Base-T Ethernet 10Mbps, ou paire torsadée (twisted pair ), câble de
8 fils, 4 utilisés (1,2,3,6), norme UTP ou FTP catégorie V (supporte 100
Mbps), prise RJ45. Structure en étoile et non en bus. Hub= répéteur et
concentrateur. Pas plus de 4 répéteurs entre deux machines. lmax= 100m
entre hubs, 100m entre hub et machine. Aujourd’hui on s’équipe de switchs
plutôt que de hubs et on passe en Fast Ethernet (100 Mbps) avec le même
câble catégorie V.
Ethernet 10Base-T Straight Thru patch cord (T568B colors);

RJ45 Plug RJ45 Plug


========= =========
/--T2 1 ... White/Orange .... 1 TxData +
pair2 \--R2 2 ... Orange .......... 2 TxData -
/----------T3 3 ... White/Green ..... 3 RecvData +
/ R1 4 Blue 4
\ pair3 T1 5 White/Blue 5
\----------R3 6 ... Green ........... 6 RecvData -
T4 7 White/Brown 7
R4 8 Brown 8
– 10Base-F Ethernet 10Mbps, fibre optique multimode connectique ST,
lmax 2000m.
On peut connecter deux machines sans hub avec un câble 10Base-T croisé.
Ethernet 10Base-T Crossover patch cord;
This cable can be used to cascade hubs, or for connecting
two Ethernet stations back-to-back without a hub (ideal for
two station Doom!)
2.3. LE PROTOCOLE DE RÉSEAU LOCAL ETHERNET 17

RJ45 Plug 1 Tx+ -------------- Rx+ 3 RJ45 Plug


2 Tx- -------------- Rx- 6
3 Rx+ -------------- Tx+ 1
6 Rx- -------------- Tx- 2

2.3.4 Adaptateurs
Ne plus acheter d’adaptateur ISA ou 10Mbps. Prendre des adaptateurs pour
bus PCI 10/100 Mbps.
Linux supporte une grande variété d’adaptateurs parmi ceux-ci :
– 3 COM 3C905C-TX/B 10/100 PCI : driver 3c59x : 3c590 series (592/595/597)
”Vortex”.
Lire Documentation/networking/vortex.txt
– carte à base de chip DEC 21143 : driver tulip
– cartes à base de chip ne2000 : drivers ne2k ou ne2kpci. Déconseillé pour
un serveur.
Linux supporte les cartes Ethernet PCMCIA pour PC portable et les nou-
velles cartes Gigabit Ethernet.

2.3.5 Drivers Ethernet


Choix du driver
Le choix du driver se fait lors de la configuration du noyau. Les distribu-
tions Linux actuelles ont de nombreux drivers en modules. Il n’y a donc pas à
recompiler le noyau.
Driver en module ou dans le noyau ?
Pour un serveur réseau on a intérêt à le mettre dans le noyau (pour des
raisons de sécurité vis à vis du piratage, il est conseillé de ne pas configurer le
support des modules CONFIG MODULES=NO).
Manipulation des modules
Chargement automatique dans Debian : Fichier /etc/modules
Chargement module tulip à la main sous root :
– insmod tulip
– lsmod (liste modules chargés)
– rmmod tulip
Documentation :
On trouve le source des drivers dans /usr/src/linux/drivers/net, de la
documentation dans les fichiers README de ce répertoire ou dans /usr/src/linux/Documentation/networking.
Donald Becker becker@cesdis.gsfc.nasa.gov est l’auteur de la plupart
des drivers Ethernet. On se reportera à son site : http ://cesdis.gsfc.nasa.gov/linux/
Reconnaissance par le noyau :
Au boot, le noyau détecte la présence de l’adaptateur. Ceci à condition qu’on
ait configuré le bon driver dans le noyau ou en module. Si le noyau ne le reconnaı̂t
pas (on peut relire les messages du noyau par dmesg), il est inutile de continuer.
Le noyau sait reconnaı̂tre plusieurs adaptateurs.
IRQ, IO Base address
Sur un PC, un périphérique est affecté en général d’un numéro d’interruption
(IRQ) et d’une adresse d’entrée-sortie (IO Base address). Il ne peut fonctionner
si un autre périphérique a la même IRQ. Avec le bus PCI il y a attribution
dynamique des IRQ. Avec les cartes ISA, il y a plus de problèmes : il faut
18CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

configurer l’IRQ et l’IO Base address sur la carte et sur Linux. Il faut réserver
l’IRQ pour la carte ISA dans le Setup du BIOS. Pour les cartes 3COM 3C509B
on utilisait le logiciel fourni sous DOS par 3COM pour configurer IRQ, IO Base
address et enlever l’option ”Plug and play”.
Le module isapnp régle ce problème en noyau 2.0. En noyau 2.2, le support
du ”Plug and play” est dans le noyau (CONFIG PNP=YES)
On peut lister les IRQ utilisées par cat /proc/interrupts et les IO Base
addresses par cat /proc/ioports.
La commande ifconfig eth0 affiche l’IRQ (Interrupt) et l’IO Base address
(Base address).
Il est possible de passer des paramètres au driver de l’adaptateur réseau :
– soit au boot, s’il est dans le noyau. On peut dans /etc/lilo.conf ajouter
une ligne :
append ether=12,0xe000
où 12 est l’IRQ et 0xe000 l’IO Base address.
– soit au chargement du module. Pour essayer des options, le module est
beaucoup plus souple. Par exemple, on peut charger le module tulip par :
insmod tulip.o debug=1 options=0,16
Ce qui met le niveau de debug minimum et le media type à Autosense pour
la première carte Ethernet(0), à full duplex (16) pour la seconde (voir cat
/proc/pci pour l’ordre des cartes).

2.4 IP
C’est l’Internet Protocol décrit dans RFC 791. Son rôle est d’acheminer des
blocs de données appelés paquets (datagram) de la machine expéditeur vers
la machine destinataire. Pour cela il identifie de manière unique les machines
(hosts) du réseau par une adresse. En général, un paquet a un seul destinataire
(unicast), mais une extension de IPv4 permet de l’envoyer à plusieurs (multi-
cast). Il s’occupe aussi de fragmenter et de réassembler les paquets si nécessaire.
Il communique avec la couche ”Protocole de réseau local”, le plus souvent Ether-
net. L’encapsulation dans Ethernet est décrite dans RFC 825 et 894.

2.4.1 Adresses IP, réseaux IP


Une adresse est formée de quatre octets (32 bits). On l’écrit en général sous
forme de quatre tranches de chiffres décimaux séparés par des points (dotted quad
notation). Sous cette forme chaque octet est converti en un nombre décimal (0-
255), en omettant les zéros de tête (à moins que ce nombre ne soit lui-même un
zéro) et chaque octet est séparé par le caractère ‘.’.
Une adresse est formée de l’adresse réseau, suivi de l’adresse locale dans le
réseau. Il y a trois formats ou classes d’adresses décrites dans le tableau 2.1.
– Dans la classe A, le bit de poids le plus fort est nul. L’adresse d’un réseau
est sur un octet et va de 0 à 127. Les 24 bits suivants forment l’adresse
locale.
– Dans la classe B, le bit de poids le plus fort est à 1, le bit suivant est à
zéro. La première tranche de chiffres va de 128 à 191. Une adresse réseau
fait deux octets donc deux tranches de chiffres.
2.4. IP 19

----------------------------------------------------------
|Classe de |Masque de | Plage d’adresses |
| réseau | réseau | |
----------------------------------------------------------
| A | 255.0.0.0 | 0.0.0.0 - 127.255.255.255 |
| B | 255.255.0.0 | 128.0.0.0 - 191.255.255.255 |
| C | 255.255.255.0 | 192.0.0.0 - 223.255.255.255 |
|Multicast| 240.0.0.0 | 224.0.0.0 - 239.255.255.255 |
----------------------------------------------------------

Tab. 2.1 – Classes d’adresses IP

– Dans la classe C, les deux bits de poids le plus fort sont à 1, le suivant à
zéro. Une adresse réseau fait trois octets donc trois tranches de chiffres. Les
8 derniers bits forment l’adresse locale. Il n’y a que 256 numéros différents.

Address Formats:

High Order Bits Format Class


--------------- ------------------------------- -----
0 7 bits of net, 24 bits of host a
10 14 bits of net, 16 bits of host b
110 21 bits of net, 8 bits of host c
111 escape to extended addressing mode

Une machine qui a plusieurs interfaces réseau aura une adresse par interface.
L’adresse 0.0.0.0 n’est pas affectée, elle signifie n’importe quelle adresse dans
les logiciels de routage et de filtrage.
localhost
Par convention l’adresse 127.0.0.1 est réservée pour désigner la machine lo-
cale. De même 127.0.0.0 est réservé pour désigner le réseau associé.
Masque de réseau (netmask )
C’est un nombre de 32 bits qui s’il est combiné par un AND bit à bit avec
l’adresse IP d’une machine donne son adresse réseau. Ainsi :
– adresse 193.54.230.20 : de classe C car la première tranche de chiffre est
> 192
– le netmasq est donc 255.255.255.0
– 255.255.255.0 AND 193.54.230.20 = 193.54.230.0
On note l’adresse réseau par 4 tranches de chiffres décimaux mais avec la
partie locale à zéro.
Adresse locale ou routage ?
Pour savoir comment envoyer un message à une adresse, IP teste si cette
adresse fait partie du réseau local :

Si adresse AND netmask == adresse réseau local


Alors envoi par Ethernet
Sinon routage
20CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Donc par définition IP ne fait pas de routage à l’intérieur d’un réseau. En


conséquence, un réseau doit être contigü, il ne peut pas être décomposé en
plusieurs parties séparées par des routeurs. Si on veut passer outre, on a le
recours du tunelling IP sur IP.
Adresse de broadcast (adresse de diffusion).
Cette adresse permet d’atteindre toutes les machines d’un réseau. Tous les
bits de la partie locale sont à 1. Ainsi :
Pour le réseau 193.54.230, l’adresse de broadcast est 193.54.230.255. Envoi
d’un ping à l’adresse de broadcast :

ping 193.54.230.255

Les systèmes Windows Microsoft ne répondent pas en général : elles ne sont


pas conformes aux standards de l’Internet !
Il arrive dans certaines implémentations (anciennes) de IP que l’adresse de
broadcast soit l’adresse réseau, dans l’exemple précédent : 193.54.230.0 Autre
exemple :

---------------------------------------- ----------------
Adresse machine (host address) 130.79.186.31
Masque de réseau (network mask) 255.255.255.0
Partie réseau (network portion) 130.79.186.
Partie machine (host portion) .31
---------------------------------------- ----------------
Adresse réseau (network address) 130.79.186.0
Adresse de diffusion (broadcast address) 130.79.186.255
---------------------------------------- ----------------

L’autorité d’attribution des adresses est l’IANA.


L’ Internet Assigned Number Authority attribue :
– les adresses IP
– les numéros de ports (RFC 1062 ”Assigned numbers”)
– donne délégation aux opérateurs
En Europe les adresses IP sont distribuées par RIPE (Réseaux IP Eu-
ropéens), on interroge leur base de données des réseaux par whois, exemple :

[morel]$ whois -h whois.ripe.net 130.79.0.0

% Rights restricted by copyright.


See http://www.ripe.net/ripencc/pub-services/db/copyright.html

inetnum: 130.79.0.0 - 130.79.255.255


netname: OSIRIS
descr: Centre Reseau et Communication, Universite Louis Pasteur
descr: 7 rue Rene Descartes, 67084 Strasbourg CEDEX, France
country: FR
admin-c: SG1289-RIPE
tech-c: AC1695-RIPE
tech-c: JP3374-RIPE
changed: <Annie.Renard@inria.fr> 19930908
changed: ripe-dbm@ripe.net 19990706
2.4. IP 21

changed: ripe-dbm@ripe.net 20000225


source: RIPE
...
Adresses privées
Des tranches d’adresses ont été prévues pour des réseaux privés non reliés à
l’Internet ( RFC 1597) :
-----------------------------------------------------------
| ADRESSES POUR RÉSEAUX PRIVÉS |
-----------------------------------------------------------
| Classe | Masque de | Adresses de réseau |
| réseau | réseau | |
-----------------------------------------------------------
| A | 255.0.0.0 | 10.0.0.0 - 10.255.255.255 |
| B | 255.255.0.0 | 172.16.0.0 - 172.31.255.255 |
| C | 255.255.255.0 | 192.168.0.0 - 192.168.255.255 |
-----------------------------------------------------------

2.4.2 Sous-réseau
Dans l’exemple précédent de l’adresse IP 130.79.186.31, le masque de réseau
était 255.255.255.0. Or 130 indique un réseau de classe B : 130.79.0.0. Normale-
ment le masque de réseau devrait être 255.255.0.0. L’adresse réseau devrait être
130.79.0.0. Or elle est 130.79.186.0.
Il s’agit là d’un réseau ”subnetté”. Vu de l’extérieur c’est un réseau de classe
B d’un seul tenant, donc sans routeur. Le netmask est bien 255.255.0.0. Le
routeur d’entrée de ce réseau lui applique le netmask 255.255.255.0 et route
vers le routeur du sous-réseau concerné.
Autre exemple : On veut découper le réseau de classe C : 193.54.230.0 en 4
sous-réseaux, soit 2 bits de ”subnetting”. La partie réseau va faire 24+2 = 26
bits. La partie adresse locale fera 6 bits, soit 64 adresses possibles. Le netmask
va être : 255.255.255.x où x=11000000 en binaire c’est à dire 192 décimal. Donc
le netmask sera 255.255.255.192 et les sous-réseaux :
– 193.54.230.0 : adresses de 193.54.230.0 à 193.54.230.63
– 193.54.230.64 : adresses de 193.54.230.64 à 193.54.230.127
– 193.54.230.128 : adresses de 193.54.230.128 à 193.54.230.191
– 193.54.230.192 : adresses de 193.54.230.192 à 193.54.230.255
Ces sous-réseaux doivent être séparés par des routeurs.
Renater distribue actuellement des sous-réseaux de classe C.
Notation des adresses
Comme on voit que la classe de l’adresse ne suffit pas pour déterminer le net-
mask et donc l’adresse du réseau auquel elle appartient, il est nécessaire de tou-
jours accompagner l’adresse avec ce netmask. D’où les notations address/mask :
– 193.54.230.20/255.255.255.0 : adresse d’une machine de classe C
– 193.54.230.20/24 : idem (24 signifie les 24 bits de poids le plus fort à 1)
– 193.54.230.0/255.255.255.0 : ensemble des adresses de 193.54.230.0 à 193.54.230.255.
réseau.
Adresses CIDR
Pour mieux utiliser l’espace d’adressage de IPv4 en attendant IPv6, on a
défini le Classless Inter-Domain Routing. ou CIDR en abrégé. Avec CIDR, les
22CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

préfixes des sous-réseaux font entre 13 et 27 bits de longs : on obtient un plus


grand nombre de sous-réseaux qu’avec la répartition classiques en classes A, B
et C. Les adresses sont données sous la forme :

193.54.230.20/24

24 étant le nombre de bits de la partie réseau ou un masque avec 24 bits de


poids le plus fort à 1.

2.4.3 Paquet IP (datagram)


Avant de l’envoyer, IP ajoute à chaque paquet de données qui lui est transmis
par les couches supérieures un en-tête comportant entre autres :
– l’adresse de l’expéditeur
– l’adresse du destinataire
– le numéro du protocole (voir fichier /etc/protocols et le tableau 2.2)

0 IP internet protocol, pseudo proto-


col number
1 ICMP internet control message protocol
6 TCP transmission control protocol
17 UDP user datagram protocol

Tab. 2.2 – Principaux numéros de protocole voir /etc/protocols

– un checksum de l’en tête, pour s’assurer de l’intégrité des adresses notam-


ment.
– une durée de vie (TTL : Time To Live)

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Tab. 2.3 – En-tête d’un datagramme IP

– IHL : IP Header length


2.4. IP 23

– TTL : Time To Live : en fait nombre de routeurs que le paquet peut tra-
verser. A chaque routage TTL-=1. Si TTL==0 le paquet est détruit. Permet
d’éviter les boucles.
Quand on active un interface réseau sur une machine on définit le paramètre
MTU (Maximum Transmission Unit), en général 1500 octets. Si la taille du
paquet à transmettre lui est supérieur, IP le fragmente.
A la réception, IP contrôle le checksum, s’il est mauvais le paquet est rejetté
en erreur. Sinon ce header est enlevé et le paquet résultant est passé à la couche
du dessus.

2.4.4 Routage IP
Routage
Le routage consiste à envoyer un paquet IP sur un autre réseau.
Routeur (Gateway)
On dit parfois en français passerelle. Un pont est autre chose, il se situe au
niveau 2 du modèle OSI en 7 couches, le routeur est au niveau 3.
Un routeur est une machine dotée de plusieurs interfaces réseaux et qui traite
la couche IP de la pile TCP/IP. Un PC Linux avec plusieurs interfaces réseaux
devient un routeur si on fait :

echo "1" > /proc/sys/net/ipv4/ip_forward

– Il a autant d’interface et d’adresses IP que de réseaux auxquels il est


connecté. Ces réseaux n’ont pas nécessairement la même couche ”Proto-
cole de réseau local”, ce peut être aussi une liaison point à point (PPP,
PLIP,...).
– pour chaque paquet, lit l’en-tête, contrôle le checksum, lit les adresses IP,
décrémente TTL, jette le paquet si TTL==0.
– aiguille le paquet vers un de ses interfaces, suivant un certain algorithme.
Si le routeur est saturé, il peut jeter des paquets.
IP fait de son mieux pour acheminer les paquets, mais il peut en perdre
(”best effort”). Cette possibilité de perdre des paquets évite l’écroulement du
réseau. D’autre facteurs permettent un grand débit : l’intégrité des données n’est
pas contrôlée, il n’y a pas de comptabilité ni de facturation. Chaque paquet
appartenant à une même entité de départ (un fichier par exemple) est routé
indépendemment des autres. IP est dit ”connectionless” à (l’opposé de TCP).

+-------------------------------+
| Internet Protocol & ICMP & GGP|
+-------------------------------+
| |
+---------------+ +---------------+
| Local Net 1 | | Local Net 2 |
+---------------+ +---------------+

Gateway Protocols

GGP : Gateway to Gateway Protocol


Algorithmes de routage
24CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

En principe, le routage se fait suivant l’adresse IP du destinataire. Un opérateur


de réseau doit accepter que des paquets traverse son réseau quelle que soit leur
provenance.
Dans une configuration simple, on fait du routage ”statique”. Mais s’il existe
plusieurs routes pour aller d’un site à l’autre on risque des boucles.
Quand il existe plusieurs routes pour accéder à une machine et/ou que le
réseau devient grand, il faut échanger avec les autres routeurs des tables de
routage et recourir à un algorithme pour choisir l’interface sur lequel envoyer
un paquet.
Les tables de routage sont des couples (adresse réseau, distance). Une dis-
tance peut se mesurer en :
– nombre de routeurs à traverser (hops), RFC 1058 (réseaux petits et moyens)
– temps en ms, RFC 823
– une note cf EGP, RFC 904 (liaisons internationales)
La table de routage permet de décider à quel routeur voisin envoyer un
paquet IP. L’échange de table de routage permet de faire connaı̂tre à l’en-
semble d’Internet la création d’un nouveau réseau, ou un nouveau chemin vers
un réseau.
L’algorithme de routage est dynamique. C’est à dire que si un lien tombe ou
sature, il peut choisir une autre route. Internet fonctionne d’autant mieux que
le réseau est maillé. Les algorithmes les plus utilisés sont :
– RIP (Routing Information Protocol), RFC 1058, pour réseaux petits ou
moyens. Distance en nombre de hops. Daemon /usr/sbin/routed (BSD)
fourni avec Linux
– EGP, daemon gated (Cornell), RFC 827, 888, 904, 975, 985
– BGP, daemon gated. Actuellement BGP4 est utilisé sur les routeurs In-
ternet aux frontières du backbone (prôné par Renater).
– IGRP, EIGRP
– OSPF (Open Shortest Path First Protocol) daemon gated pour grands
réseaux type campus.
– IGP utilisé sur le backbone Internet
(daemon, vieux terme Unix qui signifie : Disk And Extension MONitor).
Faut-il préciser qu’il est inutile de lancer routed comme le font certaines
distributions Linux quand on n’a qu’un seul interface réseau ?

2.5 TCP
TCP, Transmission Control Protocol, décrit par RFC 793, est un protocole
de transfert fiable : il s’occupe de transférer un message (ou un fichier, bref des
données) entre deux machines. Il utilise IP pour ce transport, il sait que IP
fait de son mieux mais que le réseau a des défaillances. TCP est “l’homme de
confiance”, il est utilisé par les principaux protocoles INTERNET (telnet, ftp,
smtp, http, X11,...).
TCP s’occupe de :
– découper le message en segments à l’émission et de les réassembler à la
réception en les remettant dans le bon ordre.
– donner ou recevoir les paquets de IP
– contrôler l’intégrité des données par un checksum calculé au départ et
contrôlé à l’arrivée
2.5. TCP 25

– redemander l’émission des paquets manquants ou erronés : TCP gère une


connexion : il garde trace des paquets reçus et transmis. On dit que TCP
travaille en mode connecté.
– gérer plusieurs connexions simultanées.

2.5.1 Ports TCP


TCP peut soutenir plusieurs conversations simultanées (mutiplexage). Pour
les repèrer, il attribue des numéros de port. Ainsi, quand une conversation
démarre il lui affecte le port 1000, si une autre démarre, elle aura le port 1001.
Un couple (adresse IP, numéro de port) est appelé un socket. A l’autre bout,
sur le serveur, un port est aussi attribué.
Pour que le client (qui initie la connexion) puisse fixer le port côté serveur,
on a fixé des numéros de ports officiels suivant le type de service demandé. Par
exemple pour le service ftp, utilisant tcp, le port est 21. On trouve ces numéros de
port réservés, appelés well known ports dans le fichier /etc/services. Extrait :

# /etc/services:
ftp-data 20/tcp
ftp 21/tcp
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp

smtp 25/tcp mail


time 37/tcp timserver
time 37/udp timserver
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
tftp 69/udp
www 80/tcp http # WorldWideWeb HTTP
pop-3 110/tcp # POP version 3
pop-3 110/udp
sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
auth 113/tcp authentication tap ident
ntp 123/tcp
ntp 123/udp # Network Time Protocol
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
afpovertcp 548/tcp # AFP over TCP
afpovertcp 548/udp # AFP over TCP
nfs 2049/tcp # networked file system
nfs 2049/udp # networked file system
fax 4557/tcp # FAX transm. service (old)
hylafax 4559/tcp # HylaFAX client-server (new)
X11 6000/tcp # X Window server (6000-6009)
X11/ssh 6010/tcp # X11 over ssh
xfs 7100/tcp # X Font Service
26CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| data |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

TCP Header Format

Un socket peut être utilisé plusieurs fois par exemple (IP dest, 21) si IP dest
sert plusieurs connexions ftp simultanées. Mais une paire de sockets (IP source,
port source, IP dest, port dest) identifie une connexion de manière unique.
Un serveur utilisant un port inférieur à 1024 doit avoir les privilèges de root.

2.5.2 En-tête TCP


TCP ajoute à chaque paquet un en-tête d’au moins 20 octets qui a le format
ci-dessus.
Sequence Number : TCP ne numérote pas les paquets mais les octets. Le
numéro de séquence est le numéro du premier octet de la partie data du paquet
(sauf si flag SYN). Ce numéro est donné relativement à un initial sequence
number (ISN) transmis lors de l’établissement de la connexion avec le flag SYN
présent. Ce numéro de séquence sert à la machine destinataire à acquiter les
paquets reçus et à les remettre en ordre.
Acknowledgment Number : pour être sûr que le paquet est bien arrivé, le
destinataire doit renvoyer un accusé de réception Acknowledgment. Dans ce
paquet le flag ACK est présent, si Acknowledgment Number vaut 1500 cela
signifie qu’il a reçu les données jusqu’à l’octet 1500 (exclus). Si l’expéditeur n’a
pas reçu un Acknowledgment pour un paquet au bout d’un certain temps , il le
renvoie.
Data Offset : position des data ou longueur du header en octet.
Control Bits : 6 bits (from left to right) :
– URG : Urgent Pointer field significant
– ACK : Acknowledgment field significant
2.5. TCP 27

– PSH : Push Function : paquet contenant des données pour le destinataire,


ne pas les garder dans le tampon.
– RST : Reset the connection
– SYN : Synchronize sequence numbers
– FIN : No more data from sender
Window : C’est un contrôle de flux.
L’expéditeur n’attend pas de recevoir l’ack d’un paquet pour envoyer le sui-
vant. D’autre part il est inutile qu’il envoie pleins de paquets si le destinataire
n’arrive pas à suivre. Par Window le destinataire indique le nombre d’octets que
l’expéditeur peut envoyer jusqu’à nouvel ordre. Quand le destinataire reçoit des
données il baisse Window. Si Window=0, l’expéditeur doit s’arrêter. Quand le
destinataire est disponible, il augmente Window.
Options
C’est un champ de taille variable contenant entre autre :
MSS : Maximum Segment Size. Envoyé quand SYN est présent. Le segment
désigne la partie données du paquet TCP.
Etablissement d’une connexion TCP
Pour établir une connexion, il suffit que le client fasse une demande et que
le serveur donne son accord, mais comme un paquet peut arriver en retard ou
être dupliqué, TCP procède en trois étapes c’est ce qu’on appelle le Basic 3-way
handshake for connection synchronisation
La machine A (193.54.230.3) fait ftp vers la machine B (193.54.230.20.21),
on analyse la connexion en faisant sur B :
tcpdump -n -S -t tcp and host 193.54.230.3

1 193.54.230.3.2998 > 193.54.230.20.21:


S 3559251011:3559251011(0)
win 32120 <mss 1460,sackOK,timestamp 191701351[|tcp]> (DF)
2 193.54.230.20.21 > 193.54.230.3.2998:
S 4146826796:4146826796(0) ack 3559251012
win 32736 <mss 1460>
3 193.54.230.3.2998 > 193.54.230.20.21:
. ack 4146826797 win 32120 (DF)

Basic 3-way handshake for connection synchronisation

– Paquet 1 : Connection request


– A sur le port 2998 appelle B sur le port 21.
– Le flag SYN est positionné (S).
– L’ISN, Initial Sequence Number est envoyé égal à 3559251011, format
first :last(nombre d’octets de data)
– A fixe la Window à 32120 octets
– < ... > indique les options
– le maximum segment size mss est à 1460 octets
– [|tcp] : signifie que le header est tronqué par tcpdump
– DF : Don’t Fragment
– Paquet 2 :
– B port 21 répond à A sur le port 2998
– SYN et ACK sont positionné
– B envoie son ISN 4146826796
28CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

– B dit à A : ton ISN est bien 3559251011 (ack 3559251012)


– B fixe sa Window à 32736 et sa maximum segment size à 1460 octets
– Paquet 3 :
– A port 2998 répond à B sur le port 21.
– pas de flag (.)
– il n’y a pas de données donc pas de sequence number,
– B dit à A : ton ISN est bien 4146826796 (ack 4146826797)

2.5.3 Etats d’une connexion TCP


Une connexion passe par différents états qui sont :
– LISTEN - le serveur attend un appel entrant
– SYN-SENT - une demande de connexion est arrivée ; attente d’un ACK
(état de A après envoi du paquet 1).
– SYN-RECEIVED - une demande de connexion est arrivée ; attente d’un
ACK (état de B après envoi du paquet 2).
– ESTABLISHED -état normal pour le transfert des données (état de A et
B après envoi du paquet 3).
– FIN-WAIT-1 - L’application a indiquée qu’elle avait terminé
– FIN-WAIT-2 - L’autre extrémité a accepté cette libération.
– CLOSE-WAIT - L’autres extrémité a initié une libération
– CLOSING - Les deux extrémités ont essayé de fermer simultanément.
– LAST-ACK - attente que tous les paquets aient disparus
– TIME-WAIT - attente que tous les paquets aient disparus
– CLOSED - aucune connexion
Ces états apparaissent quand on liste les connexions en cours par netstat
-ta

2.6 Encapsulation des protocoles


A chaque couche de la pile IP correspond une enveloppe de paquet qui est
ajoutée (ou retirée) à l’émission (ou à la réception). On peut schématiser cette
”encapsulation” ainsi

7 Application ---------------

4 TCP T--- T--- T--- T--- T---

3 IP IT--- IT--- IT--- IT--- IT---

2 Ethernet EIT---C EIT---C EIT---C EIT---C EIT---C

– L’application donne à TCP des data, disons un fichier.


– TCP découpe ce fichier en segments, ajoute à chacun un en-tête T et le
passe à IP.
– IP ajoute un en-tête I à chaque paquet et le passe à la couche Protocole
de réseau local.
– Si cette couche est Ethernet, un en-tête E est ajouté et un checksum C est
calculé et rajouté à la fin.
2.7. UDP 29

2.7 UDP
UDP, User Datagram Protocol, décrit par RFC 768, sert à envoyer des mes-
sages qui tiennent dans un paquet IP. Il ajoute un en-tête. Il n’a pas à gérer
de numéros de séquence. Il gère un checksum. Il ne garde pas trace de ce qu’il
a envoyé. Donc si des paquets se perdent, c’est à l’application au-dessus de le
contrôler. Il se sert de ports comme TCP pour distinguer plusieurs conversa-
tions simultanées. UDP est utilisé notamment pour interroger les Domain Name
Servers.

2.8 ICMP
Internet Control Message Protocol sert à transmettre des messages de service
(RFC 792). Les messages ICMP tiennent dans un paquet IP.
La commande ipchains -h icmp donne la liste des types de message ICMP,
extrait :

echo-request (ping)
echo-reply (pong)
host-unreachable
network-unreachable
host-unknown
network-unknown
network-redirect (indication d’un routeur à un autre signalant une meilleure route)

Exemple :

zoroastre:/u1/morel# tcpdump ip proto \\icmp


tcpdump: listening on eth0
10:05:05.158390 24.40.2.51 > zoroastre.c-strasbourg.fr:
icmp: 24.40.2.51 udp port domain unreachable
10:05:36.400747 zoroastre.c-strasbourg.fr > antares.c-strasbourg.fr:
icmp: zoroastre.c-strasbourg.fr udp port 1327 unreachable [tos 0xc0]
17:40:21.192375 zoroastre.c-strasbourg.fr > yelen.c-strasbourg.fr:
icmp: echo request
17:40:21.192375 yelen.c-strasbourg.fr > zoroastre.c-strasbourg.fr:
icmp: echo reply

2.9 ARP
Address Resolution Protocol RFC 826 sur un réseau local Ethernet permet
de trouver l’adresse Ethernet (dite adresse MAC) d’une machine connaissant son
adresse IP. Pour que IP puisse communiquer par Ethernet il faut qu’il connaisse
l’adresse Ethernet du destinataire. ARP n’est pas un protocole IP, il n’utilise
pas de paquet IP.
Si la machine 130.79.186.1 veut causer à la machine 130.79.186.2, IP vérifie
avec le netmask qu’elle sont bien sur le même réseau. Ensuite ARP regarde dans
son cache s’il a 130.79.186.2.
Sur Linux le cache est visible par les commandes cat /proc/net/arp ou
arp -a
30CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Si oui, il y trouve l’adresse Ethernet. Sinon, ARP lance un ”ARP request”


à toutes les machines comportant la question ”Qui a l’adresse IP 130.79.186.2”.
Celle qui a l’adresse IP spécifiée répond.
L’ARP request est un message broadcast. Son adresse Ethernet destinataire
a tous les bits à 1 : ff :ff :ff :ff :ff :ff. Les machines sont obligées de prendre en
compte ces paquets Ethernet. Si une machine est concernée elle répond, sinon
elle l’ignore. Certaines machines du réseau utilisent les ARP request pour établir
des tables des autres machines : c’est le cas d’un switch qui doit savoir quelles
adresses Ethernet sont derrière chacun de ses ports.
Exemple d’un dialogue arp écouté par tcpdump :
#tcpdump -e arp
tcpdump: listening on eth0
18:36:51.514176 0:48:54:6a:59:96 Broadcast arp 60:
arp who-has zoroastre.c-strasbourg.fr tell carbone.c-strasbourg.fr
18:36:51.514176 0:50:4:f9:33:82 0:48:54:6a:59:96 arp 42:
arp reply zoroastre.c-strasbourg.fr is-at 0:50:4:f9:33:82

2.10 Noms de machines


Les adresses IP ne sont pas commodes à retenir. On leur préfère des noms
en clair. Les noms de machines sont structurés en une hiérarchie de domaines :
domaine1.domaine2...top level domain
Exemple : zoroastre.c-strasbourg.fr
– zoroastre est le hostname (commande Linux hostname)
– c-strasbourg.fr est le domainname (commande Linux hostname -d)
– zoroastre.c-strasbourg.fr est le fully qualified domain name (FQDN).
Je dis indifférement nom de domaine ou nom de machine.
L’espace des noms a une structure hiérarchique :
Le nom de domaine zoroastre.c-strasbourg.fr fait partie du domaine
c-strasbourg.fr qui lui-même fait partie du domaine fr. Ce dernier est appelé
top level domain (TLD). En voici quelques uns :
– aux USA : edu, mil, gov, com
– com a été étendu à l’international
– agences internationales : net, org
– noms de pays ISO-3166 :fr, de, uk, it, ru, cn, au
L’autorité de nommage est le NIC : Network Information Center . En France
(top level domain fr) c’est le NIC-France
http://www.nic.fr
Pour le domaine c-strasbourg.fr, c’est l’administrateur du Domain Name
System c-strasbourg.fr.
L’indication de pays dans le top level domain ne signifie pas que l’ordinateur
en question s’y trouve physiquement localisé.

2.10.1 Domain Name System


Le DNS fait la correspondance entre nom de domaine et adresse IP. Au début
ce n’était qu’une table mise à jour manuellement cf /etc/hosts.
– C’est une base de données répartie : des serveurs named communiquant
par le protocole domain (sur UDP well known port 53)
2.11. DÉMARRAGE DU RÉSEAU 31

– Les serveurs root ont l’information sur les top level domain
– Chaque domaine doit disposer d’un DNS qui fait autorité
– Chaque machine doit avoir accès à au moins un DNS
– Optimisation : un DNS mémorise les informations dans un cache (durant
un temps TTL)
– Sécurité : des DNS secondaires copies de DNS primaires
Exemple d’interrogation
– adresse IP de www.cern.ch ?
– requête à un DNS indiqué dans la ligne nameserver de /etc/resolv.conf
– mon DNS n’a pas www.cern.ch dans son cache
– il demande à un des DNS root l’adresse du DNS ch
– il interroge le DNS ch
– le DNS de ch n’a pas www.cern.ch dans son cache
– le DNS de ch interroge le DNS de cern.ch
– le DNS de cern.ch renvoie l’adresse IP de www.cern.ch à mon DNS qui
la garde dans son cache
– mon DNS me renvoie l’adresse IP de www.cern.ch
Types d’informations contenues dans les DNS :
– A : associe une adresse IP à un nom de domaine. C’est l’objet essentiel du
DNS
– PTR : permet la requête inverse : à une adresse IP associe un nom de
domaine
– CNAME : associe un alias avec son nom canonique : exemple : www-phase.c-strasbourg.fr
alias de zoroastre.c-strasbourg.fr
– MX : Mail eXchanger indique avec une note de préférence à quel nom de
domaine envoyer le courrier por ce nom de domaine. Exemple : math.u-strasbg.fr
pointe sur amon.u-strasbg.fr avec la préférence 10
Les MX records permettent de :
– centraliser la messagerie dans un organisme sur une machine sécurisée
– de communiquer avec des machines non connectées à Internet ( uucp,
...)
– NS pointe sur un master DNS, le serveur de nom de référence pour la zone
– SOA : (Start of authority) en-tête d’une zone d’autorité

2.11 Démarrage du réseau


2.11.1 Configuration du noyau
Généralement, le noyau est configuré avec le support de IP Networking et
d’un interface réseau ou de plusieurs s’ils sont en modules.
CONFIG_INET=y
CONFIG_NET_ETHERNET=y
CONFIG_VORTEX=y (par exemple pour la carte 3COM 3C905B)
Un test du support réseau par le noyau est fait par ls /proc/net ou bien
on regarde ce que le noyau affiche au boot :
NET4: Unix domain sockets 1.0 for Linux NET4.0.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
32CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

TCP: Hash tables configured (ehash 16384 bhash 16384)

2.11.2 Identification d’une machine


Pour connecter une machine à un réseau, on a besoin de :
– Adresse IP de la machine
– Masque de réseau
– Adresse de broadcast
– Adresse du routeur
– Adresse du serveur de noms de domaine (DNS).

2.11.3 Initialisation de l’interface réseau


On initialise l’interface réseau par ifconfig et on déclare les routes par
route
En Debian, ceci était fait dans le shell script /etc/init.d/network. Ce
fichier comporte les commandes ifconfig et route. En Debian 2.2, il est
recommandé de lancer le réseau par ifup de l’arrêter par ifdown, ceci est fait
par le shell script /etc/init.d/networking.
Le lancement se fera par :
/etc/init.d/networking start
et l’arrêt par :
/etc/init.d/networking stop
Au lancement ce script exécute au préalable des actions spoofprotect, syncoo-
kies, ip forward, en fonction d’options que l’on peut modifier dans /etc/network/options.
$cat /etc/network/options
ip_forward=no
spoofprotect=yes
syncookies=no
On verra plus tard leur signification.
Ensuite il initialise le ou les interfaces réseaux par ifup -a . Ces interfaces
sont définis dans /etc/network/interfaces. Exemple :
# The loopback interface
iface lo inet loopback

# The first network card -


# (network, broadcast and gateway are optional)
iface eth0 inet static
address 193.54.230.109
netmask 255.255.255.0
network 193.54.230.0
broadcast 193.54.230.255
gateway 193.54.230.1
Avec ces informations, la commande ifup -a exécute pour chaque interface
une commande ifconfig et une commande route. Remarques :
2.11. DÉMARRAGE DU RÉSEAU 33

– si on ajoute noauto sur la ligne iface, l’interface n’est pas initialisé par
ifup -a ni arrêté par ifdown -a. On peut le commander manuellement
par ifup eth0, ifdown eth0, si l’interface est eth0.
– autres informations par man 5 interfaces
– les lignes commençant par # sont ignorées.
– up commande exécute commande après l’initialisation de l’interface. pre-up
commande exécute commande avant l’initialisation.
– idem avec down etpre-down pour l’arrêt de l’interface.
Nous considérons que l’interface réseau est l’interface Ethernet eth0, mais
ce peut être un deuxième interface Ethernet eth1 ou un interface vers un autre
protocole réseau. On verra par la suite comment initialiser ppp0 pour PPP,
plip0 pour PLIP.

2.11.4 La commande ifconfig


Pour activer l’interface réseau eth0, on fait par exemple sous root :

root# ifconfig eth0 193.54.230.20 netmask 255.255.255.0 up

Dans ce cas je configure l’interface Ethernet ‘eth0’ avec l’adresse IP ‘193.54.230.20’


et un masque de réseau ‘255.255.255.0’. Le ‘up’ est inutile car c’est le défaut.
On aurait pu préciser une adresse de broadcast par :

root# ifconfig eth0 193.54.230.20 netmask 255.255.255.0 broadcast 193.54.230.255

Mais le noyau est capable de le deviner à partir de l’adresse IP qui est de


classe C. De même il aurait pu deviner le netmask sauf si je fais du subnetting.
A tout instant on obtient des informations sur l’interface en faisant ifconfig
eth0

$ ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:50:04:F9:33:82
inet addr:193.54.230.20 Bcast:193.54.230.255 Mask:255.255.255.0
EtherTalk Phase 2 addr:65280/102
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:65692192 errors:0 dropped:0 overruns:0 frame:0
TX packets:99634932 errors:0 dropped:0 overruns:0 carrier:0
Collisions:1893719
Interrupt:12 Base address:0xe000

Autres statistiques affichées dans ifconfig :


– RX Nombre de paquets Ethernet reçus
– TX Nombre de paquets Ethernet transmis
– errors : erreur sur le checksum Ethernet ?
– dropped : paquets perdus probablement pour manque de mémoire
– overruns : entre autre les paquets arrivent trop vite, le noyau n’a pas le
temps de les traiter.
– frame ?
– carrier : différents incidents parmi lesquels Out-of-window (”cable to
long” or ”someone is running full-duplex”)
Autres options de ifconfig :
– pointopoint addr : pour une liaison point à point comme avec plip
34CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

– mtu : Maximum Transmission Unit : taille max d’un paquet que l’interface
est en mesure de traiter en une transaction. Pour Ethernet c’est 1500. Pour
PPP peut être plus faible.
– metric : associé à l’entrée dans la table de routage correspondant à cet
interface, exprime le coût d’une route (= nombre de routeurs à traverser)
pour certains protocoles de routage (RIP). Laissez le défaut.
– promisc : met l’interface réseau en mode promiscuous (permet de recevoir
tous les paquets Ethernet qui passent sur le réseau. ( -promisc remet en
mode normal)
– allmulti : pour multicast
Dans le cas de PPP (IP sur ligne téléphonique), l’interface réseau se lance
par pppd, on n’a pas à faire ifconfig.
Pour désactiver l’interface, on fait :
ifconfig eth0 down
On notera que, contrairement aux autres périphériques, eth0 n’est pas un
nom de fichier comme /dev/lp0 et on ne peut faire cat fichier>eth0
Exercice : Comment connaı̂tre l’adresse IP d’une machine ? En l’extrayant
de la sortie de la commande ifconfig comme suit :

/sbin/ifconfig eth0 | grep ’inet addr’ | awk ’{print $2}’ | sed -e ’s/.*://’

2.11.5 La commande route


Sur Linux vous pouvez afficher la table de routage par l’une des commandes
suivantes :

user% cat /proc/net/route


user% /sbin/route -n
user% /sbin/route
user% /sbin/netstat -r
user% /sbin/netstat -rn

Exemple :
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
193.54.230.0 0.0.0.0 255.255.255.0 U 0 0 78581 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 2779 lo
0.0.0.0 193.54.230.1 0.0.0.0 UG 1 0 418155 eth0

$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
localnet * 255.255.255.0 U 0 0 78581 eth0
127.0.0.0 * 255.0.0.0 U 0 0 2779 lo
default routeur 0.0.0.0 UG 1 0 418154 eth0
Etant donné un paquet d’adresse destination adr-dest à router, le noyau pour
chaque ligne de la table de routage fait :
2.11. DÉMARRAGE DU RÉSEAU 35

Si adr-dest AND Genmask == Destination


alors envoi du paquet à Gateway
Sinon ligne suivante

– Colonne Destination : adresse de réseau. Si elle est tout à zéro, c’est la


route par défaut.
– Colonne Gateway : si valeur * ou 0.0.0.0, il n’y a pas de routage à faire,
c’est local.
– Flags :
– U interface Up
– G cette route utilise un Gateway
– H une seul Host accessible par cette route, liaison point à point
– D si entrée créée par un message ICMP redirect
– M si entrée créée par un message ICMP redirect
– Colonne Ref : nombre de routes derrière cet interface
– Use : nombre d’utilisation de cette entrée de la table de routage
– Iface : interface à utiliser
Pour modifier la table de routage de manière statique, on utilise la commande
route.
– Ajout d’une route vers une machine :
route add -host 127.0.0.1 lo
– Ajout d’une route vers un réseau :
route add -net 193.54.230.0
L’interface n’est pas indiqué ici. Le noyau compare pour chaque interface
configuré son adresse ANDed avec son netmask avec cette adresse réseau.
Le seul interface qui convient est eth0.
– Ajout d’une route par défaut :
route add default gw 193.54.230.1 metric 1
– Retrait d’une route par défaut :
route del default
Autres paramètres : netmask : il faut le préciser quand on fait du subnetting.
On peut spécifier les paramètres mss window irtt voir man route.

2.11.6 Configuration de l’interface loopback


L’interface ‘loopback’ permet de vous connecter à la machine locale. Il y
a plusieurs raisons pour faire cela, par exemple si vous voulez faire des essais
de logiciel réseau sans interférer avec quelqu’un d’autre sur votre réseau. Par
convention, l’adresse IP ‘127.0.0.1’ lui a été assignée. Aussi quelle que soit la
machine où vous êtes, si vous ouvrez une connexion telnet vers 127.0.0.1 vous
atteindrez toujours la machine locale.
On le configure par :

root# ifconfig lo 127.0.0.1


root# route add -host 127.0.0.1 lo

On l’utilise par exemple ainsi :

$ ping localhost -c 2
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=1.5 ms
36CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=1.4 ms

--- localhost ping statistics ---


2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.4/1.4/1.5 ms

2.12 Configuration d’un routeur


Supposons qu’une machine Linux a 3 interfaces Ethernet accèdant à des
réseaux privés et un lien PPP vers l’Internet. La configuration de routage sera :

root# echo "1" > /proc/sys/net/ipv4/ip_forward


root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 eth1
root# route add -net 192.168.3.0 netmask 255.255.255.0 eth2
root# route add default ppp0

Pourquoi la route par défaut n’utilise pas ‘gw’ ? La raison en est très simple :
le protocole PPP est point à point il n’y a qu’une machine à chaque bout.
Spécifier que l’autre bout de la liaison est un routeur est sans objet et redondant.
Incidents
Si vous avez des diagnostics d’erreurs SIOCADDRT, ils peuvent être évités
en ajoutant un netmask et le nom de l’interface à la commande "route add
-net". Exemple :

route add -net 127.0.0.0

devient :

route add -net 127.0.0.0 netmask 255.0.0.0 lo

2.13 Résolution de noms de domaines


2.13.1 Configuration
Le Name Resolver est accédé en langage C par gethostbyname(2) et gethost-
byaddr(2). Il y a deux moyens pour traduire une adresse IP en nom de domaine :
le fichier /etc/hosts et l’accès à un DNS. L’accès au DNS se configure dans le
fichier /etc/resolv.conf

$ cat /etc/resolv.conf
nameserver 127.0.0.1
search c-strasbourg.fr
nameserver 193.54.211.65
nameserver 193.48.86.103

Les lignes nameserver indiquent les adresses IP de DNS à interroger dans


l’ordre où ils sont cités. La ligne search sert à compléter les hostnames en
FQDN. Si on veut résoudre le nom truc le résolveur essaiera truc.c-strasbourg.fr
et si échec truc.fr.
La configuration du résolveur de noms se fait dans /etc/host.conf
2.13. RÉSOLUTION DE NOMS DE DOMAINES 37

$ cat /etc/host.conf
order hosts,bind
multi on

– order : précise dans quel ordre on consultera : ici en premier /etc/hosts


(hosts) et en second un DNS (bind).
– multi on : est là pour le cas où dans /etc/hosts une machine a plusieurs
adresses IP.
– nospoof on : une interrogation directe puis inverse du DNS est faite. Si
elles ne collent pas, une erreur est retournée : address spoofing.
– alert si une tentative de spoof (maquillage d’adresse) est faite un message
est loggé.
La possibilité d’avoir un service NIS (Network Information Service ou Yellow
Page de Sun) est prévue dans la libc6. Il faut donc aussi configurer le fichier
/etc/nsswitch.conf.

$ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# Information about this file is available in the ‘libc6-doc’ package.

passwd: compat
group: compat
shadow: compat

hosts: files dns


networks: files

protocols: db files
services: db files
ethers: db files
rpc: db files

netgroup: db files

N’ayant pas activé le service NIS une ligne nous intéresse :


– hosts : donne l’ordre de consultation files fichier /etc/hosts consulté
en premier, ensuite dns le DNS.

2.13.2 Résolution de noms de domaine


nslookup

$ nslookup www.lwn.net
Server: localhost
Address: 127.0.0.1

Name: lwn.net
Address: 206.168.112.90
38CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Aliases: www.lwn.net

$ nslookup 206.168.112.90
Server: localhost
Address: 127.0.0.1

Name: nr.lwn.net
Address: 206.168.112.90

Peut être interrogé interactivement. Tapez nslookup tapez help fin par
Ctrl-D
$ nslookup
Default Server: localhost
Address: 127.0.0.1

> set qt=SOA


> c-strasbourg.fr
Server: localhost
Address: 127.0.0.1

c-strasbourg.fr
origin = antares.c-strasbourg.fr
mail addr = administrator.c-strasbourg.fr
serial = 1998091712
refresh = 43200 (12H)
retry = 600 (10M)
expire = 2592000 (4w2d)
minimum ttl = 604800 (1W)
c-strasbourg.fr nameserver = antares.c-strasbourg.fr
c-strasbourg.fr nameserver = sbgsu3.in2p3.fr
c-strasbourg.fr nameserver = zoroastre.c-strasbourg.fr
antares.c-strasbourg.fr internet address = 193.54.211.65
sbgsu3.in2p3.fr internet address = 193.48.86.103
zoroastre.c-strasbourg.fr internet address = 193.54.230.20
Interrogation par la racine de l’arborescence

$ nslookup
Default Server: localhost
Address: 127.0.0.1
. <---------- signifie la racine de l’arborescence
Server: localhost
Address: 127.0.0.1

(root)
origin = A.ROOT-SERVERS.NET <----- en t^
ete de mon fichier named.ca
mail addr = hostmaster.internic.NET
serial = 2000061302
refresh = 1800 (30M)
retry = 900 (15M)
2.13. RÉSOLUTION DE NOMS DE DOMAINES 39

expire = 604800 (1W)


minimum ttl = 86400 (1D)
server A.ROOT-SERVERS.NET <-------------- j’interroge directement ce serveur
ftp.lip6.fr
Server: A.ROOT-SERVERS.NET
Address: 198.41.0.4

Authoritative answers can be found from: <---- le coquin refuse de me répondre


FR nameserver = DNS.CS.WISC.EDU
FR nameserver = NS1.NIC.FR \
FR nameserver = NS3.NIC.FR | serveurs du NIC FR
FR nameserver = DNS.INRIA.FR |
FR nameserver = NS2.NIC.FR /
FR nameserver = NS.EU.NET
FR nameserver = DNS.PRINCETON.EDU
FR nameserver = NS-EXT.VIX.COM
DNS.CS.WISC.EDU internet address = 128.105.2.10
NS1.NIC.FR internet address = 192.93.0.1
NS3.NIC.FR internet address = 192.134.0.49
DNS.INRIA.FR internet address = 193.51.208.13
NS2.NIC.FR internet address = 192.93.0.4
NS.EU.NET internet address = 192.16.202.11
DNS.PRINCETON.EDU internet address = 128.112.129.15
NS-EXT.VIX.COM internet address = 204.152.184.64
> server DNS.CS.WISC.EDU <------- qu’à cela ne tienne choisissons celui-ci
Default Server: DNS.CS.WISC.EDU
Address: 128.105.2.10

> ftp.lip6.fr
Server: DNS.CS.WISC.EDU
Address: 128.105.2.10

Non-authoritative answer:
Name: nephtys.lip6.fr
Address: 195.83.118.1
Aliases: ftp.lip6.fr
> zoroastre.c-strasbourg.fr <------ je suis m^
eme connu aux US !!!
Server: DNS.CS.WISC.EDU
Address: 128.105.2.10

Name: zoroastre.c-strasbourg.fr
Address: 193.54.230.20

host interroge le DNS


Syntaxe :
host [options] nom_de_domaine serveur
Options :
– -v : liste records DNS
– -t : query type : A,ANY,CNAME,HINFO,MX,PX,NS,PTR,SOA,TXT,WKS,SRV,NAPTR
40CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

– -l : zone : liste tous les noms de la zone


Exemples :

$ host tux.u-strasbg.fr
tux.u-strasbg.fr A 130.79.34.100
$ host -t mx tux.u-strasbg.fr
tux.u-strasbg.fr MX 30 tux.u-strasbg.fr
tux.u-strasbg.fr MX 10 amon.u-strasbg.fr
tux.u-strasbg.fr MX 20 isis.u-strasbg.fr
$ host 130.79.34.100
Name: tux.u-strasbg.fr
Address: 130.79.34.100
Aliases: tux

Si on veut compter le nombre de machines d’un domaine :

host -l c-strasbourg.fr|wc|awk ’{print $1}’

Interrogation inverse :

host -v -t ptr 20.230.54.193.in-addr.arpa


équivalent à:
host -v 193.54.230.20

dig interroge le domain name server


Syntaxe : dig [options] @server domain query-type query-class
Options : -x : interrogation inverse -p : port, défaut : 53 Il existe d’autres
options. Exemples :

dig phoebus.c-strasbourg.f
dig @sbgsu3.in2p3.fr c-strasbourg.fr soa
dig -x 193.54.230.3 interrogation inverse

dnsquery interroge le domain name server


Affiche les informations sous forme brute des RR.

$ dnsquery antares
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47285
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; antares.c-strasbourg.fr, type = ANY, class = IN
antares.c-strasbourg.fr. 1W IN A 193.54.211.65
c-strasbourg.fr. 1W IN NS antares.c-strasbourg.fr.
c-strasbourg.fr. 1W IN NS sbgsu3.in2p3.fr.
c-strasbourg.fr. 1W IN NS zoroastre.c-strasbourg.fr.
antares.c-strasbourg.fr. 1W IN A 193.54.211.65
sbgsu3.in2p3.fr. 13m15s IN A 193.48.86.103
zoroastre.c-strasbourg.fr. 1W IN A 193.54.230.20

2.13.3 Résolution inverse de noms de domaine


Elle consiste à demander quel est le nom de domaine associé à une adresse
IP que l’on fournit. On a vu que les commandes
2.14. OUTILS DE DIAGNOSTIC 41

nslookup 206.168.112.90
host 206.168.112.90
fournissait la réponse. Mais de manière interne une transformation a été
faite. Il est bon pour un administrateur de la connaı̂tre :
Pour éviter de faire une recherche dans la base de données qui est d’accès
séquentiel et réparti !, on a créé un domains spécial in-addr.arpa qui contient
les adresse IP en ”reversed dotted quad notation”. Ainsi 206.168.112.90 de-
vient 90.112.168.206.in-addr.arpa. Les ressources records (RR) contenant
cette information sont de type PTR On interroge ainsi :

[morel]$ nslookup
Default Server: localhost
Address: 127.0.0.1

> set qt=PTR


> 90.112.168.206.in-addr.arpa
Server: localhost
Address: 127.0.0.1

Non-authoritative answer:
90.112.168.206.in-addr.arpa name = nr.lwn.net

Authoritative answers can be found from:


112.168.206.in-addr.arpa nameserver = ns.netrack.net
112.168.206.in-addr.arpa nameserver = ns.coop.net
>
qt signifie Query Type. On a le choix entre A, ANY, CNAME, HINFO, MX,
PX, NS, PTR, SOA, TXT, WKS, SRV, NAPTR
On sort de nslookup par Ctrl-D.

2.14 Outils de diagnostic


2.14.1 ping
Teste la connectivité, mesure le temps écoulé, compte le nombre de paquets
perdus. Envoi de n=5 paquets :
ping -c 5 www.lwn.net
Variante fping package Debian netstd. S’utilise à travers un script.

2.14.2 traceroute
Tente de tracer la route suivie pour parvenir au site destinataire en lançant
des petits paquets UDP, d’abord avec un ‘time to live’ TTL=1, le paquet ne
peut traverser qu’un routeur puis TTL=2, puis TTL=3, etc. A chaque essai
traceroute se met à l’écoute du message ICMP ”time exceeded”. Donc indique
tous les routeurs depuis votre machine jusqu’à la machine cible. Permet d’iden-
tifier où le réseau est coupé. Par défaut fait 3 essais pour chaque valeur de ttl.
42CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Indique le temps mis en msec. Si au bout de 5 secondes il n’y a pas de réponse


affiche ’*’. Exemple :

$ traceroute ftp.lip6.fr
traceroute to nephtys.lip6.fr (195.83.118.1), 30 hops max, 38 byte packets
1 routeur (193.54.230.1) 1.119 ms 1.300 ms 1.074 ms
2 strasbourg.cssi.renater.fr (194.214.110.233) 3.098 ms 1.066 ms 0.955 ms
3 nio-n1.cssi.renater.fr (194.214.110.137) 7.372 ms 7.006 ms 7.256 ms
4 jussieu.cssi.renater.fr (194.214.109.6) 7.428 ms 7.341 ms 7.455 ms
5 rap-jussieu.cssi.renater.fr (193.51.12.78) 7.733 ms 7.431 ms 7.542 ms
6 jussieu.rap.prd.fr (195.221.126.33) 8.444 ms 8.707 ms 8.714 ms
7 nephtys.lip6.fr (195.83.118.1) 8.116 ms 9.304 ms 8.809 ms

Autre réponse possible :


– !H, !N, ou !P (host, network ou protocol unreachable)
– !A, !C (access to the network or host, respectively, is prohibited)
Le développement des firewall peut faire que les messages ICMP sont filtrés.
Dans ce cas on peut utiliser tcptraceroute qui envoie des paquets TCP SYN
Variante mtr : combine traceroute et ping

mtr --curses www.debian.org

2.14.3 netstat
netstat permet de faire des statistiques, afficher la table de routage et affi-
cher les connexions en cours (les sockets ouverts).
netstat -i donne les statistiques sur les interfaces comme ifconfig ou cat
/proc/net/dev

$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags
lo 3584 0 30285178 0 0 0 30285178 0 0 0 BLRU
eth0 1500 0 66988299 0 0 0 103800699 0 0 0 BRU
eth0: 1500 0 0 0 0 0 0 0 0 0 BRU
eth0: 1500 0 1 0 0 0 0 0 0 0 BRU
eth0: 1500 0 2 0 0 0 0 0 0 0 BRU

netstat -s denne des statistiques plus détaillées au niveau IP, ICMP, TCP,
UDP.
netstat -r donne la table de routage, -n évite la traduction en noms de
domaines

netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
193.54.230.37 0.0.0.0 255.255.255.255 UH 1500 0 0 eth0:0
193.54.230.50 0.0.0.0 255.255.255.255 UH 1500 0 0 eth0:1
193.54.230.104 0.0.0.0 255.255.255.255 UH 1500 0 0 eth0:2
193.54.230.0 0.0.0.0 255.255.255.0 U 1500 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 3584 0 0 lo
0.0.0.0 193.54.230.1 0.0.0.0 UG 1500 0 0 eth0
2.14. OUTILS DE DIAGNOSTIC 43

irtt : initial round trip time pour les connexions TCP : sert à fixer un
timeout au bout duquel un paquet est renvoyé si l’acquitement n’a pas été reçu.
Défaut 300ms (man route
netstat -a affiche les connexions en cours. On peut être plus sélectif avec
les options :
– -t : connexions TCP
– -u : connexions UDP
– -w : raw connexions
– -a : y compris les connexions en attente (LISTEN)
– -x : socket Unix
– -n : ne convertit pas les adresses IP en noms de domaines
– -p : affiche le PID et le nom du processus ayant ouvert ce socket . Aide à
identifier la connexion. Il faut être root.
– -l : affiche uniquement les connexions en attente (listening)

Active Internet connections (including servers)


Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 1 0 zoroastre.c-stras:pop-3 cassiopee.c-strasb:3317 TIME_WAIT
tcp 0 0 zoroastre.c-stra:telnet cedre.c-strasbourg:1035 ESTABLISHED
tcp 0 0 zoroastre.c:netbios-ssn pandore.c-strasbou:1025 ESTABLISHE
tcp 0 0 *:snpp *:* LISTEN
tcp 0 0 *:fax *:* LISTEN
tcp 0 0 *:hylafax *:* LISTEN
tcp 0 0 zoroastre.c-strasb:1023 auger.c-strasbourg.:ssh ESTABLISHED
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:6010 *:* LISTEN
tcp 0 0 zoroastre.c-:afpovertcp direction.c-strasb:2049 ESTABLISHED
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 *:auth *:* LISTEN
tcp 10 0 localhost:auth localhost:23188 CLOSE_WAIT
tcp 0 0 *:printer *:* LISTEN
tcp 0 0 *:6000 *:* LISTEN
tcp 0 0 *:6010 *:* LISTEN
tcp 0 32120 www-emrs.c-strasbou:www dyson.hlphys.uni-l:1036 CLOSE
tcp 370 0 zoroastre.c-strasbo:www 35-041.al.cgocable:1182 CLOSE
tcp 0 0 *:10298 *:* LISTEN
tcp 0 0 zoroastre.c-strasbo:979 ppp-171-1.villette:2860 ESTABLISHED
tcp 0 0 zoroastre.c-strasb:auth ppp-171-1.villette:1994 ESTABLISHED
tcp 0 0 zoroastre.c-stra:sunrpc ppp-171-1.villette:1992 ESTABLISHED
tcp 0 0 zoroastre.c-stra:domain ppp-171-1.villette:1934 ESTABLISHED
tcp 0 0 zoroastre.c-strasb:auth ppp-171-1.villette:1605 ESTABLISHED
tcp 0 0 zoroastre.c-stra:sunrpc ppp-171-1.villette:1603 ESTABLISHED
tcp 0 0 zoroastre.c-stra:domain ppp-171-1.villette:1545 ESTABLISHED
tcp 349 0 www-emrs.c-strasbou:www dyson.hlphys.uni-l:2575 CLOSE
tcp 0 0 *:ssh *:* LISTEN
tcp 0 0 *:www *:* LISTEN
tcp 0 0 *:afpovertcp *:* LISTEN
tcp 0 0 *:979 *:* LISTEN
tcp 0 0 *:2049 *:* LISTEN
tcp 0 0 *:7100 *:* LISTEN
44CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

tcp 0 0 www-sfp2001.c-st:domain *:* LISTEN


tcp 0 0 www-sdre.c-stras:domain *:* LISTEN
tcp 0 0 www-emrs.c-stras:domain *:* LISTEN
tcp 0 0 zoroastre.c-stra:domain *:* LISTEN
tcp 0 0 localhost:domain *:* LISTEN
tcp 0 0 *:imap2 *:* LISTEN
tcp 0 0 *:pop-3 *:* LISTEN
tcp 0 0 *:exec *:* LISTEN
tcp 0 0 *:login *:* LISTEN
tcp 0 0 *:shell *:* LISTEN
tcp 0 0 *:ftp *:* LISTEN
tcp 0 0 *:telnet *:* LISTEN
tcp 0 0 *:time *:* LISTEN
tcp 0 0 *:daytime *:* LISTEN
tcp 0 0 *:sunrpc *:* LISTEN

Remarque :
– des traces probables de scan de port sont visibles dans cette liste
– les connexions par nfs ne sont pas visible par netstat
– snpp, fax, hylafax sont des ports servis par le serveur Hylafax
– afpoverpc serveur AFP de fichier Netatalk pour les Mac
– netbios... serveur Samba

2.14.4 telnet
Pour se connecter en mode interactif sur une machine multi-utilisateur comme
Unix.

telnet tux.u-strasbg.fr

Permet aussi de tester si un serveur tcp fonctionne en fixant le port. Exemple :


Test d’un serveur POP

telnet zoroastre.c-strasbourg.fr 110


Trying 193.54.230.20...
Connected to zoroastre.c-strasbourg.fr.
Escape character is ’]’.
+OK POP3 zoroastre.c-strasbourg.fr v4.47 server ready
user morel
+OK User name accepted, password please
pass xxxxx
+OK Mailbox open, 457 messages
stat
+OK 457 3209602
list 1
+OK 1 2032
quit
+OK Sayonara
Connection closed by foreign host
2.14. OUTILS DE DIAGNOSTIC 45

2.14.5 nc
C’est un outil élémentaire pour faire un dialogue TCP ou UDP avec une
autre machine. C’est le « couteau suisse » de TCP-IP.
Exemple :
$ nc zoroastre 25
220 zoroastre.c-strasbourg.fr ESMTP Sendmail 8.9.3/8.9.3; Fri, 23 Mar 2001 17:41:49 +0100
quit
221 zoroastre.c-strasbourg.fr closing connection

2.14.6 tcpdump
tcpdump nécessite la configuration de Packet Socket dans le noyau. Il im-
prime les en-têtes des paquets passant sur un interface réseau et satisfaisant
une expression logique. Il s’emploie sous root car l’interface doit être mis en
mode promiscuous. Si le réseau dispose de switch on ne peut écouter que les
paquets qui circulent sur le segment raccordé au port du switch le plus proche,
hormis les messages broadcast comme les arp requests.
Documentation : man tcpdump
Options :
– -i eth1 : écoute sur l’interface eth1
– -n : ne convertit pas les adresses IP en noms de domaines
– -N : imprime le nom de machine sans le domaine
– -s 200 : prend 200 octets de données dans chaque paquet. Défaut : 68.
– -t : pas de timestamp
– -c 10 : n’analyse que 10 paquets. Si pas d’option -c tcpdump ne se
termine que si on tape Ctrl-C.
– -e : affiche le link level header c’est à dire l’en-tête Ethernet
– -S : imprime les TCP Sequence Number sous forme absolue plutôt que
relative (par défaut, les Initial Sequence Number (ISN) sont en absolus
mais à la suite les Sequence Number sont donnés relativement aux ISN)
– -v : sortie bavarde (ajout de ttl, id)
– -vv : sortie encore plus bavarde
– -x : sortie en hexadécimal
– -w fichier : copie les paquets à l’état brut dans fichier
– -r fichier : lit les paquets copiés dans fichier par -w
Expression :
En l’absence d’une expression, tous les paquets sont affichés. Sinon, seuls
les paquets pour lesquels l’expression est vraie sont affichés. Une expression est
faite de primitives. Une primitive est faite d’un identifieur (nombre ou nom)
précédé d’un ou plusieurs qualifieur. Il y a trois sortes de qualifieurs :
– type : host, net ou port
– direction : src, dst, src or dst, src and dst . Pour une liaison point à
point on peut utiliser inbound et outbound.
– protocole : ether, ip, arp, tcp, udp ...
Les primitives peuvent être combinées par and, or et not. Les parenthèses
sont autorisées mais doivent être mise entre simples quotes pour ne pas être
interprétées par le shell.
Exemples d’expressions :
46CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

– host phoebus : paquet venant ou à destination de la machine phoebus


– src host phoebus : paquet venant de la machine phoebus
– port 25 : paquet venant ou à destination du port 25 (on peut remplacer
25 par smtp cf /etc/services). port 25 est équivalent à (tcp or udp)
port 25
– tcp : paquet tcp
– tcp and host phoebus : paquet tcp venant ou à destination de la ma-
chine phoebus
– host phoebus and port ’(ftp or ftp-data)’ : paquet ftp venant ou
à destination de la machine phoebus
Autres primitives :
– less 1000 : paquet de longueur inférieure à 1000 octets
– len <= 1000 : idem
– greater 1000 : paquet de longueur supérieure à 1000 octets
– len >= 1000 : idem
– ip proto //icmp : paquet IP de protocole icmp (ou udp, tcp). Le backs-
lash sert à distinguer de l’utilisation citée plus haut en protocole.
– expr relop expr : relop peut être =, !=, >, >=, <, <=, expr est une
expression arithmétique avec les opérateurs +, -, *, /, &,| et des opérateurs
qui permettent d’accèder à des données dans des paquets. Exemple :
tcp[0] désigne le 1er octet de l’en-tête TCP.
Exemples :
Ecoute d’un port pour l’identifier :
tcpdump port 1023
Ecoute du protocole icmp :
tcpdump ip proto \\icmp
tcpdump icmp
Ecoute paquets tcp sans date (timestamp), en laissant les adresses IP (-n)
tcpdump -n -t tcp
Ecoute d’une machine donnée par son adresse IP :
tcpdump host 195.36.171.1
Paquets destinés à la machine phoebus :
tcpdump dest host phoebus
Paquets tcp concernant phoebus :
tcpdump -n -t tcp and host phoebus
Paquets udp concernant phoebus :
tcpdump udp and host phoebus : paquets udp concernant phoebus
Paquets ftp concernant phoebus :
tcpdump host phoebus and port ’(ftp or ftp-data)’
Paquets échangés entre les machines zoroastre et helios
2.14. OUTILS DE DIAGNOSTIC 47

tcpdump host zoroastre and helios


Ecoute d’une session pop de la machine milord depuis le serveur :
tcpdump host milord and port pop3 > milord.txt &
Exemple de paquets TCP : on filtre les paquets TCP qui ont les flags SYN
ou FIN levés, ils sont dans le 13ème octet de l’en-tête TCP. & est l’opérateur
AND bit à bit.

# tcpdump ’tcp[13] & 3 != 0 ’


tcpdump: listening on eth0
19:15:01.126744 zoroastre.c-strasbourg.fr.8264 > cttm.univ-lemans.fr.auth:
S 3625303099:3625303099(0) win 32120 <mss 1460>
19:15:05.097050 alexandra.c-strasbourg.fr.1108 > zoroastre.c-strasbourg.fr.pop-3:
S 33699541:33699541(0) win 8192 <mss 1460> (DF)
19:15:05.097050 zoroastre.c-strasbourg.fr.pop-3 > alexandra.c-strasbourg.fr.1108:
S 3553096866:3553096866(0) ack 33699542 win 32736 <mss 1460>
19:15:05.337126 zoroastre.c-strasbourg.fr.pop-3 > alexandra.c-strasbourg.fr.1108:
F 253:253(0) ack 43 win 32736

Structure d’un paquet TCP :


src > dst: flags data-seqno ack window urgent options
– src et dst sont les adresses IP et les ports source et destination
– flags : une combinaison de S (SYN), F(FIN), P (PUSH), R (RST) ou un
simple ‘.’ (no flags)
– Data-seqno : portion de l’espace de numéros de séquence couvertes par les
données. Exemple :
3625303099:3625303099(0)
signifie pas de données. Au départ les numéros sont donnés en absolu. A la
suite ils sont donnés relativement au numéro de séquence initial. Exemple :
2:21(19)
signifie données de 19 octets
– Ack est le numéro de séquence du prochain octet attendu du partenaire
– Window : nombre d’octets disponibles dans le buffer de réception
– urgent : données urgentes
– options : options entre < >, exemple :
<mss 1460>
– src, dst, flags sont toujours présents
Exemple de paquet UDP : sur la machine phoebus on passe une commande
qui interroge le serveur de noms sur zoroastre :
# tcpdump udp and host phoebus
tcpdump: listening on eth0
18:41:41.145976 phoebus.c-strasbourg.fr.1026 > zoroastre.c-strasbourg.fr.domain:
692+ (35)
18:41:41.145976 zoroastre.c-strasbourg.fr.domain > phoebus.c-strasbourg.fr.1026:
692 1/6/6 (283)
Les nombres entre parenthèses, par exemple (35) sont les tailles de paquets.
Exemple de paquet non IP :
48CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

16:51:15.277160 0:b0:64:14:e:9a > 1:80:c2:0:0:0 802.1d ui/C


>>> Unknown IPX Data: (43 bytes)
[000] 00 00 00 00 00 80 00 00 B0 64 14 0E 80 00 00 00 ........ .d......
[010] 00 80 00 00 B0 64 14 0E 80 80 1A 00 00 14 00 02 .....d.. ........
[020] 00 0F 00 00 00 00 00 00 00 00 00 ........ ...
len=43

Exemple de sortie avec l’option -e (en-tête Ethernet) :

17:09:25.077984 0:20:af:aa:ae:93 0:50:4:f9:33:82 ip 394:


phoebus.c-strasbourg.fr.ssh > zoroastre.c-strasbourg.fr.1023:
P 1401:1741(340) ack 0 win 32120 (DF) [tos 0x10]

2.14.7 arp
arp -a permet de contrôler le contenu du cache ARP.

$ arp -a
pandore.c-strasbourg.fr (193.54.230.80) at 00:60:08:D4:49:18 [ether] on eth0
routeur (193.54.230.1) at 00:30:94:9A:13:00 [ether] on eth0
...

On peut aussi faire cat /proc/net/arp

$ cat /proc/net/arp
IP address HW type Flags HW address Mask Device
193.54.230.80 0x1 0x2 00:60:08:D4:49:18 * eth0
193.54.230.1 0x1 0x2 00:30:94:9A:13:00 * eth0
...

Si l’administrateur prend soin de mémoriser les adresses Ethernet dans un


fichier du type /etc/ethers il peut contrôler l’arrivée de machines intruses sur
le réseau en analysant le cache ARP des serveurs. C’est aussi un moyen de
contrôler qu’une machine ne prenne pas l’adresse IP d’une autre.

2.14.8 Causes de panne réseau


Il faut penser tant aux aspects matériels que logiciels. Si le câble est coupé
quelque part...
Localisez la panne : ping vers des machines locales, le routeur ou extérieures
– Si accès au routeur et non à l’extérieur : vous avez oublié de déclarer une
default route ou bien problème au-delà du routeur, faire traceroute
– Si accès avec cible sous forme adresse IP plutôt que nom de domaine :
problème avec votre résolveur de noms ou votre serveur DNS.
– Si pas d’accès au routeur mais accès à d’autres machines locales : problème
sur le réseau local : voir hub, (votre prise murale y est-elle reliée ?) switch
ou routeur lui-même. Une simple coupure de courant...
– Si aucun accès ni à l’intérieur ni à l’extérieur : problème de câblage ou
problème sur votre machine :
– Vérifier connexion du panneau de brassage au hub : LED allumé sur le
hub ?
– Vérifier prise RJ45 et câble : vous en changez.
2.15. IP ALIASING 49

– Vérifier vos paramètres réseau : adresse IP, masque de réseau... Vous


n’utiliseriez pas l’adresse IP de quelqu’un d’autre, ou l’inverse ?
– Que donne ifconfig ?
– ping localhost : si échec, problème de logiciel, support TCP/IP dans
le noyau ? Le noyau reconnaı̂t-il la carte au boot ?
– Si driver Ethernet en module, est-il bien chargé ? faire lsmod. Sinon
module non chargé, ifconfig eth0 proteste. Cause : le module n’a pas
été chargé automatiquement au boot. Problème classique en RedHat,
après une mise à jour du noyau par package rpm...
– Avez vous un conflit d’IRQ ou d’IO Base Address (fréquent avec cartes
ISA) ?
– En désespoir de cause, prenez votre tournevis, ouvrez la bécane, retirez
la carte réseau (sans bouger les autres cartes !), retirez la poussière, souf-
flez dans le slot avec un produit de nettoyage pour carte électronique,
renfoncez bien la carte dans son slot, retestez.
– Sinon, il est très rare qu’une carte réseau tombe en panne, il existe des
logiciels de test des cartes : voir ceux fournis par 3COM (sous DOS !),
voir ceux fournis par Donald Becker qui tournent sous Linux :
http://cesdis.gsfc.nasa.gov/linux/

2.15 IP aliasing
Permet d’associer plusieurs adresses IP à un même interface réseau : utile
pour
– remplacer une machine par une autre en cas de panne ou de maintenance
– gérer plusieurs sites www avec un seul serveur apache
Documentation :
Virtual-Services HowTo
IP-Alias mini-HowTo
/usr/src/linux/Documentation/networking/alias.txt
Mise en oeuvre :
Dans le noyau configurer le support de IP ALIAS.
En Debian si on utilise le script /etc/init.d/network on y ajoute :
echo "Running ipalias..."
ifconfig eth0:0 193.54.230.37 netmask 255.255.255.0 broadcast 193.54.230.255
route add -host 193.54.230.37 dev eth0:0
ifconfig eth0:1 193.54.230.50 netmask 255.255.255.0 broadcast 193.54.230.255
route add -host 193.54.230.50 dev eth0:1
ifconfig eth0:2 193.54.230.104 netmask 255.255.255.0 broadcast 193.54.230.255
route add -host 193.54.230.104 dev eth0:2
Si en Debian on lance le réseau par ifup, on ajoute dans /etc/network/interfaces :
iface eth0:0 inet static
address 193.54.230.37
network 193.54.230.0
netmask 255.255.255.0
broadcast 193.54.230.255
up route add -host 193.54.230.37 dev eth0:0
50CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Test :

$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
193.54.230.109 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
193.54.230.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 193.54.230.1 0.0.0.0 UG 0 0 0 eth0

2.16 Proxy ARP


Si une machine en route une autres par une liaison point à point comme avec
PPP ou PLIP, elle va déclarer que son adresse Ethernet est celle de la machine
qu’elle route et répond donc à sa place aux requêtes ARP. On appelle ça du
proxy ARP ou ARP par délégation. Cela se fait sur la machine routeur par :

arp -s 196.168.1.2 00:50:04:F9:33:82 pub

196.168.1.2 est l’adresse IP de la machine routée, 00 :50 :04 :F9 :33 :82
est l’adresse Ethernet de la machine routeur.

2.17 RARP
Reverse Adress Resolution Protocol (RARP), consiste à demander son adresse
IP à un serveur en fournissant son adresse Ethernet. C’est utilisé pour permettre
à des machines sans disque de booter.
Le support RARP doit être configuré dans le noyau (CONFIG INET RARP),
si on veut que Linux réponde à de telles requêtes.

2.18 DHCP
DHCP (Dynamic Host Configuration Protocol) est un protocole décrit par la
RFC 2131 qui permet d’attribuer dynamiquement des adresses IP. C’est utilisé
par les Internet Service Provider qui ont beaucoup de clients mais un nombre
limité d’adresses IP ou pour attribuer des adresses IP ou machines nomades
comme les ordinateurs portables. En plus de l’adresse IP, le netmask, l’adresse
de broadcast, les DNS sont aussi attribués. L’utilisation de DHCP rend la confi-
guration réseau beaucoup plus facile.

2.18.1 DHCP client


Une machine Linux qui veut obtenir une adresse IP (cas des machines dis-
posant d’un interface Ethernet relié à un cable-modem) doit installer un client
comme pump ou dhcpcd.
En Debian c’est le package dhcpcd. A l’installation du package, la configu-
ration est proposée. Le script de lancement est /etc/init.d/dhcpcd. Confi-
guration dans /etc/dhcpc/config : mettre IFACE=eth0, eth0 étant l’interface
choisi. Si on ne veut pas lancer dhcpcd mettre IFACE=none.
2.18. DHCP 51

Si le réseau est lancé par la commande ifup via le script /etc/init.d/networking,


on ajoutera dans /etc/network/interfaces ceci :
iface eth0 inet dhcp
– dhcp vient à la place de static
– les paramètres hostname, leasetime, vendor, client sont optionnels.
– ifup -a démarrera dhcpcd

C’est la commande ifup qui s’occupe d’appeler pump ou dhcpcd.
Si le package pump est installé, le daemon pump est lancé :
# ps aux|grep pump
root 977 0.0 0.3 1740 684 ? Ss 13:53 0:00 pump -i eth0 -r
Trace d’une attribution d’adresse dans /var/log/daemon :
Jun 14 13:54:17 hathor pumpd[977]: PUMP: sending discover
Jun 14 13:54:17 hathor pumpd[977]: got dhcp offer
Jun 14 13:54:17 hathor pumpd[977]: PUMP: sending second discover
Jun 14 13:54:17 hathor pumpd[977]: PUMP: got an offer
Jun 14 13:54:17 hathor pumpd[977]: PUMP: got lease
Jun 14 13:54:17 hathor pumpd[977]: intf: device: eth0
Jun 14 13:54:17 hathor pumpd[977]: intf: set: 416
Jun 14 13:54:17 hathor pumpd[977]: intf: bootServer: 193.54.230.121
Jun 14 13:54:17 hathor pumpd[977]: intf: reqLease: 43200
Jun 14 13:54:17 hathor pumpd[977]: intf: ip: 193.54.230.3
Jun 14 13:54:17 hathor pumpd[977]: intf: next server: 193.54.230.121
Jun 14 13:54:17 hathor pumpd[977]: intf: netmask: 255.255.255.0
Jun 14 13:54:17 hathor pumpd[977]: intf: gateways[0]: 193.54.230.1
Jun 14 13:54:17 hathor pumpd[977]: intf: numGateways: 1
Jun 14 13:54:17 hathor pumpd[977]: intf: dnsServers[0]: 193.54.230.20
Jun 14 13:54:17 hathor pumpd[977]: intf: dnsServers[1]: 193.54.211.65
Jun 14 13:54:17 hathor pumpd[977]: intf: dnsServers[2]: 193.48.86.103
Jun 14 13:54:17 hathor pumpd[977]: intf: numDns: 3
Jun 14 13:54:17 hathor pumpd[977]: intf: domain: c-strasbourg.fr
Jun 14 13:54:17 hathor pumpd[977]: intf: broadcast: 193.54.230.255
Jun 14 13:54:17 hathor pumpd[977]: intf: network: 193.54.230.0
Jun 14 13:54:17 hathor pumpd[977]: configured interface eth0
pump met à jour le fichier /etc/resolv.conf

2.18.2 DHCP serveur


On peut installer un serveur DHCP (package Debian dhcp) qui distribuera
des adresse IP prises dans certaines plages.
C’est un daemon dhcpd lancé par /etc/init.d/dhcp start. Il écoute le
port UDP 67 (bootps) par défaut et envoie des trames sur le port UDP 68.
Documentation :
man dhcpd
man dhcpd.conf
man dhcp-options
52CHAPITRE 2. TCP-IP : LES PROTOCOLES DE L’INTERNET SUR LINUX

Option du noyau prérequise :


CONFIG_FILTER=y
La configuration est dans le fichier /etc/dhcpd.conf. Exemple :
subnet 193.54.230.0 netmask 255.255.255.0 {
range 193.54.230.200 193.54.230.254;
option subnet-mask 255.255.255.0;
option broadcast-address 193.54.230.255;
option routers 193.54.230.1;
option domain-name "c-strasbourg.fr";
option domain-name-servers 193.54.230.20, 193.54.211.65, 193.48.86.103;
option netbios-name-servers 193.54.230.20;
default-lease-time 43200;
deny unknown-clients;
}
host a { hardware ethernet 00:0d:56:aa:7f:1e; }
host b { hardware ethernet 00:a0:d1:b3:32:29; }
host c { hardware ethernet 00:0e:7b:d2:e5:5e; }
host d { hardware ethernet 00:a0:d1:b8:b3:68; fixed-address 193.54.230.3;}
Dans cet exemple, une machine doit avoir une adresse MAC indiquée pour
obtenir une adresse de dhcpd. Les machines a, b, c obtiennent des adresses
entre 193.54.230.200 et 193.54.230.254. La machine d se voit toujours attribuer
l’adresse 193.54.230.3.
Fichier log : /var/log/daemon.log
Attribution d’une adresse IP :
Jun 16 08:51:08 mithra dhcpd: DHCPDISCOVER from 00:11:d8:95:e7:d0 via eth0
Jun 16 08:51:09 mithra dhcpd: DHCPOFFER on 193.54.230.205 to 00:11:d8:95:e7:d0 v
ia eth0
Jun 16 08:51:09 mithra dhcpd: DHCPREQUEST for 193.54.230.205 from 00:11:d8:95:e7
:d0 via eth0
Jun 16 08:51:09 mithra dhcpd: DHCPACK on 193.54.230.205 to 00:11:d8:95:e7:d0 via
eth0
Rejet d’un client inconnu :
Mar 21 17:01:58 mithra dhcpd: DHCPDISCOVER from 00:a0:d1:b3:32:29 via eth0
Mar 21 17:01:58 mithra dhcpd: Ignoring unknown client 00:a0:d1:b3:32:29
ia eth0

Mémoire des adresses attribuées aux machines dans le fichier /var/lib/dhcp/dhcpd.leases,


exemple :
lease 193.54.230.203 {
starts 4 2005/04/14 15:50:23;
ends 5 2005/04/15 03:50:23;
hardware ethernet 00:e0:00:97:87:1d;
uid 01:00:e0:00:97:87:1d;
client-hostname "tigrou";
}
Chapitre 3

Le serveur DNS BIND

3.1 Le Domain Name System (DNS)


Toute machine connectée sur Internet est identifiée par une adresse IP unique.
Comme ces adresses sont difficilement mémorisables, on a appelé les machines
par des noms, puis on a mis ces noms dans des domaines.
Le Domain Name System (DNS) (voir les RFC 1033, 1034, and 1035) définit
une structure hiérarchique pour cet espace de nommage, l’autorité de nommage
et le mécanisme pour faire la correspondance entre nom de domaine et adresse
IP.
Le nom de ma machine est zoroastre et comme elle est dans le domaine
c-strasbourg.fr son fully qualified domain name (fqdn) est zoroastre.c-strasbourg.fr.
Le DNS est une base de données répartie constituée par des serveurs qui
communiquent entre eux par le protocole domain. C’est une base de données
très sollicitée qui a démontré sa robustesse.
Toute machine connectée sur Internet doit avoir un nom enregistré pour
l’interrogation directe et inverse dans le DNS.
BIND (The Berkeley Internet Name Domain) est une implémentation du
protocole Domain Name System (DNS). Il est constitué d’un daemon named,
c’est le serveur de nom de domaine.
Il y plusieurs types de configuration de named :
– Primary nameserver (master) : serveur de noms faisant autorité sur une
zone. Il fait des ”authoritative answers”. Son administrateur a délégation
du NIC (Network Information Center) pour gérer sa zone.
– Secondary nameserver (slave) : copie d’un serveur de nom primaire, ne
fait pas autorité, se met régulièrement à jour. Très utile quand le primaire
est inaccessible
– Cache nameserver (hint) : ne fait que gérer un cache des précédentes
requêtes DNS
Un serveur de noms primaire définit une zone. Une zone est un sur-ensemble
de réseau. Pour reprendre l’exemple d’Olaf Kirch sur la partie de l’espace des
noms groucho.edu attribuée à l’Université Groucho Marx, alsacien célèbre :

root *
|
------------+--------------+-----------+-----------------------------

53
54 CHAPITRE 3. LE SERVEUR DNS BIND

com * edu * net *


|
-----------+-------+---
|
groucho *
|
-+-------------------+------------------+-------
| physics *
maths |
| +---------+--------+
+------+---+----+ theory collider
gauss erdos sophus | |
+-----+------+---+ +-----+------+
quark otto niels up down strange

Tous les noms affectés d’une étoile marquent le début d’une zone. Ils sont
associés à un primary nameserver. On voit sur cet exemple que le domaine
groucho.edu comporte toutes les machines de la Groucho Marx University,
alors que la zone groucho.edu n’inclut que les machines gérées directement
par le Computing Center comme gauss.maths.groucho.edu. Les machines du
département de Physique appartiennent à une zone différente : physics.groucho.edu9
Un réseau avec un netmask non sur une frontière d’octets ne peut constituer
une zone d’autorité (en raison de l’interrogation inverse).

3.2 Installation en Debian


Package bind version Version : 8.2.3-0.potato.1 ou bind 8.3.3-2.0woody1
Fichier de configuration : /etc/bind/named.conf
Tous les fichiers de configuration statiques sont placés dans /etc/bind : Les
zones pour lesquelles on est primary name server, la zone localhost et la zone
inverse. Le répertoire de travail de named est /var/cache/bind. Tous les fichiers
transitoires créés par named y sont rangés en particulier ceux pour lesquels il
est serveur secondaire.
Documentation :
– man named
– man named.conf
– man ndc
lynx /usr/doc/bind/html/index.html

3.3 Exemple de configuration d’un serveur cache


C’est la configuration par défaut fournie dans /etc/bind/named.conf :

options {
directory "/var/cache/bind";
};

// reduce log verbosity on issues outside our control


3.4. EXEMPLE DE CONFIGURATION D’UN SERVEUR SECONDAIRE 55

logging {
category lame-servers { null; };
category cname { null; };
};

// prime the server with knowledge of the root servers


zone "." {
type hint;
file "/etc/bind/db.root";
};

// be authoritative for the localhost forward and reverse zones, and for
// broadcast zones as per RFC 1912

zone "localhost" {
type master;
file "/etc/bind/db.local";
};

zone "127.in-addr.arpa" {
type master;
file "/etc/bind/db.127";
};

zone "0.in-addr.arpa" {
type master;
file "/etc/bind/db.0";
};

zone "255.in-addr.arpa" {
type master;
file "/etc/bind/db.255";
};

// add entries for other zones below here

3.4 Exemple de configuration d’un serveur se-


condaire
On est rarement responsable d’une zone d’autorité, donc de l’administration
d’un primary nameserver. Par contre il est fréquent d’être responsable d’un
réseau local. Dans ce cas il est vivement recommandé d’installer un nameserver
secondaire.

// generated by named-bootconf.pl
options {
directory "/var/named";
/*
* If there is a firewall between you and nameservers you want
56 CHAPITRE 3. LE SERVEUR DNS BIND

* to talk to, you might need to uncomment the query-source


* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// a caching only nameserver config
//
zone "." {
type hint;
file "named.ca";
};
zone "localhost" {
type master;
file "named.local";
};

zone "0.0.127.in-addr.arpa" {
type master;
file "named.rev-local";
};

zone "c-strasbourg.fr" {
type slave;
file "cstr.zone.bak";
masters {193.54.211.65; };
};

zone "230.54.193.in-addr.arpa" {
type slave;
file "cstr.rev.zone.bak";
masters {193.54.211.65;};
};

Remarque : la syntaxe précise zone "nom domaine" in {}. Je n’ai pas de


in dans ma config et ça marche !
– options { }
– directory "/var/named" : le répertoire où va se trouver la copie lo-
cale de la base de données : il contiendra les fichiers indiqués par les
paramètres file suivants
– zone "nom de domaine" { } : définition d’une zone de nommage. ’.’ définit
la racine (root) de l’arborescence des noms
– type : type de serveur
– hint : serveur cache, zone réduite à la racine de l’arborescence des
noms. Il y a plusieurs serveurs root, heureusement !
– master : serveur ayant autorité sur la zone (master copy)
3.5. LA BASE DE DONNÉES DES NOMS DE DOMAINES 57

– slave : serveur secondaire (replica of a master zone)


– file : nom du fichier associé à cette zone
– masters : si je suis slave adresse des DNS masters (j’ai cité en premier
le master vrai, le second est un slave)
Ainsi mon répertoire /var/named contient un fichier par zone :
– named.ca : cache DNS, serveur racines de l’arborescence des noms de
domaines Internet
– named.local : zone localhost dont c’est moi le maı̂tre !
– named.rev-local : idem pour l’interrogation inverse
– cstr.zone.bak : zone c-strasbourg.fr, je ne suis que l’esclave
– cstr.rev.zone.bak : idem pour l’interrogation inverse
La zone ”.” est obligatoire. Si le fichier de configuration n’a que cette zone
et les zones "localhost" et "0.0.127.in-addr.arpa", c’est un serveur DNS
cache.

3.5 La base de données des noms de domaines


Formée de Resources Records (RR). Format :

<domain> <opt_ttl> <opt_class> <type> <resource_record_data>

– domaine : nom de domaine


– opt ttl : durée de vie de l’info en secondes (optionnel)
– opt class : toujours IN (Internet)
– type :
– SOA : Start of Authority
– A : définit le canonical name
– NS : an authoritative name server
– CNAME : alias
– PTR : reverse mapping (pour l’interrogation inverse)
– MX : mail exchanger for a domain
– HINFO : information on hardware and software used by this host
– resource record data :
Syntaxe des noms de domaines :
– Tout nom de domaine non terminé par un ’.’ est complété par le nom de
la zone ou de ce qui est défini par $ORIGIN. Ainsi :
$ORIGIN c-strasbourg.fr.
akgonul 3600 IN A 193.54.229.121
définit l’adresse IP pour le nom de domaine akgonul.c-strasbourg.fr. Tout
nom de domaine terminé par un point est un fqdn.
– La racine de l’arborescence est notée par un ’.’
– ’@’ définit l’origine courante donc la zone associée au fichier définie dans
/etc/named.conf, sauf s’il y une instruction $ORIGIN avant.
Exemple de RR de type SOA :

notez le .
|
v
(domain) (ttl) (class) (type) (rdata)
c-strasbourg 3600 IN SOA antares.c-strasbourg.fr.
58 CHAPITRE 3. LE SERVEUR DNS BIND

administrator.c -strasbourg.fr. (
1998091613 ; serial
43200 ; refresh: twice a day (sec)
600 ; retry: ten minutes (sec)
2592000 ; expire: 30 days (sec)
604800 ; minimum: default ttl or records: 1 week)
Exemple de RR de type NS :
(class) (type) (rdata)
IN NS antares.c-strasbourg.fr.
IN NS sbgsu3.in2p3.fr.
IN NS zoroastre.c-strasbourg.fr.
Exemple de RR de type A :
(domaine) (ttl) (class) (type) (rdata)
zoroastre 604800 IN A 193.54.230.20
zoroastre n’est pas suivi d’un point, comme la zone courante est c-strasbourg.fr
le nom fqdn est zoroastre.c-strasbourg.fr
Exemple de RR de type PTR :
(rdata) (ttl) (class) (type) (domaine)
20 604800 IN PTR zoroastre.c-strasbourg.fr.
Ici comme le nom de la zone est 230.54.193.in-addr.arpa le fqdn est
20.230.54.193.in-addr.arpa
Exemple de RR de type CNAME :
(domaine) (ttl) (class) (type) (rdata)
www-phase 604800 IN CNAME zoroastre.c-strasbourg.fr.
www-phase.c-strasbourg.fr est un alias de zoroastre.c-strasbourg.fr
Exemple de RR de type MX :
(domaine) (ttl) (class) (note) (rdata)
phase 604800 IN MX 5 zoroastre.c-strasbourg.fr.
Tout mail à destination de phase.c-strasbourg.fr est à envoyer à zoroastre.c-strasbourg.fr.
Il peut y avoir plusieurs MX records c’est celui qui a la note la plus basse qui
est choisi de préférence.
Contenu du fichier named.local
;
; BIND data file for local loopback interface
;
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Default TTL
;
@ IN NS localhost.
@ IN A 127.0.0.1
3.6. ADMINISTRATION 59

fichier named.rev-local
;
; BIND reverse data file for local loopback interface
;
@ IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Default TTL
;
@ IN NS localhost.
1 IN PTR localhost.

3.6 Administration
Démarrage par /etc/init.d/bind start
Contrôle par ndc Name daemon control interface
– ndc status -> PID de named
– ndc reload -> recharge la base de données
– ndc start -> démarrage
– ndc restart -> redémarrage
– ndc stop -> arrêt

3.6.1 Log
Le fichier log est /var/log/daemon.log
Lancement de named
Nov 15 12:48:40 yelen named[17303]: starting (/etc/bind/named.conf). named 8.2.
3-REL-NOESW Wed Nov 13 18:45:21 UTC 2002 ^Ibuildd@cyberhq:/build/buildd/bind-8.2
.3/src/bin/named
Nov 15 12:48:40 yelen named[17303]: hint zone "" (IN) loaded (serial 0)
Nov 15 12:48:40 yelen named[17303]: master zone "localhost" (IN) loaded (serial
1)
Nov 15 12:48:40 yelen named[17303]: master zone "127.in-addr.arpa" (IN) loaded (
serial 1)
Nov 15 12:48:40 yelen named[17303]: master zone "0.in-addr.arpa" (IN) loaded (se
rial 1)
Nov 15 12:48:40 yelen named[17303]: master zone "255.in-addr.arpa" (IN) loaded (
serial 1)
Nov 15 12:48:40 yelen named[17303]: listening on [193.54.230.76].53 (eth0)
Nov 15 12:48:40 yelen named[17303]: listening on [193.54.230.20].53 (eth0:2)
Nov 15 12:48:40 yelen named[17303]: Forwarding source address is [0.0.0.0].2233
Nov 15 12:48:40 yelen named[17304]: Ready to answer queries.
60 CHAPITRE 3. LE SERVEUR DNS BIND
Chapitre 4

PLIP : IP sur port parallèle

PLIP permet de faire communiquer deux machines par TCP-IP sans carte
réseau mais connectées via le port parallèle. C’est utile pour l’installation d’une
machine (mais assez lent), les transferts de fichiers avec un portable, ou un
mini réseau chez soi . C’est aussi un bon exercice en matière de routage ou de
proxyarp.

4.1 Le câble
C’est un cordon parallèle DB25 mâle/DB25 mâle dit ”null-printer” ou ”La-
pLink”
Voici le câblage indiqué dans /usr/src/linux/drivers/net/plip.c :

The cable used is a de facto standard parallel null cable -- sold as


a "LapLink" cable by various places. You’ll need a 12-conductor cable to
make one yourself. The wiring is:
SLCTIN 17 - 17
GROUND 25 - 25
D0->ERROR 2 - 15 15 - 2
D1->SLCT 3 - 13 13 - 3
D2->PAPOUT 4 - 12 12 - 4
D3->ACK 5 - 10 10 - 5
D4->BUSY 6 - 11 11 - 6
Do not connect the other pins. They are
D5,D6,D7 are 7,8,9
STROBE is 1, FEED is 14, INIT is 16
extra grounds are 18,19,20,21,22,23,24

4.2 Client et serveur


On relie donc deux machines avec ce câble par leur port parallèle. Elles
jouent un rôle symétrique a priori. Mais si l’une est reliée à un réseau local,
voire à Internet par son interface Ethernet, on va l’appeler ”serveur”.
Dans l’exemple qui suit, le serveur s’appelle genesis et a l’adresse IP :
193.54.230.56, le client s’appelle phoebus et a l’adresse IP : 193.54.230.115.

61
62 CHAPITRE 4. PLIP : IP SUR PORT PARALLÈLE

+------------------+ // // +----------------+
| genesis |--------------------| phoebus |
+---------+--------+ +----------------+
193.54.230.56 | 193.54.230.115
| Réseau local
----------------+-----------------------
193.54.230.0

4.3 Module plip


PLIP : Parallel Line IP.
Il faut avoir le support plip dans le noyau ou mieux en module sur les deux
machines : PLIP (parallel port) support (CONFIG PLIP).

4.3.1 Noyau de version < 2.2


En noyau de version inférieure à 2.2 on fait :
modprobe plip
On peut disposer des interfaces plip0, plip1, plip2 correspondant aux ports
lp0, lp1, lp2. Voici leurs caractéristiques d’après /usr/src/linux/drivers/net/Space.c
Interface I/O Port IRQ
plip0 Ox3BC 5
plip1 Ox378 7
plip2 Ox278 2
On a la réponse :
NET3 PLIP version 2.2 gniibe@mri.co.jp
plip1: Parallel port at 0x378, using assigned IRQ 7.
On vérifie le chargement du module par lsmod :
phoebus:~# lsmod
Module Pages Used by
plip 3 0
serial 8 1 (autoclean)
nfs 12 4
3c509 2 0

4.3.2 Noyau de version > 2.2


Configuration noyau :
– Parallel port support (CONFIG PARPORT)
– Auto-probe for parallel devices (CONFIG PNP PARPORT)
– PLIP (parallel port) support (CONFIG PLIP)
Le code parport ( /usr/src/linux/drivers/misc/parport* et /usr/src/linux/drivers/pnp/pa
voir /usr/src/linux/Documentation/parport.txt permet de partager le port
parallèle entre plusieurs drivers (printer, PLIP, ZIP, parallel port ATAPI CD-
Rom or Disk). Ceci dit, pour le test, on a arrêté le daemon lpd sur les deux
machines. parport est découpé en trois modules :
4.4. CÔTÉ CLIENT 63

– parport indépendant de l’architecture


– parport pc spécifique pour plateforme Intel. On peut fournir en argu-
ments io et irq.
– parport probe teste l’équipement qui est au bout.
On fait :

depmod -a
modprobe parport_pc io=0x378 irq=7
insmod plip timid=1

timid=1 évite d’avoir le diagnostic "Device or resource busy".


En tapant dmesg apparaissent les lignes :

parport0: PC-style at 0x378, irq 7 [SPP]


NET3 PLIP version 2.3-parport gniibe@mri.co.jp
plip0: Parallel port at 0x378, using IRQ 7

Le port parallèle est décrit dans /proc/parport/0 fichiers devices, hardware,


irq, autoprobe.

4.4 Côté client


On désactive au besoin l’interface Ethernet, sinon on risque des problèmes
de routage :

ifconfig eth0 down

On configure le réseau par :

ifconfig plip1 193.54.230.115 pointopoint 193.54.230.56


route add default gw 193.54.230.56

phoebus:~# ifconfig plip1


plip1 Link encap:Ethernet HWaddr FC:FC:C1:36:E6:73
inet addr:193.54.230.115 P-t-P:193.54.230.56 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
Collisions:0
Interrupt:7 Base address:0x378

Puis, si vous tapez route vous devriez voir :

Destination Gateway Genmask Flags Metric Ref Use Iface


193.54.230.56 * 255.255.255.255 UH 0 0 0 plip1

4.5 Côté serveur


On est en noyau 2.2.14, l’interface défini est plip0, on fait :

ifconfig plip0 193.54.230.56 pointopoint 193.54.230.115


64 CHAPITRE 4. PLIP : IP SUR PORT PARALLÈLE

En tapant ifconfig, on a :

genesis:~ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:35 errors:0 dropped:0 overruns:0 frame:0
TX packets:35 errors:0 dropped:0 overruns:0 carrier:0
collisions:0

eth0 Link encap:Ethernet HWaddr 00:60:97:90:D1:38


inet addr:193.54.230.56 Bcast:193.54.230.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:634 errors:0 dropped:0 overruns:0 frame:0
TX packets:60 errors:0 dropped:0 overruns:0 carrier:0
collisions:6
Interrupt:10 Base address:0x300

plip0 Link encap:Ethernet HWaddr FC:FC:C1:36:E6:38


inet addr:193.54.230.56 P-t-P:193.54.230.115 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0
Interrupt:7 Base address:0x378

On remarque que le serveur a la même adresse IP sur deux interfaces différents


eth0 et plip0.
La commande route donne :

Kernel IP routing table


Destination Gateway Genmask Flags Metric Ref Use Iface
193.54.230.115 * 255.255.255.255 UH 0 0 0 plip0
193.54.230.0 * 255.255.255.0 U 0 0 0 eth0
loopback * 255.0.0.0 U 0 0 0 lo
default 193.54.230.1 0.0.0.0 UG 0 0 0 eth0

Le flag H indique qu’un seul host peut être atteint par cette route. Le flag
U que l’interface est UP, G que c’est un Gateway.

4.6 Test
On teste que les deux machines communiquent par le câble null-printer en
faisant ping du client vers le serveur et inversement.

genesis:~ # ping 193.54.230.115


PING 193.54.230.115 (193.54.230.115): 56 data bytes
64 bytes from 193.54.230.115: icmp_seq=0 ttl=64 time=4.4 ms
4.7. ROUTAGE PAR LE SERVEUR 65

4.7 Routage par le serveur


Pour que les autres machines du réseau local puissent communiquer avec le
client, il faut que le serveur 193.54.230.115 agisse comme un routeur. Pour cela
on active sous root le routage (forward) de paquets IP :
genesis:~ # echo "1" > /proc/sys/net/ipv4/ip_forward
Vérification par :
cat /proc/sys/net/ipv4/ip_forward
1
Il faudrait en plus sur chaque machine annoncer une route par :
route add 193.54.230.115 gw 193.54.230.56
C’est fastidieux.
Il est plus facile d’utiliser proxy ARP. On va annoncer sur le serveur que son
adresse Ethernet est celle du client 193.54.230.115 :
genesis:~ # arp -s 193.54.230.115 00:60:97:90:D1:38 pub
00 :60 :97 :90 :D1 :38 est l’adresse Ethernet du serveur (lu sur ifconfig).
pub est obligatoire : il indique que l’interface spécifié (ici eth0) est celui sur
lequel on répondra aux requêtes ARP. Il doit être différent de celui sur lequel
on route les paquets IP. On vérifie en interrogeant le cache arp :
genesis:~ # arp -a |grep 193.54.230.115
? (193.54.230.115) at * PERM PUP on eth0
On peut alors tester la communication entre le client et les autres machines
du réseau.

4.8 Test de performances


On charge un fichier de 5.7 Meg par scp. Par plip1 cela dure 2’ 37” soit un
débit de 36 kB/s. En rebranchant la machine sur Ethernet par eth0 le même
transfert prend 21”, soit un débit de 271kB/s, donc 7.4 fois plus vite.
Au cours du transfert par PLIP on a 3 fois sur le client le diagnostic :
plip1 : receive time out (2,87)
ifconfig plip0 donne sur le serveur :
plip0 Link encap:Ethernet HWaddr FC:FC:C1:36:E6:38
inet addr:193.54.230.56 P-t-P:193.54.230.115 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MTU:1500 Metric:1
RX packets:4361 errors:0 dropped:0 overruns:0 frame:0
TX packets:8098 errors:1 dropped:0 overruns:0 carrier:1
collisions:0
Interrupt:7 Base address:0x378

4.9 Documents
http ://www.linux-france.org/article/sys/Install-Plip/Install-Plip-1.htm
66 CHAPITRE 4. PLIP : IP SUR PORT PARALLÈLE
Chapitre 5

PPP

5.1 Introduction
PPP, Point to Point Protocol permet de faire passer le protocole IP sur
une liaison série (câble null-modem, modem et ligne téléphonique ou liaison
NUMERIS -ISDN-). Il permet de se connecter à un fournisseur d’accès Internet
ou de connecter ensemble deux réseaux locaux. Linux peut être client ou serveur
PPP.
pppd succède à slip et cslip (compressed slip) qui ne sont plus guère uti-
lisés.
Le protocole PPP est décrit dans la RFC1661 : The Point-to-Point Protocol
(PPP).

5.1.1 Description de PPP : HDLC, LCP, IPCP, CCP


– A la base du protocole, il y a HDLC, High-Level Data Link Protocol (un
standard ISO, utilisé dans X25) qui décrit un format de paquet avec un
checksum.
– PPP peut non seulement véhiculer dans HDLC des paquets IP mais aussi
IPX ou AppleTalk.
– LCP, Link Control Protocol, négocie des options comme MRU (Maximum
Receive Unit), taille maximum du datagram que l’on peut recevoir et
s’occupe s’il y a lieu de l’authentification du client, du serveur ou des
deux par PAP ou CHAP.
– Un Network Control Protocol (NCP) négocie les particularités d’un pro-
tocole. Pour IP, IPCP (RFC1332) négocie les adresses IP assignées de part
et d’autre.
– IPCP peut faire de la compression par le Compression Control Protocol
(CCP)
– CCP comporte :
– le Van Jacobson header compression (VJ compression) des headers des
paquets TCP (module slhc.o)
– la compression des paquets par la méthode BSD qui utilise l’algorithme
LZW (licence Unisys comme gif) identique à la commande compress de
Unix (module bsd comp.o )

67
68 CHAPITRE 5. PPP

– la compression des paquets par la méthode Deflate : c’est la même


méthode que celle de gzip. Elle est recommandée.
La compression consomme de la mémoire. Le serveur peut ne pas la
prévoir, auquel cas la demande de compression du client sera non satisfaite.
Les deux parties doivent utiliser le même algorithme. La compression dans
PPP est plus performante si elle est bien paramétrée que la compression
faite dans le modem (V.42).
Le logiciel pppd a un fonctionnement symétrique, il joue le rôle de serveur
comme de client. Les fichiers de configuration servent à la fois comme serveur et
comme client. Il n’y a pas en principe de différence entre le client et le serveur.
Une machine Linux peut être client, serveur ou les deux à la fois. Pour la clarté,
la distinction est préférable. Dans les documents le terme ”peer” désigne l’autre
partenaire.
Sur Linux, ppp est en deux parties, l’une dans le noyau (traitement de
HDLC) et l’autre sous forme du daemon pppd

5.1.2 Documentation
– PPP-HOWTO : lynx /usr/doc/HOWTO/PPP-HOWTO.html
– zmore /usr/doc/ppp/README.linux.gz
– The Linux Network Administrator’s Guide
– PPP-FAQ : zmore /usr/doc/ppp/FAQ.gz
– man pppd

5.2 Installation de PPP


5.2.1 Support de PPP par le noyau
Le noyau doit être compilé avec le support PPP.

PPP (point-to-point protocol) support (CONFIG_PPP) [M/n/y/?]


PPP support for async serial ports (CONFIG_PPP_ASYNC) [M/n/y/?]
PPP Deflate compression (CONFIG_PPP_DEFLATE) [M/n/y/?]
PPP BSD-Compress compression (PPP BSD-Compress compression) [M/n/y/?]

Pour un usage intermittent c’est très bien de mettre PPP en module. Pour
un serveur d’accès Internet qui fait beaucoup de PPP on le mettra dans le noyau.
A partir du noyau 2.4 d’autres paramètres sont optionnels. Il faut sélectionner
CONFIG PPP ASYNC. Quand le noyau a le support PPP ou quand le module est
chargé, les messages suivants apparaissent dans le log (cf dmesg)

CSLIP: code copyright 1989 Regents of the University of California


PPP generic driver version 2.4.1

les modules chargés sont les suivants :

Sequence Module Description


1 slhc VJ header compression
2 ppp_generic PPP driver
3 ppp_async PPP sur ligne asynchrone
4 bsd_comp BSD compression for PPP’s compression protocol.
5.2. INSTALLATION DE PPP 69

5.2.2 Logiciel ppp-2.3.5-2


Fourni en package. En Debian, on charge les packages :
– ppp : (obligatoire) daemon pppd, fichiers de config, chat, pon, poff, plog.
– ppp-pam : utile pour un serveur
– pppconfig : utile pour un client
– pppupd : sert à maintenir une connexion active (optionnel)
Attention on ne peut utiliser une vieille version de ppp avec un noyau récent
et réciproquement.
Compilation (si nécessaire) :

./configure
make USE_MS_DNS=1

L’option USE MS DNS=1 demande le support dans LCP des DNS tags utilisés
par Microsoft pour passer les noms des serveurs DNS. C’est important pour un
serveur qui aurait des machines Windows comme clients.

5.2.3 mgetty
Nécessaire uniquement pour un serveur.

5.2.4 Arborescence des fichiers PPP


ls -lR /etc/ppp
-rw------- 1 root root 78 Jun 19 1998 chap-secrets
-rwxr-xr-x 1 root root 1454 Jun 19 1998 ip-down
drwxr-xr-x 2 root root 1024 Jun 19 1998 ip-down.d
-rwxr-xr-x 1 root root 1452 Jun 19 1998 ip-up
drwxr-xr-x 2 root root 1024 Jun 19 1998 ip-up.d
-rw-r--r-- 1 root root 85 Jun 19 1998 no_ppp_on_boot
-rw-r--r-- 1 root root 10025 Apr 13 19:36 options
-rw-r--r-- 1 root root 647 Apr 13 10:00 options.ttyXX
-rw------- 1 root root 1554 Jan 25 03:56 pap-secrets
drwxr-s--- 2 root dip 1024 Apr 14 03:06 peers

ppp/peers:
total 7
-rw-r----- 1 root dip 530 Apr 13 21:14 provider

ls -lR /etc/chatscripts
-rw-r----- 1 root dip 200 Apr 13 17:40 provider

ls -l /etc/init.d/ppp
-rwxr-xr-x 1 root root 649 May 26 1998 /etc/init.d/ppp
70 CHAPITRE 5. PPP

5.3 Configuration du modem et du port série.


5.3.1 Configuration du port série.
Repérer sur quel port il est branché. Vérifier que l’IRQ affectée au port n’est
pas partagée par un autre périphérique.
cat /proc/interrupts
0: 150843 timer
1: 3265 keyboard
2: 0 cascade
5: 14491 + serial
8: 2 + rtc
10: 2 3c509
13: 1 math error
14: 42598 + ide0

zoroastre:/u1/morel# setserial -a /dev/ttyS0


/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
Baud_base: 115200, close_delay: 50, divisor: 0
closing_wait: 3000, closing_wait2: infinte
Flags: spd_normal skip_test session_lockout

Pour changer l’IRQ d’un port série il faut aller modifier les switchs sur la
carte série et utiliser setserial sous root. Exemple :
setserial /dev/ttyS2 irq 5
Mais les cartes mère modernes ont deux ports série configurables via le Setup
du BIOS.

5.3.2 Configuration du modem


Branchez le modem sur un port avec UART 16550A pour avoir de bonnes
performances.
Ne prenez pas de carte modem mais toujours un modem externe.
Lancez sous root : minicom -s configurer le nom du port série par Ctrl-A
O et "Serial port setup"
et sauvez par "Save setup as dfl".
Tester le modem :
– ATZ : réinitialisation - répond OK
– AT&V : Vérifier les options du modem. Il faut avoir (en commande Hayes
standard) :
– E1 echo ON (nécessaire pour chat)
– Q0 Envoie les result codes (nécessaire pour chat)
– S0=0 Auto Answer OFF (sauf si vous voulez que le modem décroche.
mgetty est capable de décrocher au bout de n sonneries)
– &C1 Carrier Detect ON only after connect
– &S0 Data Set Ready (DSR) always ON
– hardware flow control : RTS/CTS
5.4. PREMIERS PAS AVEC PPP 71

Si la configuration d’usine n’est pas convenable on peut la modifier dans


la NVRAM du modem ou bien passer les commandes AT nécessaires dans
le chat-script à chaque connexion.
– Connectez vous au serveur par ATDT<numéro de téléphone>. Noter exac-
tement toutes les réponses du serveur, en particulier les questions qui de-
mandent login et mot de passe. Si le serveur vous envoie du charabia, c’est
qu’il utilise PAP. S’il ne répond pas essayez de taper sur la touche Entrée.
Commandes Minicom
– Ctrl-A X : sortie de Minicom avec réinitialisation du modem
– Ctrl-A Q : sortie de Minicom sans réinitialisation du modem
– Ctrl-A O : configuration de Minicom
– Ctrl-A Z : menu d’aide

5.4 Premiers pas avec PPP


5.4.1 Session PPP manuelle
Pour sentir ce qu’est PPP et le tester, on peut faire une connexion ”à la
main” entre deux machines. On suppose que le serveur et le client ne demande
pas d’authentification (pas de auth dans /etc/ppp/options de part et d’autre.)
L’interface série utilisé ici est ttyS0.
1. Sur le client passez root. Configurez l’interface réseau lo et le résolveur
d’adresses dans /etc/resolv.conf
2. Appelez minicom, sélectionnez ttyS0 par Ctrl-A O et Serial port setup
. Connectez-vous au serveur par ATDT<numéro de téléphone>.
3. Supposant que sur le serveur le modem est contrôlé par getty, loggez vous
par login, password
4. Un shell est lancé.
5. Lancez PPP sur le serveur par :
exec /usr/sbin/pppd -detach
exec fait que pppd va remplacer le programme qui le lance, ici le shell.
-detach démarre pppd mais ne le met pas en background de sorte qu’à
l’arrêt de pppd il ne reste pas de processus en attente.
6. Sortez de minicom par Ctrl-A Q. Le modem n’est pas réinitialisé.
7. Lancez pppd sur le client par :
pppd -d -detach /dev/ttyS0 38400 defaultroute &
Les voyants TD, RD modem devraient clignoter.
8. Faites ifconfig. Vous devez voir apparaı̂tre l’interface réseau ppp0. Sinon,
il y a quelque chose qui cloche. Sur la ligne :
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0
inet addr : est l’adresse IP qui est attribuée au client, P-t-P : est
l’adresse du serveur.
9. Testez le routage par route -n. L’interface ppp0 doit apparaı̂tre deux fois,
une fois comme HOST (Flag H), une fois comme route par défaut. Si elle
n’apparaı̂t pas, vous ne pourrez pas contacter par le lien PPP d’autres
machine que le serveur PPP.
72 CHAPITRE 5. PPP

10. Faites un ping au serveur.


11. Faites un ping sur une autre machine sur Internet.
12. Faites ppp-off pour tuer pppd sur le client (cf /usr/doc/ppp/examples/ppp-off).
13. Le modem doit s’arrêter.
14. Sinon, appeler votre logiciel de communication (minicom -o) et envoyez
+++ suivi de ATH0
15. Au besoin enlevez le fichier lock par rm -f /var/lock/LCK..ttySx

5.4.2 Automatisation de pppd


La même chose peut être faite ainsi :
– sur le serveur : On crée un login ppp dans /etc/passwd avec pour shell
/etc/ppp/pppstart qui ressemble à :
#!/bin/sh
exec /usr/sbin/pppd -detach
– sur le client :
pppd connect ’chat -v "" ATDT5551212 CONNECT "" ogin: ppp word: whitewater’ \
/dev/ttyS0 38400 debug crtscts modem defaultroute
pppd ne peut gérer de script de conversation avec le modem. Pour cela il
passe la main par connect à chat qui est fourni avec ppp.
L’option -v comme verbose va copier dans syslog toute la conversation.
La conversation est notée sous la forme de couples ”expect” ”send”, séparés
par des blancs. Ainsi :
– au départ, on n’attend rien, d’où ””
– on envoie la commande de numérotation ATDT5551212 pour appeler le
serveur
– le modem doit répondre CONNECT
– on ne lui répond rien ””
– on attend qu’il envoie la chaı̂ne ogin : (le l est omis de sorte que ce peut
être Login ou login)
– on envoie le nom d’utilisateur ppp
– on attend le message Password par word :
– on envoie le password whitewater
Ce type de commande est dangereux car par la commande ps quelqu’un
pourrait découvrir notre login et password. Aussi on écrit ce dialogue dans un
fichier à accès réservé, accessible uniquement par root et on le référence par
chat -v -f fichier
On peut se reporter aussi au script /usr/doc/ppp/examples/ppp-on .
Les options de pppd sont prises d’abord dans le fichier /etc/ppp/options
accessible uniquement par root, ensuite sur la ligne de commande et dans le
fichier $HOME/.ppprc
Une manière très commode d’appeler pppd comme client est :
pppd call isp
où isp est le nom d’un Internet Service Provider. Le fichier /etc/ppp/peers/isp
est créé par l’administrateur avec comme contenu des options à pppd du genre :
ttyS0 38400 crtscts
connect ’/usr/sbin/chat -v -f /etc/ppp/chat-isp’
noauth
5.4. PREMIERS PAS AVEC PPP 73

Le fichier /etc/ppp/chat-isp contient le dialogue de chat du type ;

ABORT "NO CARRIER"


ABORT "NO DIALTONE"
ABORT "ERROR"
ABORT "NO ANSWER"
ABORT "BUSY"
ABORT "Username/Password Incorrect"
"" "at"
OK "at&d0&c1"
OK "atdt2468135"
"name:" "^Umyuserid"
"word:" "\qmypassword"
"ispts" "\q^Uppp"
"~-^Uppp-~"

1. Lignes ABORT :
On peut prévoir le comportement de notre connexion en cas d’incident. Si
le modem envoie ”NO CARRIER” l’action ABORT est lancée.
2. Ligne TIMEOUT : On peut changer le TIMEOUT qui est de 45 secondes
par défaut.
3. Autres lignes : Elles sont formées de deux chaı̂nes de caractères :
"attendue" "envoyée"
séparées par des blancs. Il suffit que la chaı̂ne ”attendue” concorde avec
la réponse effective du modem pour que le client réponde par la chaı̂ne
”envoyée”.
Toutes les réponses possibles du modem doivent être prévues y compris
CONNECT qui n’est pas indiqué dans l’exemple précédent.
On peut prévoir une action conditionnelle par exemple si on ne reçoit pas
le prompt de login :
ogin:--ogin: ppp ssword: hello2u2
un carriage return est envoyé et on attend à nouveau ogin :
On peut envoyer des commandes d’initialisation du modem, ainsi
"at&d0&c1"
\q évite que le password soit écrit dans le fichier log
Ce dialogue dépend évidemment du serveur. En particulier si pppd du ser-
veur réclame une authentification par PAP ou CHAP, il ne faut pas faire de
dialogue login, passord, sinon on reste bloqué.

5.4.3 Authentification
L’authentification peut se faire de plusieurs manières :
1. en dehors de pppd dans un ”chat-script”. C’est alors un simple login sur
une machine distante (voir exemple plus haut). L’inconvénient est que
chaque utilisateur doit se configurer un chat-script.
74 CHAPITRE 5. PPP

2. par PAP (Password Authentification Protocol) : L’administrateur remplit


le fichier /etc/ppp/pap-secrets avec un triplet, suivi ou non d’adresses
IP :
client serveur secret adresses-IP
client et serveur sont, en principe, des noms de machines, secret est
une sorte de password, les adresses IP sont optionnelles. Exemples :
dupond helios ztru45y6p *
durant helios "*" -
dupond se connecte sur helios avec le password ztru45y6p, il peut avoir
n’importe quelle adresse IP. durant est interdit de connexion sur helios
(- signifie pas d’adresse IP).
3. par CHAP (Challenge Handshake Authentication Protocol) : Se fait de
la même manière dans le fichier /etc/ppp/chap-secrets. L’avantage de
CHAP est que secret ne circule pas en clair sur la ligne et que l’authentifi-
cation est redemandée périodiquement durant la session. C’est donc plus
sûr que PAP. Mais il faut s’assurer de l’interopérabilité avec les machines
Microsoft.
Normalement, on demandera sur le serveur à pppd de réclamer l’authentifi-
cation en plaçant l’option auth dans le fichier /etc/ppp/options.
L’authentification est prévue pour être symétrique. Un serveur demande nor-
malement au client de s’authentifier. Mais il peut refuser d’avoir à s’authentifier
auprès du client. Dans ce cas l’administrateur du client doit mettre dans le
fichier /etc/ppp/peers/isp l’option noauth.
L’important à noter est que PPP n’authentifie pas un individu mais une ma-
chine qui, c’est le cas de Linux, peut avoir plusieurs utilisateurs. Pour cette au-
thentification de machine on peut utiliser la base de données des userids/passwords
Unix. Donc pour authentifier une machine on le fera sous un userid d’utilisateur.
D’où dans /etc/ppp/pap-secrets un hostname client qu’on remplace par un
username.

5.5 Configuration d’un client


5.5.1 Information à réunir sur le fournisseur d’accès In-
ternet (ISP)
– son numéro de téléphone
– adresse IP d’au moins un serveur de nom (DNS) : alors que pour une
connexion depuis un Windows ces paramètres sont communiqués en début
de connexion ppp, pour Linux ces adresses ainsi que le nom de domaine
sont à écrire à la main dans /etc/resolv.conf
– le serveur utilise t’il l’authentification PAP ou CHAP ? Dans ces deux cas
il doit vous fournir un ”id” (nom d’utilisateur) et un ”secret” (mot de
passe)
– le serveur démarre t’il automatiquement ppp (c’est le cas général) ou bien
faut-il passer une commande sur le serveur pour démarrer ppp ? Dans ce
dernier cas, on doit vous fournir un nom d’utilisateur, un mot de passe et
le nom de cette commande de démarrage (éventuellement) ou un script de
démarrage
5.5. CONFIGURATION D’UN CLIENT 75

– le serveur vous attribue t’il l’adresse IP dynamiquement ? Sinon l’ISP doit


vous en donner une.

5.5.2 Résolution d’adresse


Mettre à jour le fichier /etc/resolv.conf

search <nom du réseau du provider>


nameserver <adresse IP du nameserver du provider>

et le fichier /etc/host.conf

order hosts,bind
multi on

5.5.3 Paramétrage PPP


En Debian on peut configurer PPP par pppconfig sous root, en RedHat par
control-panel ou linuxconf. Ici on fera à la main ce qui est plus pédagogique.
On appellera pppd par pon provider qui exécute pppd call provider où
provider est un nom qui peut être changé. L’option call provider fait que
pppd lit le fichier d’options /etc/ppp/peers/provider
Toujours en Debian, le script /etc/init.d/ppp est prévu pour démarrer
la connexion vers un serveur, à condition que le fichier /etc/ppp/ppp on boot
existe. Le script passe la commande pppd call provider
Dans le cas suivant (bidon), le provider est un linux que nous gérons, il fait
l’authentification par PAP :
– numéro de téléphone : 03 88 11 63 35
– nom d’utilisateur : dupond
– password : hzkd0h3
– le serveur attribue l’adresse IP du client.
– nom du domaine et adresses IP des serveurs DNS : ...

Le fichier /etc/ppp/options
Le premier fichier d’options pris en compte par pppd est /etc/ppp/options.
Il n’est accessible que par l’administrateur. Il contient des choses minimales
comme :

asyncmap 0
auth
crtscts
lock
modem
lcp-echo-interval 30
lcp-echo-failure 4

mais pas de proxyarp. crtscts signifie contrôle de flux hardware sur le port
série.
– crtscts contrôle de flux hardware sur le port série (il faut le positionner
aussi sur le modem)
– auth demande au partenaire (peer) de s’authentifier
76 CHAPITRE 5. PPP

– asyncmap 0 pas de séquence d’échappement pour caractères de contrôles


– lock utilisation d’un lock uucp (fichier /var/lock/LCK..ttySx) pour si-
gnaler aux autres logiciels que le modem est occupé

Le fichier /etc/ppp/peers/provider
L’option call provider de pppd fait prendre en compte ensuite un fichier
provider (ce nom est quelconque) dans /etc/ppp/peers. L’administrateur
l’édite en prenant soin de conserver la version originale en provider.old

# Please customize them correctly. Only the "provider" file will


# be handled by poff and pon.
# debug est recommandé pour le démarrage: voir fichier /var/log/ppp.log
debug
# You usually need this if there is no PAP authentication
# moi, pppd client, je ne demande pas au peer (le serveur) de s’authentifier
noauth
# authentification PAP la ligne "id", "secret" à prendre en compte dans
# /etc/ppp/pap-secret commence par dupond
name dupond
# The chatscript (be sure to edit that file too)
# ce chatscript contient la conversation qui va avoir lieu entre pppd et
# le modem entre autre le numéro à appeler par ATDT
connect "/usr/sbin/chat -v -f /etc/chatscripts/provider"
# Routing : le routage IP se fera via le serveur PPP
defaultroute
# Default Modem (you better replace this with /dev/ttySx!)
# faire un lien symbolique du type ln -s /dev/ttyS1 /dev/modem
/dev/modem
# Speed
38400
# Keep Modem up even if connection fails
persist

Vous pouvez prévoir des directives d’authentification (auth, +pap, ...) mais
comme client ce n’est pas du tout recommandé (il faut que le serveur sache
s’identifier). Cependant votre configuration peut être à la fois client et serveur.
Adaptez le fichier : /etc/chatscripts/provider
ABORT BUSY
ABORT "NO CARRIER"
ABORT VOICE
ABORT "NO DIALTONE"
"" ATDT0388116335
CONNECT ’’
Si l’authentification ne se fait pas par PAP/CHAP il faut ajouter après
CONNECT des lignes du genre :
"ogin:" dupond
"assword:" hzkd0h3
5.5. CONFIGURATION D’UN CLIENT 77

Mais attention, en PAP ou CHAP, il ne faut pas mettre ces deux lignes : ça
vous bloque.

Le fichier /etc/ppp/pap-secrets
En authentification PAP, on édite le fichier /etc/ppp/pap-secrets :

dupond * hzkd0h3

La directive name dupond doit être présente dans le fichier /etc/ppp/peers/provider

5.5.4 Test de pppd


Appel de pppd en Debian : Tout utilisateur du groupe dip (comme dial IP)
pourra faire :
– pon provider : lancement réseau par PPP
– poff provider : arrêt réseau PPP
– plog : examen du fichier log
Test PPP :
– On lance ppp par pon provider
– On surveille le log par tail -f /var/log/ppp.log
– Si le support PPP du noyau est en module, vérifier par lsmod qu’il est
bien chargé.
Exemple :

lsmod
Module Pages Used by
ppp 5 0 (autoclean)
slhc 2 [ppp] 0 (autoclean)
serial 8 2 (autoclean)
nfs 12 4
3c509 2 1

Faire ensuite ifconfig puis netstat -r. On n’a pas à faire de

route add default adresse-routeur

On doit avoir quelque chose du genre :

[morel@phoebus morel]$ ifconfig


lo Link encap:Local Loopback
inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1
RX packets:66 errors:0 dropped:0 overruns:0 frame:0
TX packets:66 errors:0 dropped:0 overruns:0 carrier:0
Collisions:0

ppp0 Link encap:Point-to-Point Protocol


inet addr:193.54.230.101 P-t-P:193.54.230.20 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:1500 Metric:1
RX packets:7 errors:1 dropped:1 overruns:0 frame:0
TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
78 CHAPITRE 5. PPP

Collisions:0
Memory:9b3038-9b3c04

[morel@phoebus morel]$netstat -r

Kernel IP routing table


Destination Gateway Genmask Flags MSS Window irtt Iface
zoroastre.c-str * 255.255.255.255 UH 1500 0 0 ppp0
127.0.0.0 * 255.0.0.0 U 3584 0 0 lo
default zoroastre.c-str 0.0.0.0 UG 1500 0 0 ppp0

Si ça ne marche pas :


– Examiner le log (ajoutez l’option debug)
– Relire PPP-HOWTO

Causes d’incidents :
– le modem ne répond pas : tester avec minicom. Cause possible : erreur de
port ttySxx
– on ne peut lancer pppd que depuis root : mettez le userid dans le groupe
autorisé à exécuter /usr/sbin/pppd (dip en Debian).
– on est en PAP et le chatscript comporte une identification par login d’où
blocage
– on est en PAP et ”id secret” n’est pas bien spécifié (oubli de l’option name)
– Diagnostic ”Serial line loopback” dans le log : oubli d’une réponse du
modem dans le chat-script, CONNECT par exemple.
– on accède au serveur mais pas à d’autres machines d’Internet. Causes :
– oubli de defaultroute sur le client ou de proxyarp sur le serveur.
– dans netstat -r la ligne default n’indique pas le serveur PPP
– on a une carte Ethernet et on a laissé l’initialisation de eth0 qui prévoit
le routage par eth0. Faire ifconfig eth0 down
– pppd s’arrête à son démarrage par mgetty. Cause possible : erreur dans
un fichier de configuration, par exemple pap-secrets. Tester par :
pppd dryrun
dryrun fait écrire les options dans /var/log/messages et arrête pppd

5.6 Configuration d’un serveur


5.6.1 Installation
pppd est appelé par mgetty qui écoute le port série et sait reconnaı̂tre un
appel PPP.

Configuration du noyau
Il faut prévoir :
– le support PPP dans le noyau ou en module
– IP forwarding/gatewaying pour servir de routeur pour les machines connectées
par PPP
5.6. CONFIGURATION D’UN SERVEUR 79

Installation de mgetty
On peut lancer directement pppd sur un port série, mais il est préférable
de le faire à travers mgetty. Cela permet d’utiliser le modem pour autre chose
(connexion distante en mode terminal par minicom, kermit, etc ou de recevoir
des fax). mgetty sait reconnaı̂tre le type d’appel et appeler le service adéquat.
Il faut au moins mgetty Version 1.1.18-1. mgetty doit être compilé avec
l’option -DAUTO PPP c’est à dire reconnaissance automatique de PPP. C’est
nécessaire pour les clients Microsoft Wxx.
On met mgetty à l’écoute d’un port série en ajoutant dans /etc/inittab
une ligne :

S1:2345:respawn:/sbin/mgetty -x0 -n 7 ttyS1

En Debian, il suffit de décommenter une ligne.


– x0 signifie niveau de debug 0 (pas de debug)
– n 7 signifie le modem décroche la ligne à la 7ème sonnerie
On met à jour init par telinit q.

Contrôle de mgetty mgetty est capable de reconnaı̂tre un type d’appel (voix,


fax, ppp, data). Quand mgetty reconnaı̂t un appel PPP, il faut préciser comment
mgetty doit appeler pppd. On l’indique dans /etc/mgetty/login.config, par
exemple :

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

a ppp est le nom sous lequel pppd apparaı̂tra dans la commande w.


On peut configurer des options dans /etc/mgetty.config, par exemple pour
un port :

port ttyS0
speed 28800
toggle-dtr n
debug 9
data-only y

Les fichiers logs se trouvent en /var/log/mgetty/


Si la ligne téléphonique est aussi utilisée pour la voix, on peut empêcher
mgetty/ de décrocher en créant un fichier /etc/nologin.ttyxx Ainsi on peut
mettre dans /etc/crontab :

# Contr^
ole modem sur ma ligne téléphonique
# modem inaccessible du lundi au vendredi de 9h à 19h
0 9 * * 1-5 root /usr/bin/touch /etc/nologin.ttyS1
0 19 * * 1-5 root /bin/rm /etc/nologin.ttyS1
# sauf les jours fériés
1 9 1 1 * root /bin/rm /etc/nologin.ttyS1
1 9 1 5 * root /bin/rm /etc/nologin.ttyS1
1 9 8 5 * root /bin/rm /etc/nologin.ttyS1
1 9 14 7 * root /bin/rm /etc/nologin.ttyS1
1 9 11 11 * root /bin/rm /etc/nologin.ttyS1
80 CHAPITRE 5. PPP

Installation de pppd
Il faut avoir au moins pppd 2.2.0f-4 pour pouvoir transmettre aux clients
Microsoft les adresses de DNS par LCP. C’est le cas en Debian.

Compilation de pppd
Si on doit compiler, il faut faire :

make -DDNS HAS_SHADOW=1

– -DDNS pour configurer les adresses DNS sur les clients Windows
– HAS SHADOW=1 si vous avez les shadow passwords sur le serveur.

Configuration de pppd
Le fichier /etc/options pour un serveur : Exemple :

auth
-chap
+pap
login
debug
asyncmap 0
lock
modem
crtscts
proxyarp
netmask 255.255.255.0
ms-dns 193.54.230.20
ms-dns 193.54.211.65
ms-wins 193.54.230.20
noipx
lcp-echo-interval 30
lcp-echo-failure 4

Options courantes pour modem :


– asyncmap 0 : pas d’échappement pour des caractères de contrôle
– lock : lock à la UUCP (pour réserver le port série pour pppd)
– crtscts : contrôle de flux hardware sur le port série
– modem : utilise les modem control lines (CD et DTR)
Options d’authentification :
– auth : authentification du client demandée
– -chap : pas d’authentification CHAP
– +pap : authentification PAP
– login : les userids/passwords Unix sont utilisés pour l’authentification
Options IP :
– proxyarp : le serveur attribue son adresse Ethernet au client PPP. L’oubli
de cette option fera que le client ne peut pas communiquer avec d’autre
machine que le serveur. L’option defaultroute ne se met pas pour un
serveur.
5.6. CONFIGURATION D’UN SERVEUR 81

– netmask 255.255.255.0
– 193.54.230.20 :193.54.230.101 (adresse locale :adresse distante)
Options Microsoft :
– ms-dns 193.54.230.20 : communique l’adresse IP d’un serveur DNS
– ms-wins 193.54.230.20 : communique l’adresse IP d’un serveur WINS
Options de gestion du lien :
– lcp-echo-interval 30 : envoie une demande d’écho si aucun paquet n’a été
reçu depuis 30 secondes pour vérifier si le partenaire est toujours là
– lcp-echo-failure 4 : si au bout de 4 demandes d’écho, le partenaire ne
répond pas, on le suppose mort.

5.6.2 Affectation dynamique des adresses IP :


Quand le serveur a plusieurs modems, on n’indique pas l’adresse IP du client
dans /etc/ppp/options mais dans un fichier spécifique au port :
Fichier /etc/ppp/options.ttyS0

/dev/ttyS0
193.54.230.20:193.54.230.100

La syntaxe est :

adresse IP locale: adresse IP distante

Fichier /etc/ppp/options.ttyS1

/dev/ttyS1
193.54.230.20:193.54.230.101

5.6.3 Fichier /etc/ppp/pap-secrets sur un serveur :


# Every regular user can use PPP and has to use passwords from /etc/passwd
* zoroastre "" *
# UserIDs that cannot use PPP at all. Check your /etc/passwd and add any
# other accounts that should not be able to use pppd!
root zoroastre "*" -

S’il y a un - pour l’adresse IP c’est qu’aucune est accordée.


Si on utilise les passwords Unix pour authentifier (options auth +pap login)
on peut même supprimer le fichier /etc/ppp/pap-secrets

5.6.4 Login d’un utilisateur PPP


Si un utilisateur ne fait que du PPP, on peut lui affecter un shell comme
/bin/false. Il ne fera rien d’autre que du pppd sur le serveur. Son entrée dans
/etc/passwd sera du type :

dupond:x:1234:1234:Dupond Jean:/tmp:/bin/false
82 CHAPITRE 5. PPP

5.6.5 Log d’une session PPP sur le serveur :


Dans /var/log/messages

Connexion d’un Mac Intosh:

Apr 17 16:40:39 zoroastre pppd[14629]: pppd 2.3.5 started by a_ppp, uid 0


Apr 17 16:40:39 zoroastre pppd[14629]: Using interface ppp1
Apr 17 16:40:39 zoroastre pppd[14629]: Connect: ppp1 <--> /dev/ttyS0
Apr 17 16:40:42 zoroastre pppd[14629]: user emrs logged in
Apr 17 16:40:42 zoroastre pppd[14629]: found interface eth0 for proxy arp
Apr 17 16:40:42 zoroastre pppd[14629]: local IP address 193.54.230.20
Apr 17 16:40:42 zoroastre pppd[14629]: remote IP address 193.54.230.100
Apr 17 16:45:35 zoroastre pppd[14629]: Hangup (SIGHUP)
Apr 17 16:45:35 zoroastre pppd[14629]: Modem hangup
Apr 17 16:45:36 zoroastre pppd[14629]: Connection terminated.
Apr 17 16:45:36 zoroastre pppd[14629]: Exit.

Connexion d’une machine Windows 98:

Apr 17 13:06:01 zoroastre pppd[7110]: pppd 2.3.5 started by a_ppp, uid 0


Apr 17 13:06:01 zoroastre pppd[7110]: Using interface ppp1
Apr 17 13:06:01 zoroastre pppd[7110]: Connect: ppp1 <--> /dev/ttyS0
Apr 17 13:06:05 zoroastre pppd[7110]: user vnc logged in
Apr 17 13:06:05 zoroastre pppd[7110]: found interface eth0 for proxy arp
Apr 17 13:06:05 zoroastre pppd[7110]: local IP address 193.54.230.20
Apr 17 13:06:05 zoroastre pppd[7110]: remote IP address 193.54.230.100
Apr 17 13:06:05 zoroastre pppd[7110]: CCP terminated by peer
Apr 17 13:06:05 zoroastre pppd[7110]: Compression disabled by peer.
Apr 17 13:12:39 zoroastre pppd[7110]: LCP terminated by peer
Apr 17 13:12:40 zoroastre pppd[7110]: Hangup (SIGHUP)
Apr 17 13:12:40 zoroastre pppd[7110]: Modem hangup
Apr 17 13:12:40 zoroastre pppd[7110]: Connection terminated.
Apr 17 13:12:41 zoroastre pppd[7110]: Exit.

Dans /var/log/ppp.log avec l’option debug : le dialogue LCP, IPCP, PAP


apparaı̂t. La session normale ci-dessous permet de repérer dans une connexion
défaillante où se situe le problème.

Apr 19 17:50:09 zoroastre pppd[21784]: pppd 2.3.5 started by a_ppp, uid 0


Apr 19 17:50:09 zoroastre pppd[21784]: Using interface ppp1
Apr 19 17:50:09 zoroastre pppd[21784]: Connect: ppp1 <--> /dev/ttyS0
Apr 19 17:50:09 zoroastre pppd[21784]: sent [LCP ConfReq id=0x1 <asyncmap 0x0> <
auth pap> <magic 0x103ef27> <pcomp> <accomp>]
Apr 19 17:50:09 zoroastre pppd[21784]: rcvd [LCP ConfAck id=0x1 <asyncmap 0x0> <
auth pap> <magic 0x103ef27> <pcomp> <accomp>]
Apr 19 17:50:12 zoroastre pppd[21784]: rcvd [LCP ConfReq id=0x42 <asyncmap 0x0>
<magic 0x2a> <pcomp> <accomp>]
Apr 19 17:50:12 zoroastre pppd[21784]: sent [LCP ConfAck id=0x42 <asyncmap 0x0>
<magic 0x2a> <pcomp> <accomp>]
5.7. RÉGLAGES FINS 83

Apr 19 17:50:12 zoroastre pppd[21784]: sent [LCP EchoReq id=0x0 magic=0x103ef27]


Apr 19 17:50:12 zoroastre pppd[21784]: rcvd [PAP AuthReq id=0x43 user="emrs" pas
sword="xxxxx"]
Apr 19 17:50:12 zoroastre pppd[21784]: user emrs logged in
Apr 19 17:50:16 zoroastre pppd[21784]: sent [PAP AuthAck id=0x43 "Login ok"]
Apr 19 17:50:16 zoroastre pppd[21784]: sent [IPCP ConfReq id=0x1 <addr 193.54.23
0.20> <compress VJ 0f 01>]
Apr 19 17:50:16 zoroastre pppd[21784]: rcvd [LCP EchoRep id=0x0 magic=0x2a]
Apr 19 17:50:16 zoroastre pppd[21784]: rcvd [IPCP ConfReq id=0x44 <compress VJ 0
f 01> <addr 0.0.0.0>]
Apr 19 17:50:16 zoroastre pppd[21784]: sent [IPCP ConfNak id=0x44 <addr 193.54.2
30.100>]
Apr 19 17:50:16 zoroastre pppd[21784]: rcvd [IPCP ConfAck id=0x1 <addr 193.54.23
0.20> <compress VJ 0f 01>]
Apr 19 17:50:16 zoroastre pppd[21784]: rcvd [IPCP ConfReq id=0x45 <compress VJ 0
f 01> <addr 193.54.230.100>]
Apr 19 17:50:16 zoroastre pppd[21784]: sent [IPCP ConfAck id=0x45 <compress VJ 0
f 01> <addr 193.54.230.100>]
Apr 19 17:50:16 zoroastre pppd[21784]: found interface eth0 for proxy arp
Apr 19 17:50:16 zoroastre pppd[21784]: local IP address 193.54.230.20
Apr 19 17:50:16 zoroastre pppd[21784]: remote IP address 193.54.230.100
Apr 19 17:50:42 zoroastre pppd[21784]: sent [LCP EchoReq id=0x1 magic=0x103ef27]
Apr 19 17:50:42 zoroastre pppd[21784]: rcvd [LCP EchoRep id=0x1 magic=0x2a]
Apr 19 17:51:12 zoroastre pppd[21784]: sent [LCP EchoReq id=0x2 magic=0x103ef27]
Apr 19 17:51:12 zoroastre pppd[21784]: rcvd [LCP EchoRep id=0x2 magic=0x2a]
Apr 19 17:58:58 zoroastre pppd[21784]: rcvd [LCP TermReq id=0x46]
Apr 19 17:58:58 zoroastre pppd[21784]: LCP terminated by peer
Apr 19 17:58:58 zoroastre pppd[21784]: sent [LCP TermAck id=0x46]
Apr 19 17:59:01 zoroastre pppd[21784]: Connection terminated.
Apr 19 17:59:01 zoroastre pppd[21784]: Hangup (SIGHUP)
Apr 19 17:59:01 zoroastre pppd[21784]: Exit.

5.7 Réglages fins


– mru (Maximum Receive Unit) . Sa valeur par défaut est 1500. La valeur
minimum est 128. Une valeur de 296 est recommandée pour les liaisons
lentes et un logiciel ligne à ligne. Pour de l’interactif 1500 peut être élevé
(mru 542 ?)
– deflate nr,nt : compression par la méthode deflate (cf gzip) nr et nt
entre 8 et 15
– bsdcomp nr,nt : compression par la méthode BSD (cf compress Unix) nr
et nt entre 9 et 15
– vj-max-slots n : fixe le nombre de connection slots pour la compression
de Van Jacobson des TCP/IP ( n entre 2 et 16).
Il faut tenir compte que la compression prend de la mémoire et que le modem
comprime aussi (V.42). Néammoins la compression peut améliorer le débit.
Je constate que j’ai les meilleures performances avec les options PPP stan-
dards (mru=1500, compression VJ) mais en comprimant les fichiers transférés
84 CHAPITRE 5. PPP

par gzip et/ou en utilisant l’option de compression -C dans ssh (slogin -C


host, scp -C départ arrivée)

5.8 Sécurité
pppd doit être suid root pour pouvoir initialiser l’interface réseau et modifier
la table de routage. Son accès doit être réservé à un groupe d’utilisateurs (dip
en Debian).
Les fichiers de configuration dans /etc/ppp ne doivent être accessibles que
par l’administrateur. De même les fichiers logs.
Sur un serveur l’authentification doit être obligatoire.

5.9 Applications
5.9.1 PPP sur câble null modem
On raccorde les deux machines par un câble série dit null modem, les fils
transmit-receive sont croisés, voir Serial-HOWTO.
Choisissez une machine comme serveur. Installez mgetty sur un port série.
Testez la connectivité par minicom depuis le client. Si problème configurer les
ports avec setserial.
Maintenant il suffit de lancer pppd sur les deux machines, par exemple sur
le port ttyS1 de chacune d’elle par :

pppd -detach crtscts lock <local IP>:<remote IP> /dev/ttyS3 38400 &

On teste par ifconfig et ping que les deux machines communiquent. Mais on
n’a pas de routage. Coupez le lien en tuant l’un des pppd.
Pour router, on suppose qu’une machine a un interface Ethernet connecté
et l’autre non. Sur la machine avec interface Ethernet on fera :

pppd -detach crtscts lock proxyarp <local IP>:<remote IP> /dev/ttyS3 38400 &

et sur l’autre :

pppd -detach crtscts lock defaultroute <local IP>:<remote IP> /dev/ttyS3 38400 &

5.9.2 Relier deux réseaux par PPP


Il faut avoir des adresses IP pour les machines des deux réseaux.

5.9.3 Routage
Si l’un des réseaux est connecté à Internet, on mettra defaultroute côté
client et on définira la machine Linux qui tourne le pppd client comme routeur
par défaut sur les machines du réseau non connecté à Internet.
S’il s’agit juste de connecter deux réseaux on ajoute une commande route
pour chaque réseau par le script /etc/ppp/ip-up. Il faut aussi que chaque
machine des deux réseaux connaisse le routeur.
5.9. APPLICATIONS 85

5.9.4 /etc/ppp/ip-up
Quand pppd a établi le lien il regarde si un script /etc/ppp/ip-up est
exécutable et si oui l’exécute. On peut l’utiliser pour passer une commande
route ou lancer sendmail afin d’envoyer le courier en instance. Exemple :

#!/bin/bash
#
# Script which handles the routing issues as necessary for pppd
# Only the link to Newman requires this handling.
#
# When the ppp link comes up, this script is called with the following
# parameters
# $1 the interface name used by pppd (e.g. ppp3)
# $2 the tty device name
# $3 the tty device speed
# $4 the local IP address for the interface
# $5 the remote IP address
# $6 the parameter specified by the ’ipparam’ option to pppd
#
case "$5" in
# Handle the routing to the Newman Campus server
202.12.126.1)
/sbin/route add -net 202.12.126.0 gw 202.12.126.1
# and flush the mail queue to get their email there asap!
/usr/sbin/sendmail -q &
;;
139.130.177.2)
# Our Internet link
# When the link comes up, start the time server and synchronise to the world
# provided it is not already running
if [ ! -f /var/lock/subsys/xntpd ]; then
/etc/rc.d/init.d/xntpd.init start &
fi
# Start the news server (if not already running)
if [ ! -f /var/lock/subsys/news ]; then
/etc/rc.d/init.d/news start &
fi
;;
203.18.8.104)
# Get the email down to my home machine as soon as the link comes up
# No routing is required as my home Ethernet is handled by IP
# masquerade and proxyarp routing.
/usr/sbin/sendmail -q &
;;
*)
esac
exit 0
86 CHAPITRE 5. PPP

5.10 Client PPP sur Microsoft Wxx


– Démarrer/Programmes/Accessoires/Communication/Accès réseau à dis-
tance
– Double cliquer avec le bouton gauche l’icône ”Nouvelle connexion”
– Entrez un nom pour l’ordinateur appelé
– Suivant
– Numéro de téléphone
– Cliquer la nouvelle icône avec le bouton droit et sélectionner Propriétés
– Onglet : type de serveur
– Type de serveur : PPP Internet Windows NT Serveur et Windows 98
– Options avancées :
– (X) Se connecter à un réseau
– (X) Activer la compression logicielle
– () Demander un mot de passe crypté
– () Demander le cryptage des données
– () Créer un journal pour cette connexion
– Protocoles réseau autorisés
– () NetBeui
– () Compatible IPX/SPX
– (X) TCP/IP
– Cliquer paramètres TCP/IP
– (X) Adresse IP attribuée par serveur
– () Spécifier adresse IP
– (X) Adresses de serveurs de nom attribuées par serveur
– () Spécifier les adresses des serveurs de noms
– (X) Utiliser la compression d’en tête IP
– (X) Utiliser la passerelle par défaut pour le réseau distant

5.11 Divers
– pppupd (package Debian) : veille à maintenir active la liaison PPP.
– diald permet de lancer automatiquement PPP quand une connexion est
demandée.
– EQL permet de coupler deux modems en un seul lien PPP, doublant ainsi
sa capacité.
– Linux supporte des cartes multiports pour connecter une batterie de mo-
dems : Cyclades, Stallion, Comtrol RocketPort... Voir Hardware HowTo
et Serial HowTo
Chapitre 6

Sécurité réseau sur Linux

6.1 Introduction
Ce document donne quelques règles minimales de sécurité pour des machines
Linux connectées sur Internet par une adresse IP fixe et qui ne font pas de
services réseau.
Ce document est provisoire. Toute remarque est bienvenue.
Linux est par nature un serveur réseau sur Internet. La plupart des distri-
butions Linux démarrent des serveurs réseaux sans même que le propriétaire de
la machine, qui croit avoir une simple station de travail, s’en rende compte. Ces
serveurs réseau sont inutilisés, ils prennent du temps CPU, de la mémoire et ce
sont autant de serrures que des pirates peuvent essayer d’ouvrir ou de forcer.
Une fois qu’un pirate a réussi à rentrer sur votre machine, il peut par étapes
successives devenir root, écouter ce qui passe sur le réseau local, s’installer sur
d’autres machines... Même s’il fait ça ”pour le sport”, c’est très gênant. Pas
seulement en raison des dégâts qu’il peut commettre sur la machine visitée, mais
parce que, contrôlant une machine à l’insu de son responsable, le pirate peut
mener à partir de cette machine des actions nuisibles sur le réseau. Par exemple
l’utiliser comme relais de messages publicitaires ou comme base d’attaque contre
d’autres machines.
Toute machine visitée par un pirate doit être entièrement reconfigurée.
Si Linux n’est utilisé que comme poste de travail personnel, il ne joue sur le
réseau qu’un rôle de client, tous les serveurs qui sont activés par les procédures
d’installation des distributions actuelles, sont non seulement inutiles mais sont
dangereux. Il faut les arrêter.

6.2 Arrêter sa machine quand elle n’est pas uti-


lisée
C’est bête, mais efficace quand on ne fait pas de service réseau.
On peut aussi couper la machine du réseau. Mais attention, les prises RJ45
ne sont pas inusables.

87
88 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

6.3 Arrêter les serveurs inutiles


6.3.1 Les daemons
Quels sont les daemons qui tournent ?

On les voit en faisant la liste des process par :

ps auxw|more

Quels sont les daemons qui ont ouvert une socket réseau ?

On passe la commande netstat -tu ou plus explicitement netstat --tcp


--udp

netstat -tu|more
Active Internet connections (including servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 1 0 localhost:printer localhost:851 TIME_WAIT
tcp 0 0 *:smtp *:* LISTEN
...

montre que deux daemons fonctionnent en transport tcp, le serveur d’im-


pression lpd sur le port tcp 515 (printer) et sendmail sur le port tcp 25 pour le
service de mail (smtp). Les numéros de port répertoriés dans /etc/services
sont remplacés par le nom du service.

Contrôle des daemons en RedHat

Les scripts de lancement/arrêt sont en /etc/rc.d/init.d


On peut arrêter manuellement un daemon, sendmail par exemple, sous root
par :

cd /etc/rc.d/init.d
./sendmail stop

Ainsi on arrête le Mail Transfer Agent sendmail.


Pour que cet arrêt soit permanent il faut empêcher le démarrage au boot du
daemon. Il faut d’abord savoir dans quel ”run level” on démarre. En RedHat
c’est 3 (multiuser sans xdm) ou 5 (multiuser avec xdm). Voir dans le fichier
/etc/inittab la ligne initdefault :

# The default runlevel.


id:3:initdefault:

En RedHat on peut, sous root, appeller control-panel & et activer le run-


level editor et corriger les levels 3 ou 5. Ou faire à la main comme en Debian,
mais dans le répertoire /etc/rc.d/rc3.d ou /etc/rc.d/rc5.d
6.3. ARRÊTER LES SERVEURS INUTILES 89

Contrôle des daemons en Debian


Les scripts sont en /etc/init.d le runlevel est 2 par défaut. Le répertoire
/etc/rc2.d contient par exemple :
S10sysklogd@ S20makedev@ S21sendmail@ S99xdm@
S11klogd@ S20mon@ S22ntpdate@
S18portmap@ S20ntop@ S23ntp-server@
S20alsa@ S20postgresql@ S25nfs-server@
S20anacron@ S20rsync@ S89atd@
S20gpm@ S20samba@ S89cron@
S20inetd@ S20ssh@ S91apache-ssl@
S20isdnutils@ S20teapop@ S99fetchmail@
S20linuxconf@ S20xfs@ S99rmnologin@
S20lprng@ S21nfs-common@ S99stop-bootlogd@
S20sendmail@ est un lien symbolique :
/etc/rc2.d/S20sendmail -> ../init.d/sendmail*
vers le script de démarrage. S20 signifie que son rang de démarrage est 20.
Pour l’empêcher de démarrer au niveau 2 on fait sous root :
update-rc.d -f sendmail remove
update-rc.d: /etc/init.d/sendmail exists during rc.d purge (continuing)
Removing any system startup links for /etc/init.d/sendmail ...
/etc/rc0.d/K20sendmail
/etc/rc1.d/K20sendmail
/etc/rc3.d/S20sendmail
/etc/rc4.d/S20sendmail
/etc/rc5.d/S20sendmail
/etc/rc6.d/K20sendmail
On peut créer ces liens par :
update-rc.d sendmail defaults
Adding system startup for /etc/init.d/sendmail ...
/etc/rc0.d/K20sendmail -> ../init.d/sendmail
/etc/rc1.d/K20sendmail -> ../init.d/sendmail
/etc/rc6.d/K20sendmail -> ../init.d/sendmail
/etc/rc2.d/S20sendmail -> ../init.d/sendmail
/etc/rc3.d/S20sendmail -> ../init.d/sendmail
/etc/rc4.d/S20sendmail -> ../init.d/sendmail
/etc/rc5.d/S20sendmail -> ../init.d/sendmail
qui est équivalent à :
update-rc.d sendmail start 20 2 3 4 5 . stop 20 0 1 6 .

Principaux daemons réseau


sendmail
Mail Transfer Agent : reçoit, envoit, route du mail. Arrêter le daemon
sendmail n’empêche pas d’envoyer du courrier. Il empêche d’en recevoir
sur sa machine.
90 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

apache
Serveur http
bind
Domain Name Server : peut être utilisé comme cache ou comme DNS
primaire ou secondaire, sinon inutile.
snmpd
Serveur snmp pour la gestion réseau. Inutile en général
rpc.nfsd
Gère les demandes de répertoires des clients par nfs. Ne le démarrez pas
si vous ne l’utilisez pas.
rpc.mountd
Idem Gère les demandes de clients de monter des répertoires exportés.
Voir fichier /etc/exports
samba
serveur pour machines Microsoft Windows . Si vous l’activez, paramétrez
le dans /etc/smb.conf. Ajouter en particulier :
hosts allow = 193.54.230. 127.
où 193.54.230. est mon réseau local.
sshd
connexion sécurisée à d’autres machines (recommandé)
xdm
connexion X-Windows
xfs
serveur de fontes X
routed
routage Internet, à supprimer. Faites du routage manuel par la commande
route.
whod
ou in.rwhod donne des informations sur les utilisateurs de votre machine.
A proscrire.

6.3.2 Les services activés par inetd


inetd, le super-daemon lance, à la demande du réseau, les daemons confi-
gurés dans le fichier /etc/inetd.conf.
Pour éviter de laisser ouvert des services inutilisés on procédera ainsi :
1. se mettre sous root
2. éditer le fichier /etc/inetd.conf. Chaque service est décrit sur une ligne.
3. Mettre un # de commentaire en tête de chaque ligne correspondant à un
service inutilisé. Vous pouvez ainsi commenter toutes les lignes dont vous
ne connaissez pas la signification. Exemple :
6.3. ARRÊTER LES SERVEURS INUTILES 91

#:BOOT: Tftp service is provided primarily for booting. Most sites


# run this only on machines acting as "boot servers."
#tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /boot
#bootps dgram udp wait root /usr/sbin/bootpd bootpd - i -t 120

4. Envoyez le signal SIGHUP au process inetd par


killall -HUP inetd
Cela l’oblige à relire son fichier de configuration.
En Debian on peut mettre à jour /etc/inetd.conf avec la commande
update-inetd qui envoie après le signal SIGHUP à inetd.
– activation d’un daemon
update-inetd --enable shell
active le serveur rsh
– désactivation d’un daemon
update-inetd --disable shell
désactive le serveur rsh
– ajout d’une entrée
update-inetd --group MAIL --add \
’pop-3\t\tstream\ttcp\tnowait\troot\t/usr/sbin/tcpd\t/usr/sbin/in.pop3d’
ajoute une entrée dans le groupe MAIL indiqué par # :MAIL :
create, remove, enable or disable entry in /etc/inetd.conf envoie un signal
SIGHUP au process inetd format des commentaires dans /etc/inetd.conf :
Services lancés par inetd
echo
service ”trivial” de inetd
chargen
service ”trivial” de inetd (character generator)
daytime
service ”trivial” de inetd (human readable time)
time
service ”trivial” de inetd (machine readable time, in the form of the num-
ber of seconds since midnight, January 1, 1900). Peux servir à synchroniser
l’horloge sur d’autres machines par la commande rdate
telnet
connexion depuis une machine distante (à contrôler ou interdire)
ftp
serveur de fichiers (à contrôler ou interdire)
shell
permet d’exécuter des commandes à distance via rsh (à contrôler).
login
permet la connexion à distance par rlogin (à contrôler ou interdire)
exec
permet d’exécuter des commandes à distance via rexec (à contrôler ou
interdire)
92 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

talk
permet de communiquer en temps réel (peut se prêter à des abus)
ntalk
idem
pop-x
relève de boı̂te aux lettres depuis des machines distantes : à interdire, c’est
dangereux.
imapd
idem
finger
répond à la commande finger. Utile pour avoir des informations sur les uti-
lisateurs de votre machine. Il permet aux pirates de savoir qui est connecté
sur votre machine par finger @votre machine
ident
utile sur un serveur de messagerie, sinon à interdire.
tftp
transfert de fichier archaı̈que. Surtout à interdire
bootps
permet de booter une machine par le réseau. A supprimer.
mountd
permet à une autre machine de monter par mount une partie de votre
disque dur (nfs) . Voir le daemon.
rusersd
répond à la commande rusers pour connaı̂tre les utilisateurs en session
sur votre machine
rstatd
?
saft
serveur de fichiers sendfiled (Simple Asynchronous File Transfer)

6.4 Contrôler l’accès aux serveurs : tcp-wrapper


Si on examine le fichier /etc/inetd.conf, par exemple :

telnet stream tcp nowait root /usr/sbin/tcpd /usr/sbin/in.telnetd


ftp stream tcp nowait root /usr/sbin/tcpd /usr/sbin/ftpd

En se remémorant la syntaxe à l’aide de man inetd.conf, on constate que


le super-daemon inetd n’appelle pas directement le serveur telnet in.telnetd
mais appelle /usr/sbin/tcpd qui appelera sous condition in.telnetd.
tcpd est un tcp-wrapper. Il n’appelle le daemon sollicité par le réseau que
si le demandeur satisfait à certaines conditions qui sont fixées dans les fichiers
/etc/hosts.allow et /etc/hosts.deny. Ces fichiers précisent les conditions
de validité d’un couple (daemon : client) :
6.4. CONTRÔLER L’ACCÈS AUX SERVEURS : TCP-WRAPPER 93

– Si une condition du fichier /etc/hosts.allow est satisfaite, l’accés au


service est autorisé.
– Sinon, si une condition du fichier /etc/hosts.deny est satisfaite, l’accés
est refusé.
– Dans les autres cas l’accès est autorisé.
– Si les deux fichiers sont absents, vides ou ne contiennent que des commen-
taires, l’accès à tous les serveurs contrôlés par tcpd est autorisé.
Syntaxe : man 5 hosts access et man 5 hosts options .
– daemon est le nom du daemon cité dans /etc/inetd.conf. C’est le dernier
élément du chemin absolu. Exemple : in.qpopper pour /usr/sbin/in.qpopper
– client est une liste de noms de domaines ou d’adresses IP séparés par des
blancs ou des virgules
– .u-strasbg.fr désigne toutes les machines dont le nom de domaine se ter-
mine par u-strasbg.fr. N’oubliez pas le point au début.
– 193.54.230. désigne toutes les machines d’adresses IP commençant par
193.54.230. N’oubliez pas le point final.
La règle recommandée est d’interdire tous les accès sauf aux machines spécifiquement
désignées.
Pour cela, le fichier /etc/hosts.deny aura le contenu suivant :

# /etc/hosts.deny: list of hosts that are _not_ allowed to access the system.
# See the manual pages hosts_access(5), hosts_options(5)
# and /usr/doc/netbase/portmapper.txt.gz
#
# Example: ALL: some.host.name, .some.domain
# ALL EXCEPT in.fingerd: other.host.name, .other.domain
#
ALL : ALL

Ce qui signifie tous les services interdits à tous les clients.


Le fichier /etc/hosts.allow aura un contenu du type :

# /etc/hosts.allow: list of hosts that are allowed to access the system.


# See the manual pages hosts_access(5), hosts_options(5)
# and /usr/doc/netbase/portmapper.txt.gz
#
# Example: ALL: LOCAL @some_netgroup
# ALL: .foobar.edu EXCEPT terminalserver.foobar.edu
#
ALL : LOCAL
ALL : 193.54.230.
ALL : physpc4.u-strasbg.fr physpc5.u-strasbg.fr
in.qpopper : .u-strasbg.fr
in.qpopper : 130.79.

– ALL : LOCAL autorise tous les services à toute machine dont le nom de
domaine ne contient pas de ’.’ . Donc une machine du réseau local
– ALL :193.54.230. autorise tous les services à toute machine de ce réseau.
En l’occurrence le réseau local.
94 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

– ALL : physpc4.u-strasbg.fr physpc5.u-strasbg.fr autorise tous les


services à ces deux machines.
– in.qpopper : .u-strasbg.fr autorise l’accès au serveur in.qpopper
aux machines de u-strasbg.fr (noter le point).
– in.qpopper : 130.79. autorise l’accès au serveur in.qpopper aux ma-
chines du réseau de classe B 130.79.0.0 (noter le point).
– imap2 : 130.79.186.0/255.255.255.0 autorise l’accès au serveur imap2
aux machines du sous-réseau réseau 130.79.186.0.
tcpdcheck : contrôle des régles d’accès de /etc/hosts.allow et /etc/hosts.deny :
tcpdchk -v
sort une analyse de chaque règle.
Remarque : Certains serveurs peuvent fonctionner comme daemons indépendants,
c’est à dire ne sont pas lancés par le super-daemon inetd mais sont compilés
avec la librairie tcp-wrapper. On peut alors contrôler leur accès dans les fichiers
/etc/hosts.allow et /etc/hosts.deny. C’est le cas de sendmail en Debian.
tcpdmatch prédit le comportement de tcp-wrapper pour un daemon appelé
par inetd (ou qui est linké comme sendmail avec la librairie /usr/lib/libwrap.a.
Exemple :
$ tcpdmatch in.qpopper 128.64.135.10
client: address 128.64.135.10
server: process in.qpopper
matched: /etc/hosts.allow line 58
access: granted

6.5 Contrôler l’accès à xdm


On peut contrôler l’accès par XDMCP (xdm).
Documentation : faire man xdm
Fichier de configuration : /etc/X11/xdm/Xaccess

#* #any host can get a login window


*.c-strasbourg.fr # toute machine du domaine c-strasbourg.fr peut avoir une fen^
etre
* # toute machine peut avoir une fen^
etre de login

6.6 Les mots de passe


6.6.1 Qualité des mots de passe
Un ”bon” mot de passe a au moins 6 caractères, mélange minuscules et ma-
juscules, chiffres et caractères spéciaux. Il ne doit pas être facilement déductible
d’un dictionnaire.
Un truc mnémotechnique est de prendre une phrase que l’on connaı̂t bien et
de prendre par exemple la première lettre de chaque mot :
Exemple : ”Allons enfants de la Patrie” donnera AedlP comme c’est un peu
court, on ajoute le jour de Gloire AedlPljdG et puis, comme le truc est un peu
connu, on peut ajouter un caractère, par exemple AedlP ;ljdG
6.7. APPLIQUER LES MISES À JOUR DE SÉCURITÉ SUR LES LOGICIELS.95

6.6.2 Shadow passwords


Ils sont implémenté dans les distributions Linux récentes et il faut l’utiliser.
Le fichier /etc/password est lisible par tous. Avec les Shadow passwords,
les mots de passe (cryptés) ne sont plus dans le fichier /etc/password mais
dans /etc/shadow qui lui n’est lisible que par root.

6.7 Appliquer les mises à jour de sécurité sur


les logiciels.
L’art du pirate est de parvenir à rentrer sur une machine sans connaı̂tre de
userid ni de password. S’il connaı̂t un trou de sécuriré d’un logiciel réseau il peut
l’exploiter. Si c’est un débordement incontrôlé d’un buffer il peut arriver à faire
exécuter à votre machine ses propres instructions et en prendre le contrôle. Les
logiciels tournant sur Linux étant très connus, le cas n’est pas rare. Il faut donc
appliquer les corrections de sécurité en particulier sur les serveurs réseaux.
Pour être tenu au courant, consultez le site www du fournisseur de votre
distribution Linux.
Exemple : Security Alert sur la page d’accueil de : http ://www.fr.debian.org/
Ou bien un serveur ftp proche :

ftp://ftp.lip6.fr/pub/linux/distributions/redhat/updates/6.1/i386/
ftp://ftp.lip6.fr/pub/linux/distributions/debian/dists/proposed-updates/

Les ”updates” d’une distribution sont des corrections de bugs et non des
ajouts de nouvelles fonctionnalités.
Les trous de sécurité sont signalés sur la liste “Bugtraq” :

echo "sub bugtraq"|mail -s"" LISTSERV@SECURITYFOCUS.COM

Plus généralement consultez : http ://www.cert.org/

6.8 Détection d’incursions


Différentes commandes permettent de détecter des incursions ou tentatives
d’incursions
– last|more : liste les logins
– ls -l /etc/passwd /etc/group : contrôle de la date de dernière modi-
fication de fichiers sensibles. Si elle indique 3h du matin, on peut s’inter-
roger.
– Inspection du fichier log du tcpwrapper, permet de repérer des incursions
ou des tentatives.
– less /var/log/secure : (RedHat)
– less /var/log/daemon.log (Debian)
– Examen du fichier de login par su
96 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

6.8.1 tripwire : contrôle de l’intégrité des fichiers


Lorsqu’un pirate arrive à s’introduire sur un serveur, une des premières
choses qu’il fera est laisser des programmes en local pour permettre son retour
de manière aussi facile que possible. C’est pourquoi il est intéressant de signer
les fichiers importants, et de vérifier à intervalle régulier qu’ils n’ont pas bougé
(tous les soirs par exemple). Le programme tripwire peut alors vous intéresser.
Tripwire est un outil qui a un seul but : détecter tout changement dans
l’intégrité d’un fichier. Ca signifie qu’il peut de manière non-discutable dire si
un fichier protégé a été altéré par un moyen qui viole les règles déterminées
par l’administrateur réseau. Tripwire peut aussi déterminer si un fichier a été
ajouté ou effacé d’un répertoire protégé. Tripwire a des règles très flexibles et
très puissantes pour définir exactement à quoi il devrait faire attention.
Pour plus d’informations sur Tripwire, allez voir http ://www.tripwiresecurity.com/
Tripwire est un package Debian.

6.9 Précautions élémentaires


– Pas de ’.’ dans le $PATH de root. Faire ./prog pour exécuter un fichier
du répertoire courant.
– Ne jamais faire tar x sous root d’une archive importée de l’extérieur. Un
farceur peut ainsi vous faire écraser votre fichier /etc/passwd
– A l’installation d’un logiciel faites make -n install avant make install
sous root.
– Interdisez l’accès à certains fichiers comme /etc/passwd par ftp. Un ser-
veur comme wu-ftpd-academ permet dans son fichier de configuration
/etc/wu-ftpd-academ/ftpaccess
noretrieve /etc/passwd /etc/group

6.10 Principales attaques réseau et parades


6.10.1 SYN flooding
Description
Attaque qui empêche des utilisateurs légitimes de se connecter. Exemple
d’attaque :

Warning: possible SYN flood from 212.187.226.114 on 193.54.230.20:80.


Sending cookies.

Une attaque par syn-flood permet de perturber le service TCP sur un port
particulier (ici le serveur Web).
En général un ”Syn Flood” est symptomatique d’une attaque par ”déni de
service”. Le principe est simple et basé sur les caractéristiques de TCP. Si une
machine A veut établir une connexion TCP avec une machine B :
1. un SYN est envoyé de A vers B pour initialiser la connexion
2. un SYN/ACK est retourné par B vers A si le service est actif
3. un ACK est envoyé par A vers B pour confirmer à B la demande de
connexion
6.10. PRINCIPALES ATTAQUES RÉSEAU ET PARADES 97

A ce niveau la connexion est considérée comme établie. Point important : la


machine B, depuis l’étape 2, a alloué de la mémoire pour gérer la connexion en
cours jusqu’à l’arrivée d’un ”time out” éventuel si l’étape 3 ne se réalise pas.
Le principe d’une action ”SYN Flood” consiste alors à envoyer une rafale de
SYN, d’allouer ainsi un maximum de mémoire au niveau du serveur, et de ne
jamais répondre au SYN/ACK par le ACK normalement attendu. Le serveur
a alors des difficultés pour répondre aux requêtes ”légitimes” d’où le ”déni de
service”.
Quelques SYN/ACK sans réponse peuvent être apparentés (si on a l’esprit
large) à des pertes de paquets qui concerneraient potentiellement la réponse
ACK de celui qui a initialisé la connexion. Si la fréquence est élevée, il y a sans
doute un problème de sécurité à la clé ...
Tout serveur Web a ce genre de messages régulièrement, sans que cela soit
forcément une attaque.
Détection :

dmesg | grep ’possible SYN flood’ | awk ’{print $6}’ | sort | uniq

Parade
Syn Cookies est une option à la compil du noyau qui permet de se protéger.
CONFIG SYN COOKIES :
Normal TCP/IP networking is open to an attack known as ”SYN flooding”.
This denial-of-service attack prevents legitimate remote users from being able
to connect to your computer during an ongoing attack and requires very little
work from the attacker, who can operate from anywhere on the Internet.
SYN cookies provide protection against this type of attack. If you say Y here,
the TCP/IP stack will use a cryptographic challenge protocol known as ”SYN
cookies” to enable legitimate users to continue to connect, even when your ma-
chine is under attack. There is no need for the legitimate users to change their
TCP/IP software ; SYN cookies work transparently to them. For technical infor-
mation about SYN cookies, check out ftp ://koobera.math.uic.edu/syncookies.html
.
If you are SYN flooded, the source address reported by the kernel is likely
to have been forged by the attacker ; it is only reported as an aid in tracing the
packets to their actual source and should not be taken as absolute truth.
SYN cookies may prevent correct error reporting on clients when the server
is really overloaded. If this happens frequently better turn them off.
If you say Y here, note that SYN cookies aren’t enabled by default ; you can
enable them by saying Y to ”/proc filesystem support” and ”Sysctl support”
below and executing the command

echo 1 >/proc/sys/net/ipv4/tcp_syncookies

at boot time after the proc filesystem has been mounted.


If unsure, say Y.

6.10.2 smurf
Le principe de cette attaque c’est d’émettre les trames avec une adresse
source modifiée. Le propriétaire de cette adresse (et toutes les routes qui y
mènent) se trouvent saturés de réponse à des pings non sollicités. Voir : ftp ://ftp.cert.org/pub/cert advisorie
98 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

6.10.3 Denial of Service (DoS) attacks


En pratique il y a 2 DoS :
– remplir les fichiers de log de la machine cible
– ”couper” la machine cible du monde si le soft est configuré pour bloquer
automatiquement l’accés aux services par rapport à l’adresse IP source
dans le cadre d’un ”stealth scan” ou scan UDP.
Parade
Rajouter l’adresse IP source dans /etc/hosts.deny à partir de tcp wrappers
pour courir moins de risques.

6.10.4 IP spoofing
Ce sont des paquets IP qui arrivent de l’extérieur avec une adresse source
trafiquée (forged), paraissant être une adresse du réseau local.
Parade
Prévue dans /etc/init.d/netbase activé au boot en Debian.
If you turn on IP forwarding, you will also get the rp filter, which automati-
cally rejects incoming packets if the routing table entry for their source address
doesn’t match the network interface they’re arriving on. This has security advan-
tages because it prevents the so-called IP spoofing, however it can pose problems
if you use asymmetric routing (packets from you to a host take a different path
than packets from that host to you) or if you operate a non-routing host which
has several IP addresses on different interfaces. To turn rp filter off use :

echo 0 > /proc/sys/net/ipv4/conf/<device>/rp_filter


or
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

6.10.5 Non-blind spoofing


Using the spoofing to interfer with a connection that sends packets along
your subnet (so generally one of the 2 hosts involved is located on your subnet,
or all data traffic has to be passing your network device,... you might consider
taking a job at some transatlantic route provider).

6.10.6 Blind spoofing


Using the spoofing to interfer with a connection (or creating one), that does
not send packets along your cable.

6.10.7 Scan de ports


Voici les conseils de Guy Brand <bug@chimie.u-strasbg.fr> : Une des premières
choses qu’un pirate fera pour attaquer un serveur est de ”scanner” tous les ports
de ce dit serveur pour voir quels services tournent. Il faut donc trouver une so-
lution pour contrer ce genre d’attaque dès qu’elles arrivent.
Parade
– Portsentry Logge les accès aux ports IP. Quand il détecte certaines ac-
tions peut exécuter automatiquement des parades :
– Renseigne /etc/hosts.deny
6.10. PRINCIPALES ATTAQUES RÉSEAU ET PARADES 99

– Fait des ipchains


– Envoi d’un message au provider de l’attaquant avec les logs de ma ma-
chine (donc heure, date et IP), ce qui est en general assez dissuasif.
– Courtney Courtney vous permet d’écouter tout un réseau local pour les
attaques type Satan (scan de ports). Il écoute le réseau local et identifie les
machines sources d’attaques Satan. Courtney est un script Perl. Il reçoit
des informations de tcpdump et compte le nombre de nouveaux services
que contacte une machine en un temps défini. Si une machine se connecte
à un nombre important de services dans cette période de temps, courtney
identifie cette machine comme un pirate potentiel par attaque SATAN.
Les options de courtney vous permettent de paramétrer un mail sur lequel
vous recenserez toutes les attaques sur votre serveur (ou votre réseau lo-
cal). On peut modifier courtney pour qu’il firewallise les machines pirates
par le biais de ipfwadm. Cette modification est très simple, il suffit de
rajouter à la ligne 1231 :
system("/sbin/ipfwadm -I -a deny -S $host -o");
L’option -o de ipfwadm vous permet de continuer de logguer les connexions
sur le serveur mais de ne pas y répondre. Très utile pour voir si la machine
pirate continue d’attaquer pendant longtemps.
– Sentry
Sentry est un moyen plus radical et plus efficace que courtney pour parer
les attaques de type SATAN. Sentry fait partie du projet Abacus. Le
projet Abacus est une initiative pour mettre à disposition à la communauté
Internet des logiciels de détection d’intrusion qui soient génériques, stables,
et qui demandent peu en maintenance. Sentry a un nombre d’options pour
détecter les scans de port, et quand il en détecte il réagit de plusieurs
façons :
– Un log pour indiquer l’incident par syslog()
– La machine est automatiquement ajoutée dans /etc/hosts.deny pour
TCP Wrappers.
– Le serveur local est automatiquement reconfiguré pour ignorer tous les
paquets de la machine pirate par le biais de ipfwadm.
Pour plus d’informations à propos de sentry allez voir : http ://www.psionic.com

6.10.8 Ecoute du réseau

Une machine du réseau local peut écouter le réseau ou ”sniffer” et ainsi


récupérer des mots de passe et commettre d’autres indiscrétions.
Parade
Repérer les interfaces réseaux en mode promiscuous par un antisniffer
– neped antisniffer http ://apostols.org/projectz/neped détecte les in-
terfaces en mode promiscious. Voir aussi : http ://www.l0pht.com/antisniff
– sentinel semble un peu mieux fourni que neped (plus de méthodes de
détection).
http ://www.packetfactory.net/Projects/sentinel/
Sentinel [3] tourne sous Linux mais necessite Libnet [3]. [3] http ://www.packetfactory.net/Projects/
100 CHAPITRE 6. SÉCURITÉ RÉSEAU SUR LINUX

6.11 Cryptage des communications


L’utilisation de ssh est vivement recommandée. ssh crypte les paquets trans-
mis sur le réseau et évite en particulier que des indiscrets découvre des mots de
passe en écoutant le réseau.

6.12 En savoir plus


zmore /usr/doc/HOWTO/Security-HOWTO.gz
Chapitre 7

Filtrage, routage et
masquage des paquets IP

Un PC Linux muni de plusieurs interfaces réseaux peut faire routeur. La


commande ipchains permet de dire au noyau Linux comment filtrer les paquets
IP. Linux peut donc jouer le rôle de firewall, c’est à dire de protection d’un réseau
vis à vis de l’Internet. Elle permet aussi de masquer les adresses IP, c’est à dire
de cacher un réseau Intranet vis à vis d’Internet, tout en permettant à l’Intranet
de communiquer, sous contrôle, avec Internet. Des serveurs proxy permettent
aussi de faire des requêtes sur Internet au nom des machines du réseau interne.

7.1 Qu’est-ce qu’un firewall ?


Un firewall est une interface qui protège un réseau privé du reste d’Internet.
Il est conçu pour contrôler le flux de paquets en se basant sur l’adresse IP source
et destination, le port et le type contenu dans chaque paquet.
Plusieurs techniques de firewall sont disponibles :
– le routage (forward ) : reçoit un paquet IP sur un interface réseau et la
renvoie sur un autre
– le filtrage : ne route un paquet IP que s’il satisfait à des règles portant
sur les adresses sources et destination, les ports, le protocole, le type de
paquet et les interfaces réseau en jeu.
– le masquage : le firewall fait suivre le paquet vers Internet mais en chan-
geant les adresses et ports, faisant croire (d’où le nom masquage, mas-
querade en anglais) que le paquet vient de lui. Au retour de la réponse il
remodifie l’en tête du paquet et l’envoie à la machine demandeuse. Ainsi,
les machines du réseau interne sont complètement invisibles de l’extérieur
mais peuvent néammoins faire des requêtes sur Internet.
– serveur proxy : c’est un serveur qui fait la requête à la place de votre
machine et lui renvoie le résultat. C’est une solution pour donner l’accès
Internet à des machines d’un réseau privé. Utilisé couramment pour le
web, il demande de paramétrer le serveur proxy sur le client WWW
– transparent proxy : la machine du réseau privé définit la machine trans-
parent proxy comme routeur par défaut. Elle fait sa requête, par exemple
http, normalement vers Internet. Les paquets IP arrivent sur le routeur.

101
102CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

Le dispositif transparent proxy redirige par exemple, les paquets pour le


port de destination 80 vers le port local 8080 où ils sont traités par le
serveur proxy squid. Donc c’est le mécanisme proxy mais il n’y a pas à
définir de serveur proxy sur les machines clientes.
– le forward de port : normalement, les machines d’un réseau privé ne sont
pas accessibles depuis l’Internet. Tous les serveurs doivent être installés
sur le firewall, (ou des machines sur Internet). Cependant, il est possible
d’accéder depuis Internet un serveur du réseau privé par le forward de
port. Il revient à dire que les requêtes venant de l’Internet pour le port 80
du firewall sont redirigées sur le port 80 d’une machine du réseau privé.
Il existe différents outils de firewalls pour Linux :
– Fonctions de filtrage et de masquage intégré dans le noyau : ipfwadm en
noyau < 2.2 et ipchains pour les noyaux 2.2, iptables et Netfilter pour
le futur noyau Linux 2.4.
– IPfilter (origine BSD) sur noyau Linux 2.0 http ://coombs.anu.edu.au/~avalon/ip-filter.ht

7.2 Masquage : permettre à un réseau privé d’accéder


à Internet
+----------+
| | Ethernet
| A-box |::::::
| |.2 : 192.168.1.x
+----------+ :
: +----------+ PPP link/Ethernet
+----------+ : .1 | Linux | ppp0
| | :::::::| Routeur |:::::::::::::::::::// Internet
| B-box |:::::: eth1| | eth0 193.54.230.3
| |.3 : +----------+
+----------+ :
:
+----------+ :
| | :
| C-box |::::::
| |.4
+----------+

| | |
| <- Réseau interne --> | | <--- Réseau externe --->
| | |

Dans ce schéma, la machine Linux Routeur est connectée à Internet par PPP
ou par Ethernet. Elle est la seule machine visible depuis Internet. Les autres
machines A-box, B-box, etc, ont des adresses IP privées en 192.168.1.x (cf RFC
1597). Elles sont sur un réseau privé invisible depuis Internet. La machine Linux
Routeur est connectée à ce réseau privé par un interface Ethernet eth1.
Si la machine Linux Routeur est configurée en routeur IP avec masquage
d’adresses, alors :
7.2. MASQUAGE : PERMETTRE À UN RÉSEAU PRIVÉ D’ACCÉDER À INTERNET103

– si les machines A-box, B-box, ... ont défini la machine Linux Routeur
comme gateway,
– Linux Routeur transmet les paquets IP du réseau interne vers le réseau
externe en changeant le port-source et mettant son adresse IP à la place de
l’adresse IP source. Il mémorise les paramètres originaux de la connexion
TCP : (IP-source, port-source, IP-dest, port-dest). C’est le masquage.
– pour les machines de l’Internet les paquets paraissent provenir de Linux
Routeur
– quand Linux Routeur reçoit un paquet TCP de l’extérieur, il examine
si le port-dest est un de ceux qui ont été attribués précédemment par le
masquage. Si c’est le cas il retrouve l’adresse IP et le port d’origine, corrige
le paquet IP et le renvoie à la machine à qui il est destiné.
– Des protocoles particuliers comme ftp qui ouvre une nouvelle connexion
TCP nommée ftp-data nécessitent le chargement d’un module du noyau.
– Une machine du réseau interne ne peut être appelée depuis Internet, sauf
si on configure sur la machine Linux Routeur le ”forward de port”.

7.2.1 Configuration du noyau ( > 2.2.0 )


Voici les options à prendre lors de make config
– Prompt for development and/or incomplete code/drivers (CONFIG EXPERIMENTAL) :
YES. Pas requis pour IP MASQ, mais permet au noyau de créer les mo-
dules MASQ et d’activer l’option pour le forward de port.
– Enable loadable module support (CONFIG MODULES) : YES. Pour char-
ger les modules IP MASQ
– Networking support (CONFIG NET) : YES
– Packet socket (CONFIG PACKET) : YES. C’est optionnel, mais permet
de déboguer tout problème avec tcpdump
– Kernel/User netlink socket (CONFIG NETLINK) : YES. Optionnel mais
permet le log des accès au firewall.
– Routing messages (CONFIG RTNETLINK) : NO
– Network firewalls (CONFIG FIREWALL) : YES. Permet d’utiliser l’outil
de firewall : ipchains
– TCP/IP networking (CONFIG INET) : YES
– IP : advanced router (CONFIG IP ADVANCED ROUTER) : NO. C’est
indépendant de ipchains/masq. Ne sert que pour CONFIG IP ROUTE VERBOSE.
– IP : verbose route monitoring (CONFIG IP ROUTE VERBOSE) : YES
Utile si on veut utiliser le code de routage pour rejetter et logger les
spoofed packets (paquets IP trafiqués venant de l’Internet avec comme
adresse source, une adresse du réseau interne)
– IP : firewalling (CONFIG IP FIREWALL) : YES
– IP : firewall packet netlink device (CONFIG IP FIREWALL NETLINK) :
YES. Optionnel mais améliore le log des accès au firewall.
– IP : transparent proxy support (CONFIG IP TRANSPARENT PROXY) :
YES. Permet de rediriger un paquet IP vers un autre port du firewall ce
qui fait croire aux machines du réseau privé qu’elles interrogent directe-
ment un serveur Internet alors qu’elles passent par un ”transparent proxy
server” installé sur le firewall. La redirection s’indique par ipchains -j
REDIR.
– IP : masquerading (CONFIG IP MASQUERADE) : YES. Active le mas-
104CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

quage d’adresses IP. Cette option active automatiquement ip always defrag.


Ceci évite d’avoir à filtrer des fragments de paquets IP, ce qui peut être
problématique, car les fragments suivant le premier n’ont plus d’adresse
IP.
– IP : ICMP masquerading (CONFIG IP MASQUERADE ICMP) : YES.
Idem pour ICMP. Utile pour diagnostics.
– IP : masquerading special modules support (CONFIG IP MASQUERADE MOD) :
YES. Optionnel, mais permet le forward de port.
– IP : ipautofw masq support (EXPERIMENTAL) (CONFIG IP MASQUERADE IPAUTOFW) :
NO
– IP : ipportfw masq support (EXPERIMENTAL) (CONFIG IP MASQUERADE IPPORTFW) :
YES. Active le forward de port. Permet d’accéder depuis Internet des ser-
veurs du réseau interne par SMTP, TELNET et WWW. FTP nécessite
un autre patch.
– IP : ip fwmark masq-forwarding support (EXPERIMENTAL) (CONFIG IP MASQUERADE MF
NO. Il est recommandé d’utiliser plutôt IPMASQADM et IPPORTFW.
– IP : optimize as router not host (CONFIG IP ROUTER) : YES
– IP : GRE tunnels over IP (CONFIG NET IPGRE) : NO. Sert à activer
un tunnel PPTP ou GRE via une machine IP MASQ
– IP : TCP syncookie support (not enabled per default) (CONFIG SYN COOKIES) :
YES. Recommandé pour la sécurité réseau.
– Network device support (CONFIG NETDEVICES) : YES. Obligatoire :
Support d’interface réseau.
– Dummy net driver support (CONFIG DUMMY) : YES. Utile pour debug.
– /proc filesystem support (CONFIG PROC FS) : YES. Nécessaire pour
activer le routage (IP forward)
Compilation du noyau et mise en place
Si le répertoire /lib/modules/2.2.17 existe déjà, on le sauvegardera.
make dep;make clean
make zImage; make modules
make modules_install
cp arch/i386/boot/zImage /boot/vmlinuz-2.2.17
rm /vmlinuz
ln -s /boot/vmlinuz-2.2.17 /vmlinuz
vi /etc/lilo.conf
/sbin/lilo
reboot

7.2.2 Configuration du masquage


La machine Linux Routeur a 2 interfaces réseaux. Le noyau sait reconnaı̂tre
une deuxième carte, mais si ce sont des cartes ISA, il faut veiller à ce qu’elles
n’aient pas mêmes IRQ et adresses IO.
[morel@phoebus morel]$ ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:62531 errors:0 dropped:0 overruns:0 frame:0
TX packets:62531 errors:0 dropped:0 overruns:0 carrier:0
7.2. MASQUAGE : PERMETTRE À UN RÉSEAU PRIVÉ D’ACCÉDER À INTERNET105

Collisions:0

eth0 Link encap:Ethernet HWaddr 00:20:AF:AA:AE:93


inet addr:193.54.230.3 Bcast:193.54.230.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:108164 errors:770 dropped:0 overruns:795 frame:770
TX packets:61826 errors:0 dropped:0 overruns:0 carrier:0
Collisions:91
Interrupt:10 Base address:0x300

eth1 Link encap:Ethernet HWaddr 00:60:08:70:7A:4A


inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:42523 errors:0 dropped:0 overruns:0 frame:0
TX packets:665 errors:0 dropped:0 overruns:0 carrier:0
Collisions:2
Interrupt:5 Base address:0x340
[morel@phoebus morel]$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
localnet * 255.255.255.0 U 0 0 0 eth0
192.168.1.0 * 255.255.255.0 U 0 0 0 eth1
default routeur 0.0.0.0 UG 1 0 0 eth0
D’abord on teste que le noyau supporte les chaı̂nes firewall pour IP par
ls /proc/net/ip_fwchains
Si ce fichier est absent, le noyau est mal configuré.
Le masquage s’écrit avec au moins 3 commandes :
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ
echo "1" > /proc/sys/net/ipv4/ip_forward
– Ligne 1 : forward interdit sauf pour ce qui est spécifié à la suite
– Ligne 2 : pour les paquets dont l’adresse source provient du réseau interne,
forward avec masquage
– Ligne 3 : activation du IP forward, le routage IP.
Il serait dangereux de faire du masquage le défaut en écrivant :
/sbin/ipchains -P forward MASQ
echo "1" > /proc/sys/net/ipv4/ip_forward
Ces commandes peuvent être automatisées par un shell script activé au boot.
On lui fera également charger les modules nécessaires.
#!/bin/sh
#
# rc.firewall - SIMPLE IP Masquerade test for 2.2.x kernels using IPCHAINS
#
# Load all required IP MASQ modules
/sbin/depmod -a
106CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

/sbin/modprobe ip_masq_ftp
#CRITICAL: Enable IP forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward
# MASQ timeouts
#
# 2 hrs timeout for TCP session timeouts
# 10 sec timeout for traffic after the TCP/IP "FIN" packet is received
# 160 sec timeout for UDP traffic (Important for MASQ’ed ICQ users)
#
/sbin/ipchains -M -S 7200 10 160
/sbin/ipchains -P forward DENY
/sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ

7.2.3 Configuration d’une machine du réseau interne


Toute machine du réseau interne doit définir Linux Routeur comme gateway.
Configuration d’une Linux Debian du réseau interne :

[morel@auger morel]$ cat /etc/init.d/network


#! /bin/sh
ifconfig lo 127.0.0.1
route add -net 127.0.0.0
IPADDR=192.168.1.2
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
GATEWAY=192.168.1.1
ifconfig eth0 ${IPADDR} netmask ${NETMASK} broadcast ${BROADCAST}
route add -net ${NETWORK}
[ "${GATEWAY}" ] && route add default gw ${GATEWAY} metric 1

Le réseau étant lancé, on a :

auger:/etc/init.d# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:18 errors:0 dropped:0 overruns:0 frame:0
TX packets:18 errors:0 dropped:0 overruns:0 carrier:0
Collisions:0

eth0 Link encap:Ethernet HWaddr 00:00:1C:B5:C6:96


inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:500 errors:0 dropped:0 overruns:0 frame:0
TX packets:41 errors:0 dropped:0 overruns:0 carrier:0
Collisions:1
Interrupt:10 Base address:0xe400
Kernel IP routing table
7.3. LA COMMANDE IPCHAINS 107

Destination Gateway Genmask Flags Metric Ref Use Iface


192.168.1.0 * 255.255.255.0 U 0 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 1 0 0 eth0

La machine Linux Routeur est donc gateway.

7.2.4 Tests
Sur cette machine du réseau interne
– ping 192.168.1.1
– ping isis.u-strasbg.fr : une machine d’Internet
– ssh zoroastre.c-strasbourg.fr
– ftp zoroastre.c-strasbourg.fr
Durant la session lancée par ssh zoroastre, la commande sur zoroastre
netstat -tn montre :

[morel@zoroastre morel]$ netstat -tn


Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 193.54.230.20:22 193.54.230.3:61003 ESTABLISHED

que c’est la machine d’adresse 193.54.230.3 donc le Linux Routeur qui a


appelé zoroastre d’adresse 193.54.230.20 sur le port 22.
La machine du réseau interne qui a fait ssh zoroastre, netstat montre
qu’elle a bien appelé 193.54.230.20 sur le port 22.

[morel@auger morel]$ netstat -tn


Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.1.2:1023 193.54.230.20:22 ESTABLISHED

7.3 La commande ipchains


La commande ipchains permet d’indiquer au noyau Linux les règles de
filtrage en entrée, en sortie ou lors du routage. Elle permet aussi le masquage.
Elle est réservée à root.
Syntaxe : ipchains -h

7.3.1 Chaı̂nes prédéfinies


Au départ, 3 listes de règles sont prédéfinies : input, output, forward. Elles
sont appelées chaı̂nes firewall ou chaı̂nes tout court.
Quand un paquet arrive par l’interface réseau dans la machine, le noyau
utilise la chaı̂ne input pour décider ce qu’il fait de ce paquet. Si ce paquet
survit à cette étape, alors le noyau décide où il va l’envoyer, c’est le routage.
S’il est destiné à une autre machine il consulte la chaı̂ne forward. Enfin, juste
quand le paquet va sortir, le noyau consulte la chaı̂neoutput.
Une chaı̂ne est une liste de règles. Chaque règle dit ”si le paquet a tel header,
voici ce qu’il faut en faire”. Si le header du paquet ne correspond pas à la règle,
le noyau examine la règle suivante de la même chaı̂ne. Finalement s’il n’y a plus
108CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

de règle, le noyau consulte la ”policy” de la chaı̂ne, c’est à dire la décision par


défaut. Si on veille à la sécurité cette décision par défaut est DENY ou REJECT.
En Linux Debian ipchains fait partie du package netbase. La version 1.3.4
n’est pas la plus récente mais elle est stable.
L’utilisateur peut aussi définir ses propres chaı̂nes.

7.3.2 Manipulation des chaı̂nes


– -F : (F comme flush) supprime toutes les règles d’une chaı̂ne, (mais pas
la policy).
– -A : ajoute une règle à une chaı̂ne
– -P : fixe la policy (c’est à dire l’action par défaut) d’une chaı̂ne à target
– -L : liste les règles d’une chaı̂ne si spécifiée, de toutes sinon.
– -D : effacement d’une règle dans une chaı̂ne
– -N : création d’une chaı̂ne
– -X : suppression d’une chaı̂ne
Exemples :
– ipchains -F input : supprime toutes les règles de la chaı̂ne input
– ipchains -F : supprime toutes les règles de toutes les chaı̂nes
– ipchains -A forward -s 192.168.1.0/24 -j MASQ : ajoute une règle
à la chaı̂ne forward
– ipchains -P forward DENY fixe la policy de la chaı̂ne forward à DENY
– ipchains -L : liste les règles de toutes les chaı̂nes (mais n’indique pas
l’interface).
phoebus:/home/morel# ipchains -L
Chain input (policy DENY):
target prot opt source destination ports
ACCEPT all ------ anywhere anywhere n/a
ACCEPT all ------ 192.168.1.0/24 anywhere n/a
ACCEPT all ------ anywhere phoebus.c-strasbourg.fr n/a
DENY all ----l- 192.168.1.0/24 anywhere n/a

Chain forward (policy DENY):


MASQ all ------ 192.168.1.0/24 anywhere n/a

Chain output (policy DENY):


ACCEPT all ------ anywhere anywhere n/a
ACCEPT all ------ anywhere 192.168.1.0/24 n/a
ACCEPT all ------ localnet/24 anywhere n/a
DENY all ----l- anywhere 192.168.1.0/24 n/a

7.3.3 Spécification d’une règle


– -s : Adresse IP source, s’écrit de 4 manières :
1. zoroastre.c-strasbourg.fr : nom de domaine
2. 193.54.230.20 : adresse IP
3. 193.54.230.0/255.255.255.0 : tranches d’adresse de 193.54.230.0 à 193.54.230.255
4. 193.54.230.0/24 : même tranche d’adresses. 0/0 désigne toute adresse
IP.
7.4. EXEMPLES DE FILTRAGE 109

Dans le cas de TCP ou UDP, un numéro ou un nom de port peut suivre.


Dans le cas de ICMP, on peut indiquer le type ICMP. Liste par ipchains
-h icmp
– -d : Adresse IP destination, même règles d’écriture
– -i : interface. Dans la chaı̂ne input c’est celui par où arrive le paquet,
dans output par où il sort, dans forward vers où il est dirigé. Si l’interface
n’existe pas (ex : ppp0), il n’y a pas d’erreur.
– -p : protocole (tcp, udp, icmp)
– -y :
– -j : Action (Target) :
– ACCEPT : permet au paquet de continuer
– DENY : détruit le paquet
– REJECT : détruit le paquet et en plus génère un message de réponse
ICMP host unreachable
– MASQ : masquage du paquet (valable uniquement dans la chaı̂ne for-
ward) CONFIG IP MASQUERADE doit être défini dans le noyau.
– REDIR : redirige vers un port local, on peut l’indiquer à la suite. Valable
pour la chaı̂ne input et les chaı̂nes utilisateur. (uniquement pour TCP et
UDP) CONFIG IP TRANSPARENT PROXY doit être configuré dans
le noyau
– RETURN : revient à la chaı̂ne appelante, sinon exécute l’action définie
par -P chaı̂ne.
– autre nom : chaı̂ne définie par l’utilisateur
– -l : log
Certains paramètres peuvent être niés par le caractère !, ainsi :
– -i ! eth0 : tout interface sauf eth0
– -p ! tcp : tout protocole sauf tcp
– -p tcp ! -y : tout paquet tcp sauf ceux marqués du flag SYN.
– -s ! 192.168.1.1 : toute adresse IP source sauf 192.168.1.1

7.4 Exemples de filtrage


7.4.1 Test du ping
Dans l’exemple suivant, sous root :
– ping localhost marche
– par ipchains -A input -s localhost -p icmp -j DENY on interdit en
entrée tout paquet ICMP ayant comme adresse source 127.0.0.1
– ping localhost ne marche plus
– on efface la règle précédente
– ping localhost remarche

phoebus:/home/morel# ping -c 1 localhost


PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.8 ms

--- localhost ping statistics ---


1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.8/0.8/0.8 ms
phoebus:/home/morel# ipchains -A input -s localhost -p icmp -j DENY
110CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

phoebus:/home/morel# ping -c 1 localhost


PING localhost (127.0.0.1): 56 data bytes

--- localhost ping statistics ---


1 packets transmitted, 0 packets received, 100% packet loss
phoebus:/home/morel# ipchains -D input -s localhost -p icmp -j DENY
phoebus:/home/morel# ping -c 1 localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=255 time=0.6 ms

--- localhost ping statistics ---


1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.6/0.6/0.6 ms

7.4.2 Masquage standard


Le package Debian ipmasq génère au boot les chaı̂nes de filtrages et de
masquage.
Lancement par /etc/init.d/ipmasq
Par ipmasq -d, il génère les commandes ipchains sans les exécuter. Voici
pour notre machine Linux Routeur à deux interfaces Ethernet :

/sbin/ipchains -P input DENY


/sbin/ipchains -P output DENY
/sbin/ipchains -P forward DENY
/sbin/ipchains -F input
/sbin/ipchains -F output
/sbin/ipchains -F forward
/sbin/ipchains -A input -j ACCEPT -i lo
/sbin/ipchains -A input -j ACCEPT -i eth1 -s 192.168.1.1/255.255.255.0
/sbin/ipchains -A input -j ACCEPT -i eth0 -d 193.54.230.3/32
/sbin/ipchains -A input -j DENY -i eth0 -s 192.168.1.1/255.255.255.0 -l
/sbin/ipchains -A forward -j MASQ -i eth0 -s 192.168.1.1/255.255.255.0
/sbin/ipchains -A output -j ACCEPT -i lo
/sbin/ipchains -A output -j ACCEPT -i eth1 -d 192.168.1.1/255.255.255.0
/sbin/ipchains -A output -j ACCEPT -i eth0 -s 193.54.230.3/255.255.255.0
/sbin/ipchains -A output -j DENY -i eth0 -d 192.168.1.1/255.255.255.0 -l

Explication :
– On fixe la policy des chaı̂nes input, output et forward à DENY : aucun
paquet IP ne rentre, ne sort, n’est routé.
– On supprime toutes les règles des chaı̂nes input, output et forward.
– On ajoute à la chaı̂ne input la règle -j ACCEPT -i lo : on accepte tout
paquet qui rentre sur l’interface lo
– On ajoute à la chaı̂ne input la règle -j ACCEPT -i eth1 -s 192.168.1.1/255.255.255.0
: on accepte tout paquet qui rentre sur l’interface eth1 et ayant pour
adresse source les adresses 192.168.1.1 à 192.168.1.255, c’est à dire le réseau
interne.
– On ajoute à la chaı̂ne input la règle -j ACCEPT -i eth0 -d 193.54.230.3/32 :
on accepte tout paquet qui rentre sur l’interface eth0 et ayant comme
7.4. EXEMPLES DE FILTRAGE 111

adresse destination 193.54.230.3 c’est à dire l’adresse Internet de Linux


Routeur.
– On ajoute à la chaı̂ne input la règle -j DENY -i eth0 -s 192.168.1.1/255.255.255.0
-l : on rejette tout paquet qui rentre sur l’interface eth0 et ayant comme
adresse source une adresse du réseau interne et on écrit les accès dans
le log (spoofing). Tous les autres paquets sont rejetés conformément à la
policy de input, mais sans être loggés. Si on veut les logger il faut ajouter
une dernière règle :
ipchains -A input -l -j DENY
– On ajoute à la chaı̂ne forward la règle -j MASQ -i eth0 -s 192.168.1.1/255.255.255.0 :
on masque tout paquet qui va sur l’interface eth0 et ayant comme adresse
source une adresse du réseau interne.
On ajoute dans la chaı̂ne output les règles suivantes :
– j ACCEPT -i lo : on accepte tout ce qui sort par l’interface lo.
– -j ACCEPT -i eth1 -d 192.168.1.1/255.255.255.0 : on accepte tout
ce qui sort par l’interface eth1 ayant une adresse de destination du réseau
interne.
– -j ACCEPT -i eth0 -s 193.54.230.3/255.255.255.0 : on accepte tout
ce qui sort par l’interface eth0 ayant comme adresse source celle du Linux
Routeur.
– -j DENY -i eth0 -d 192.168.1.1/255.255.255.0 -l : on rejette tout
ce qui sort par l’interface eth0 ayant comme adresse de destination une
adresse du réseau interne et on logge les infractions.

7.4.3 Antispoofing
Debian exécute au boot dans le fichier /etc/init.d/netbase deux règles
antispoofing :

if [ -e /proc/net/ip_fwchains ]; then
echo -n "Setting up IP spoofing protection..."
ipchains -D input -j DENY -l -s 127.0.0.0/8 -i ! lo 2>/dev/null || true
ipchains -A input -j DENY -l -s 127.0.0.0/8 -i ! lo

# deny incoming packets pretending to be from our own system.


# set your own IP address below (or use ‘hostname -i‘ to set it).
my_ip=‘hostname -i‘
ipchains -D input -j DENY -l -s $my_ip -i ! lo 2>/dev/null || true
ipchains -A input -j DENY -l -s $my_ip -i ! lo
echo "done."
fi

La première règle ajoutée à la chaı̂ne input rejette en entrée sur tout interface
autre que loopback tout paquet avec comme adresse source 127.0.0.0 et logge
ces tentatives d’accès.
La deuxième ajoutée à la chaı̂ne input rejette en entrée sur tout interface
autre que loopback tout paquet avec comme adresse source l’adresse de la ma-
chine.
112CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP

7.5 Applications clientes supportant le masquage


– telnet, ssh, smtp, pop, http, archie
– ping, traceroute
– ftp avec module ip masq ftp.o
– irc avec module ip masq irc.o
– cu-seeme avec module ip masq cu-seeme.o
– icq nécessite l’option du noyau IPPORTFW et ...
– real audio player avec module ip masq raudio.o
– quake avec module ip masq quake.o
– H.323 programs (MS Netmeeting, Netscape Cooltalk) : non supportés

7.5.1 Autoriser l’accès TCP dans un sens


On peut vouloir autoriser les connexions TCP dans un sens et pas dans
l’autre. Par exemple on veut pouvoir accéder à un serveur WWW, mais on
refuse que celui-ci initialise des connexions depuis ce serveur.
Si on interdit les paquets TCP venant de ce serveur, on ne pourra plus
l’accéder car une connexion TCP est une circulation TCP dans les deux sens.
La solution est de bloquer uniquement les paquets qui demandent une connexion.
Ces paquets appelés SYN packets ont le flag SYN positionné et les flags ACK
et FIN non positionnés. On peut les sélectionner par l’option -y. Ainsi pour
désigner les SYN packets venant de 192.168.1.1 on écrit : -p TCP -s 192.168.1.1
-y
Exemple : on veut pouvoir accéder au serveur smtp 130.79.200.3 mais on
refuse qu’il se connecte par TCP sur le port smtp de notre machine :

ipchains -A input -p tcp ! -y -s 130.79.200.3 smtp -j ACCEPT

7.6 Forward de port


Package Debian ipportfw

7.7 Serveurs proxy


7.7.1 http
– junkbuster is an instrumentable proxy that filters the HTTP stream bet-
ween web servers and browsers. Its main purpose is to enhance privacy
– squid
– apache

7.7.2 telnet, ftp


– Logiciel TIS http ://www.tis.com
– Logiciel SOCKS http ://www.socks.nec.com/socksfaq.html
7.8. RACCORDEMENT D’UN RÉSEAU PRIVÉ À INTERNET PAR PPP113

7.8 Raccordement d’un réseau privé à Internet


par PPP
IP MASQUERADING permet l’accès à Internet à tout un réseau privé en
souscrivant un seul abonnement auprès d’un fournisseur d’accès. Si c’est un
accès téléphonique par PPP, ceci n’est pratiquable que si le lancement de pppd
sur le firewall peut être déclenché automatiquement par diald. Sur Debian,
installer le package diald.
Attention, même si on utilise PPP, il faut configurer le support de SLIP dans
le noyau.

7.9 Documentation
– Linux IPCHAINS HOWTO
– Linux MASQUERADE HOWTO
– apache
114CHAPITRE 7. FILTRAGE, ROUTAGE ET MASQUAGE DES PAQUETS IP
Chapitre 8

Cryptage des
communications par ssh

8.1 Introduction
Ce document décrit comment installer et utiliser ssh sur Unix, Linux en
particulier. Il résume la documentation fournie avec le logiciel. Merci à Benoı̂t
Speckel pour ses conseils.
L’utilisation de ssh, en fait OpenSSH, version libre de SSH est vivement re-
commandée pour communiquer avec une machine distante sur Internet. ssh
crypte les paquets transmis sur le réseau et évite en particulier que des indis-
crets découvre des mots de passe en écoutant le réseau. Mais en plus c’est une
parade à certains trous de sécurité d’Internet notamment que des paquets IP
soient trafiqués de manière qu’une machine se fasse passer pour une autre.
– ssh ou slogin remplace rlogin, rsh et telnet . Les applications X11
lancées depuis une session ssh circulent dans un canal crypté. On n’a plus
à s’occuper de la variable DISPLAY et l’authentification X11 par xauth
est automatique.
– scp (secure copy) remplace rcp ou par extension ftp.
– On peut s’authentifier par un système de clés publiques et privées RSA
qui permet de se passer du password Unix.
On trouvera ssh dans le package ssh en Linux Debian.
Le package ssh se compose :
– d’un serveur sshd
– d’un client ssh (aussi appelé slogin)
– d’outils de gestion de clés : ssh-keygen, ssh-agent, ssh-add, make-ssh-known-hosts.

8.2 Documentation
http ://www.ssh.org
– man ssh
– man scp
– man ssh-keygen
– man ssh-add

115
116 CHAPITRE 8. CRYPTAGE DES COMMUNICATIONS PAR SSH

– man ssh-agent
– man make-ssh-known-hosts
– RFC : The SSH (Secure Shell) Remote Login Protocol : Internet Draft
décrivant le protocole
Livres
– ”Réseaux” par Andrew Tanenbaum, Interéditions : explique au chapitre 7
la sécurité dans les réseaux, les bases de la cryptographies, les algorithmes
DES, 3DES, IDEA, les algorithmes à clé publique, RSA, les protocoles
d’authentification.
– ”Applied Cryptography” par Bruce Schneier, John Wiley & Sons, 1996
traduit en français sous le titre ”Crytographie appliquée”

8.3 Configuration de ssh


Examinez les fichiers de configuration :
– /usr/local/etc/ssh/sshd config pour le serveur
– /usr/local/etc/ssh/ssh config pour les clients

8.4 ssh serveur


Le daemon ou serveur sshd permet d’accepter des connexions ssh sur sa
machine. Après avoir installé le package, le fichier de configuration de sshd se
trouve en :

/etc/ssh/sshd_config

on lance le daemon sshd sous Linux Debian par :

/etc/init.d/ssh start

sshd écoute le port tcp 22.

8.4.1 Contrôles d’accès


La librairie tcp-wrapper contrôle les accès à sshd avec les fichiers /etc/hosts.allow
et /etc/hosts.deny. Exemple :

cat /etc/hosts.deny
ALL:ALL
cat /etc/hosts.allow
sshd : in2p3.fr u-strasbg.fr c-strasbourg.fr
sshdfwd-pop3 : in2p3.fr u-strasbg.fr c-strasbourg.fr
sshdfwd-imap2 : in2p3.fr u-strasbg.fr c-strasbourg.fr

Sont ainsi autorisés :


– les accès à sshd depuis les domaines in2p3.fr u-strasbg.fr c-strasbourg.fr
– les applications X11 via le tunnel ssh sont autorisées pour les mêmes do-
maines
– le forward de port est autorisé pour pop et imap au profit des mêmes.
8.5. SSH CLIENT 117

8.5 ssh client


Si on veut utiliser ssh entre les machines A et B, ssh doit être installé sur les
deux, sinon ssh se comporte comme rsh, la communication n’est pas cryptée.

8.5.1 Création des clés RSA : ssh-keygen


1. Sur la machine A, créer les clés par la commande ssh-keygen qui crée
une clé :
– publique dans ~/.ssh/id rsa.pub. Cette clé publique doit être copiée
sur les autres machines si l’on veut s’authentifier par RSA en s’y connec-
tant.
– et une privée dans ~/.ssh/id rsa
En plus elle demande une passphrase qui sert à protéger la clé privée
(mais n’est pas un password UNIX). Une bonne passphrase doit avoir de
10 à 30 caractères. Une simple phrase n’est pas une bonne passphrase car
trop facilement devinable ou n’offrant pas une entropie suffisante, c’est à
dire pas assez de désordre.
2. Copier la clé publique de la machine A (fichier ~/.ssh/id rsa.pub sur
machine-A) sur la machine B dans ~/.ssh/authorized keys . Attention,
une clé fait une ligne. Dans ce fichier ~/.ssh/authorized keys de la
machine B, on ajoutera les clés publiques des machines depuis lesquelles
on se connectera sur B.
Attention, faire :
chmod 600 $HOME/.ssh/authorized_keys
De même .ssh ne doit pas être group writable
ls -ld ~/.ssh
drwxr-xr-x 2 morel morel 1024 May 4 10:37 /home/morel/.ssh/
3. Tester la connexion de A sur B en faisant sur A :
ssh machine-B
4. Faire de même sur machine-B si on veut se connecter de B vers A
Si on veut changer la passphrase on fait :
ssh-keygen -p

8.5.2 Connexion : slogin ou ssh


1. Sur A, pour se connecter à B on fera
slogin machine-B (ou ssh B)
Enter passphrase for RSA key ’user@A’:
On fournit cette passphrase et on est connecté sur B. On n’a pas eu à
fournir son password Unix sur B. Si on a le diagnostic Bad passphrase
ou s’il y a un autre problème, le password Unix est demandé mais la
communication est toujours cryptée.
Si on a un problème, on fait
slogin -v machine-B
118 CHAPITRE 8. CRYPTAGE DES COMMUNICATIONS PAR SSH

(-v comme verbose).


Causes de problèmes :
– Les permissions sur les fichiers de clés dans .ssh/ sont trop laxistes.
Elles doivent être comme ceci :
-rw------- 1 morel morel 1654 Apr 4 17:51 authorized_keys
-rw------- 1 morel morel 530 Feb 8 15:38 identity
-rw-r--r-- 1 morel morel 334 Feb 8 15:38 identity.pub
-rw------- 1 morel morel 2282 Apr 4 17:53 known_hosts
-rw------- 1 morel morel 512 Apr 4 18:03 random_seed
– On n’a pas le même userid sur machine-B , on fait :
slogin -l userid_B machine-B
2. Pour X-Window ssh passe la variable DISPLAY, il est inutile de la valoriser.
3. Les fichiers $HOME/.rhosts sont devenus inutiles, ils doivent être effacés
parce qu’ils sont dangereux.

ssh remplace rsh


On peut par ssh exécuter des commandes sur une machine distante sans s’y
connecter. Ainsi sur la machine A :
slogin machine-B w
fait exécuter la commande w sur la machine B. Le résultat s’affiche sur mon
écran de la machine A.

Authentification par ssh


On a présenté ci-dessus l’authentification par clé RSA, mais en fait ssh
accepte les authentifications suivantes :
– mot de passe Unix (SSH AUTH PASSWORD)
– fichier .rhosts comme dans les r-commandes rsh, rlogin (SSH AUTH RHOSTS).
On peut remplacer .rhosts par .shosts qui ne sera pas reconnu par les
r-commandes.
– clé RSA (SSH AUTH RSA)
– fichier .rhosts ou (.shosts) et clé RSA cumulés (SSH AUTH RHOSTS RSA)

Options de ssh
– L’option -v (verbose) décrit les étapes de l’établissement de la connexion.
Utile quand ssh ne marche pas.
– L’option -f met ssh en arrière plan.
slogin -f machine-B xterm
– L’option -n met ssh en arrière plan et redirige stdin depuis /dev/null.
C’est utilisé pour lancer une application X11 depuis une machine distante.
Exemple :
ssh -n machine-B emacs &
Ceci ne marche pas si ssh doit demander un password ou une passphrase.
– L’option -C comprime (par la méthode de gzip) les paquets échangés.
Vivement recommandé pour une session PPP par modem téléphonique.
– L’option -c permet de choisir la méthode de chiffrement :
– idea (défaut)
8.5. SSH CLIENT 119

– des
– 3des
– blowfish
– arcfour
– none
(On tiendra compte des options prises à l’installation.)

8.5.3 Transfert de fichiers : scp


On peut copier des fichiers par scp (secure copy) qui demande l’authentifi-
cation et crypte la communication.
Exemple :
scp machine-B:adm/users/ajout ajout
copie le fichier adm/users/ajout de mon répertoire sur la machine distante
machine-B dans mon répertoire courant sur la machine locale.
Syntaxe des noms de fichiers :
Un nom de fichier peut contenir un nom d’utilisateur et de machine, ainsi
on peut écrire :
scp dupond@machine-B:prog/truc durand@machine-C:prog/truc
Donc depuis la machine A, on peut commander un transfert entre B et C.
Options de scp
– C : compression
– r : copie récursive de fichiers (copie le répertoire et les fichiers qu’il contient).
– p : préserve date et permissions des fichiers copiés.
– c : choix de la méthode de cryptage

8.5.4 Automatisation de l’authentification par clé publique


L’inconvénient dans l’authentification par clé publique est d’avoir à taper la
passphrase à chaque nouvelle connexion. ssh-agent est un processus tournant
en permanence qui gère les clés privées pour l’identification par clé publique.
Une fois lancé, on lui communique par ssh-add son identité, c’est à dire ses clés
$HOME/.ssh/id rsa, $HOME/.ssh/id dsa et $HOME/.ssh/identity en tapant la
passphrase. Par la suite, c’est ssh-agent qui fournit ces clés.
Au lancement de ssh-agent, deux variables d’environnement sont générées
qui permettent aux commandes ssh ultérieures de communiquer avec ssh-agent :
– SSH AGENT PID : numéro du processus ssh-agent
– SSH AUTH SOCK : nom du socket Unix (=tube nommé) permettant de com-
muniquer avec ssh-agent
La communication avec ssh-agent se fait de deux manières :
– Soit ssh-agent lance une commande indiquée en argument, un shell ou
Windows dans un sous-processus (il fait un fork ) par exemple :
ssh-agent bash
Dans ce shell bash les deux variables d’environnement SSH AGENT PID et
SSH AUTH SOCK sont définies et permettent la communication avec ssh-agent.
Quand on termine ce shell, ssh-agent est tué.
– Soit on récupére la définition de des deux variables que ssh-agent copie
sur stdout :
120 CHAPITRE 8. CRYPTAGE DES COMMUNICATIONS PAR SSH

ssh-agent > fichier


fichier contient la définition de ces deux variables que l’on peut activer
ailleurs dans un autre shell en y faisant :
. fichier
ssh-add communique à ssh-agent ma clé privée contenue dans $HOME/.ssh/identity.

$ ssh-add
Enter passphrase for /home/morel/.ssh/id_rsa:
Identity added: /home/morel/.ssh/id_rsa (/home/morel/.ssh/id_rsa)
Identity added: /home/morel/.ssh/identity (morel@helios)

Je tape la passphrase une fois. Par la suite quand je me connecterai à


d’autres machines, je n’aurai plus à taper la passphrase
Options de ssh-add
– ssh-add -l liste les clés gérées par ssh-agent.
– ssh-add -D invalide toutes les clés auprès de ssh-agent.
Le fonctionnement de ssh-agent est visible en passant les commandes sui-
vantes :
– ps aux|grep ssh-agent
– ssh-agent bash : On est dans un nouveau shell.
– ps aux|grep ssh-agent : nouveau process ssh-agent est lancé. Repérer
son PID
– echo $SSH AGENT PID : c’est le PID de ssh-agent
– echo $SSH AUTH SOCK : Vérifier que c’est le chemin d’un socket de nom
/tmp/ssh-xxxxxxxxx/agent.nnn
– Faites slogin machine : la passphrase vous est demandée parce que vous
n’avez encore communiquée aucune identité à ssh-agent
– ssh-add -l. Vous obtenez la réponse The agent has no identities.
– ssh-add : Votre passphrase est demandée. Vos clés privées sont lues et
conservées par ssh-agent
– slogin machine : Vous pouvez maintenant vous connectez sans pass-
phrase aux machines où vous avez défini votre clé publique.
– Sortez du shell bash par exit ou Ctrl-D
– ps aux|grep ssh-agent : ssh-agent a disparu.
Pour travailler en X-Window que je lance par startx, j’ai un fichier .xinitrc
comme suit :

#!/bin/sh
xrdb -load $HOME/.Xresources
exec /usr/bin/ssh-agent fvwm95

Je fais ssh-add dans la première fenêtre xterm que j’ouvre.


Ceci dit, il suffit que j’ajoute dans .bashrc la ligne :

[ $SSH_AGENT_PID ] && \
[ "‘ssh-add -l‘" = "The agent has no identities." ] && ssh-add

pour faire un ssh-add si je ne l’ai pas fait à la main.


Le script suivant de Benoı̂t Speckel est encore mieux. Appelé dans .xsession
ou .bash profile il appelle ssh-agent s’il n’est pas lancé ou bien positionne
dans le shell courant les variables d’environnement SSH AUTH SOCK et SSH AGENT PID
8.5. SSH CLIENT 121

qui permettent de communiquer avec ssh-agent. De cette manière on tape une


fois et une seule la passphrase quelque soit la fenêtre X11 ou la console virtuelle
où on se trouve.

#!/bin/sh
#set -x
# fichier .ssh-setup.sh :

if [ -z "$SSH_AUTH_SOCK" ]
then agentfile=$HOME/.ssh/ssh-agent.info

# récupérer et vérifier SSH_AUTH_SOCK et SSH_AGENT_PID


if [ -f $agentfile ]
then . $agentfile >/dev/null
ps --pid $SSH_AGENT_PID 2>/dev/null |
grep -q "^$LOGNAME .*ssh-agent" || SSH_AUTH_SOCK=
fi

# démarrage ssh-agent
if [ -z "$SSH_AUTH_SOCK" ]
then [ -f $agentfile ] && \rm $agentfile
( trap ’’ 1 ; exec ssh-agent -s > $agentfile )
. $agentfile > /dev/null
[ -n "$SSH_AUTH_SOCK" ] && [ -t 0 -o -n "$DISPLAY" ] && ssh-add
fi
unset agentfile
fi

Le principe est le suivant : Quand ssh-agent est lancé, il crée un ”tube


nommé” (named pipe), c’est un fichier, par exemple /tmp/ssh-morel/ssh-24842-agent
qui permet aux autres applications ssh de communiquer avec lui. Le nom de ce
fichier est retenu dans la variable SSH AUTH SOCK et le numéro de processus de
ssh-agent est dans SSH AGENT PID.
Quand on lance ssh-agent, (-s signifie shell sh, mettre -c pour csh) il affiche
à l’écran :

ssh-agent -s
SSH_AUTH_SOCK=/tmp/ssh-morel/ssh-20765-agent; export SSH_AUTH_SOCK;
SSH_AGENT_PID=20766; export SSH_AGENT_PID;
echo Agent pid 20766;

L’astuce est de détourner ces définitions de variables dans un fichier, ici


$HOME/.ssh/ssh-agent.info et de les utiliser pour mettre en communication
d’autres shells avec ssh-agent.

si $SSH_AUTH_SOCK est vide


alors
si le fichier $HOME/.ssh/ssh-agent.info existe
je le fais exécuter
si le process $SSH_AGENT_PID à mon LOGNAME ne tourne pas
alors SSH_AUTH_SOCK=vide
122 CHAPITRE 8. CRYPTAGE DES COMMUNICATIONS PAR SSH

si $SSH_AUTH_SOCK est vide


alors
si le fichier $HOME/.ssh/ssh-agent.info existe, je l’efface
j’inhibe l’interruption 1 (SIGHUP)
j’exécute ssh-agent à la place du process courant et
détourne sa sortie dans le fichier $HOME/.ssh/ssh-agent.info
j’exécute ce fichier pour valoriser les variables SSH_AGENT_PID
et SSH_AUTH_SOCK
je lance ssh-add

8.6 Autres implémentations de ssh


– putty est une version de ssh pour Windows : permet slogin depuis Win-
dows mais pas scp.
– WinSCP est une version de scp pour Windows
– niftytelnet-1.1-ssh-r3-beta.cpt équivalent MacIntosh de Teraterm
avec ajout ssh :
http://www.lysator.liu.se/~jonasw/freeware/niftyssh/
– LeechFTP client ftp Windows pouvant fonctionner au travers d’un tunnel
ssh
http://stud.fh-heilbronn.de/~jdebis/leechftp/
– lsh is a free implementation of the ssh version 2 protocol
http://www.net.lut.ac.uk/psst/
Chapitre 9

Clonage d’une machine


Linux Debian

9.1 Introduction
La procédure d’installation en plusieurs étapes de la distribution Linux De-
bian permet d’installer une machine en installant juste les disquettes ”Rescue” et
”Drivers” puis en recopiant le système d’une autre machine par nfs en réseau lo-
cal. Cette procédure est une idée de Benoı̂t Speckel <Benoit.Speckel@IReS.in2p3.fr>.
Cette manoeuvre de ”clonage” est délicate en soi, elle est d’autant plus diffi-
cile que les outils dont on dispose sur la disquette rescue Debian sont vraiment
restreints et primitifs : mount, vi, zcat (filtre), star, ps, df, lilo...
Ce vi est en réalité ae qui est beaucoup plus limité que le vrai vi, ce star
n’est pas le tar de GNU.

9.2 Configuration d’une machine mère


9.2.1 Compilation d’un noyau
Il faut inclure le support de tous les devices des machines à cloner, en par-
ticulier :
– cartes Ethernet (en modules)
– disques SCSI

9.2.2 Packages
Il faut charger les packages qui seront utiles aux autres machines, au moins
au départ. En particulier :
– serveur X11 pour les différentes cartes graphiques : xserver...

9.3 Préparation archive sur machine mère


Machine mère = auger pour l’exemple.

123
124 CHAPITRE 9. CLONAGE D’UNE MACHINE LINUX DEBIAN

9.3.1 Fichier tar


Pas de -P au tar puisqu’on recopie dans /target donc se mettre dans / pour
ne pas avoir un répertoire sans nom

#!/bin/sh
# archive de clonage
ARCHIVE=~morel/clone.tar.gz
LIST=~morel/tarlist.txt
if [ ‘id -u‘ -ne 0 ]
then
echo "Vous devez etre root"
exit
fi
cd /
tar -c -z -f $ARCHIVE bin dev usr boot etc lib root var sbin \
--exclude=var/lock/* --exclude=var/spool/mail/* \
--exlude=var/log/*.gz \
--exclude=var/tmp/* --exclude=usr/src/* --exclude=var/state/apt/lists
tar tzvf $ARCHIVE > $LIST

Il faut regarder attentivement la liste de l’archive. Regarder si elle ne contient


pas des ././@LongLink pour des noms de fichiers de plus de 100 caractères. Ceci
n’est pas supporté par star. Les exclure, c’est le cas plus haut de /var/state/apt/lists.
Taille de l’archive de clonage : de l’ordre de 150 Meg.

9.3.2 Exportation
Exemple : répertoire /home/morel exporté pour les machines du réseau
193.54.230.0.

vi /etc/exports
/home/morel 193.54.230.0/255.255.255.0(ro)
:wq
/etc/init.d/nfs-server restart

193.54.230.0/255.255.255.0(ro) autorise toutes les machines de ce réseau


de classe C à monter ce répertoire.
Voyez aussi les autorisations d’accès du tcp wrapper dans /etc/hosts.allow
et /etc/hosts.deny

9.4 Installation de Debian sur la nouvelle ma-


chine
1. Initialisation
– copier resc1440.bin (rescue) et drv1440.bin (drivers) sur disquettes
par :
dd if=resc1440.bin of=/dev/fd0 bs=512 conv=sync ; sync
dd if=drv1440.bin of=/dev/fd0 bs=512 conv=sync ; sync
9.4. INSTALLATION DE DEBIAN SUR LA NOUVELLE MACHINE 125

– boot disquette rescue, échec possible (mauvaise disquette, mauvais lec-


teur)
– config clavier
– création filesystem ext2 + swap On peut la faire par le menu ou à la main
par Alt-F2. Exemple : création d’un filessystem ext2 sur /dev/hda2
avec un inode pour 16K octets, 4% d’espace réservé et contrôle des
badblocks :
mke2fs /dev/hda2 -i 16384 -m 4 -c
– montage / (sera appelé /target)
– Install Operating System & Drivers. Choisir le media d’installa-
tion : /dev/fd0
– relecture disquette rescue : mise en place noyau
– lecture disquette driver : (échec possible)
– choix des modules : net (3c509, ne2k-pci, tulip, ...), fs (nfs)
– configuration réseau
– Choose Network Interface : Choisissez eth0
2. Copie de l’archive.
Quitter le menu à Install the base system :
Alt-F2
ifconfig (test réseau: vérifiez que eth0 appara^
ıt)
mount -t nfs -o rsize=8192 auger:/home/morel /mnt
df
On doit avoir quelque chose du genre :
/dev/ram0 /
/dev/hda2 /target
auger:/home/morel /mnt
Si échec du mount, soit problème d’autorisation d’accès au serveur, diag-
nostic : mount RPC : Program not registered (voir syslog du serveur),
soit mauvaise lecture de la disquette drivers.
Copier l’archive par :
cd /target
zcat </mnt/clone.tar.gz|star
sync
sync pour être sûr que tout est écrit sur disque.
3. Paramétrage
– Configuration des filesystems à monter
On corrige les noms de devices dans fstab :
vi etc/fstab
– Configuration de lilo
Correction du lilo.conf de la machine mère : adaptez les noms des de-
vices.
vi etc/lilo.conf
On a le choix entre le noyau de l’installation Debian (vmlinuz-2.0.38)
ou le noyau copié depuis la machine mère.
Exemple :
cat etc/lilo.conf
boot=/dev/hda2
126 CHAPITRE 9. CLONAGE D’UNE MACHINE LINUX DEBIAN

root=/dev/hda2
install=/boot/boot.b
map=/boot/map
vga=normal
delay=20
image=/boot/vmlinuz-2.0.38
label=linux
read-only
Exécuter lilo. La commande lilo fait un chroot /target. C’est donc
/target/etc/lilo.conf qui est pris en compte.
– S’assurer que la partition où on met lilo est bootable
Ici /dev/hda2. Le vérifier par fdisk -l /dev/hda. si ce n’est pas le cas
basculer le flag de boot en faisant : fdisk /dev/hda
– Configuration des modules à charger au boot
Entrer en particulier le module du driver de la carte réseau
vi etc/modules
– Configuration du réseau :
Il faut changer le nom de machine et son adresse IP, l’adresse du routeur,
des DNS.
vi etc/hostname (nom machine)
vi etc/init.d/network
vi etc/resolv.conf
– Nettoyage répertoire var
– Nettoyage var/log
– Création des répertoires manquants :
mkdir tmp ; chmod 1777 tmp
mkdir proc
mkdir home
– Vérification des daemons à démarrer au boot
cd etc/rc2.d;ls
On empêchera xdm de démarrer sur la console au prochain boot (sinon
vous risquez des problèmes avec le moniteur) en mettant en commentaire
la ligne :
#:0 local /usr/bin/X11/X vt7
dans /etc/X11/xdm/Xservers
– Démontage du filesystem
cd /
umount /target

9.5 Reboot
Le filesystem /target étant démonté on peut arrêter sans crainte la machine
et la relancer.
Si LILO échoue, c’est qu’il est mal installé. On doit rebooter avec la disquette
rescue, monter la partition contenant / sur /target. On y corrige etc/lilo.conf
et réexécute lilo.
– Changer le password de root (c’est actuellement le même que sur la ma-
chine mère).
– Configurer X-Window par xf86config ou bien en allant éditer directe-
9.5. REBOOT 127

ment /etc/X11/XF86Config et /etc/X11/Xserver


– Vérifier la souris /dev/mouse ps ax|grep gpm
– Nettoyage /etc/passwd /etc/group /etc/shadow /etc/hosts,
– Charger /var/state/apt/lists
128 CHAPITRE 9. CLONAGE D’UNE MACHINE LINUX DEBIAN
Chapitre 10

Sendmail

10.1 Le service de mail de l’Internet


Le service de mail est constitué de plusieurs fonctions :
– MTA : Un Mail Transfert Agent (MTA) envoit, reçoit, route les messages
suivant le protocole SMTP. Exemples : sendmail, smail, exim, postfix.
– MDA : L’écriture des messages dans les boı̂tes aux lettres se fait par les
Mail Delivery Agent (MDA). Exemple : procmail, postfix.
– MUA : Les logiciels de messagerie qui permettent de rédiger des mes-
sages ou consulter sa boı̂te aux lettres sont des Mail User Agent (MUA).
Exemples : mail, xmailtool, exmh, elm, pine, mutt. Ces MUA peuvent
consulter des boı̂tes aux lettres sur des machines distantes par les proto-
coles POP ou IMAP : fetchmail, Netscape. Sur PC : Eudora, Netscape.
Le service est organisé de manière à ne pas perdre de message. L’expéditeur
ne reçoit de notification que lorsque la délivrance au destinataire n’a pu se faire.
Le service de mail reste le moyen qui permet de communiquer avec le plus
de personnes y compris sur des réseaux non Internet.

10.2 SMTP
C’est le protocole d’échange de mail d’Internet décrit par RFC 821 (J.B.
Postel 1982). Il utilise le port tcp 25.
Exemple d’envoi d’un mail : On tape ces lignes au clavier :

telnet machine 25
helo phoebus.c-strasbourg.fr
mail from: <chirac@elysee.fr>
rcpt to: <morel@phase.c-strasbourg.fr>
data
Date: Wed, 26 Jun 1996 11:05:01 +0200 (MET DST)
From: Jacques CHIRAC <chirac@elysee.fr>
To: <morel@phase.c-strasbourg.fr>
Subject: Felicitations

Bravo pour vos efforts en faveur du logiciel libre.

129
130 CHAPITRE 10. SENDMAIL

Presidentiellement votre.
JC
.
quit

Remarques :
– Pour chaque ligne envoyé par le client, le serveur répond, sauf quand on
est dans le corps du message.
– Les mots clés helo, mail from etc sont en majuscules ou minuscules.
– Le message, entre data et ”.” a une syntaxe décrite dans RFC 822. Il est
formé d’un en-tête composé de lignes commençant par Date, From, etc,
suivi d’une ligne vide puis du corps du message. Les indications From :,
To : qu’il contient ne serve pas au transport. Elles peuvent être falsifiées.
– Comme on le voit sur cet exemple, dans SMTP, on n’est pas assuré de
l’authenticité du message, de l’expéditeur en particulier.
– machine est un nom de machine sur laquelle un serveur de mail comme
sendmail écoute sur le port tcp 25.
Pour chaque ligne envoyé par le client, le serveur répond, sauf quand on est
dans le corps du message.

10.2.1 Codes retour


Le code renvoyé par le serveur est composé de 3 chiffres :
– Le premier chiffre indique si la réponse est bonne (2) ou s’il y a une erreur
(5).
– Le deuxième chiffre indique une erreur de syntaxe (0) ou une réponse du
“mail system” (5).

10.2.2 Test d’un service SMTP


Un test pour voir si une machine offre un service SMTP est de se connecter
sur son port 25 en TCP, exemple :

$ telnet amon.u-strasbg.fr 25
Trying 130.79.200.3...
Connected to amon.u-strasbg.fr.
Escape character is ’^]’.
220 amon.u-strasbg.fr ESMTP Sendmail 8.9.3+Sun/8.9.0; Thu, 22 Jun 2000 23:22:14 +0200
quit <-------------commande à taper
221 amon.u-strasbg.fr closing connection
Connection closed by foreign host.
[morel@zoroastre nmap-2.53]$

On lit que, sur le port 25 de la machine amon, sendmail version 8.9.3 attend
des mails.

10.2.3 Vérification de l’existence d’une boı̂te aux lettres


La commande VRFY permet de tester l’existence d’une boı̂te aux lettres.
Soit à vérifier la validité de l’adresse <jacques.morel@iness.c-strasbourg.fr>
On vérifie l’existence de la partie domaine de l’adresse par :
10.3. EXTENSIONS À SMTP : ESMTP, MIME 131

$ host -t mx iness.c-strasbourg.fr
iness.c-strasbourg.fr mail is handled by 5 zoroastre.c-strasbourg.fr

Le serveur de mail à contacter est donc zoroastre.c-strasbourg.fr. On


le fait en appelant le serveur par nc sur le port 25 et en passant la commande
vrfy jacques.morel :

$ nc zoroastre.c-strasbourg.fr 25
220 auger.c-strasbourg.fr ESMTP Sendmail 8.12.3/8.12.3/Debian-7.1;
Wed, 21 Sep 2005 19:06:53 +0200; (No UCE/UBE)
logging access from: helios.c-strasbourg.fr(OK)-morel@helios.c-strasbourg.fr [193.54.230.78]
vrfy jacques.morel
250 2.1.5 <jacques.morel@auger.c-strasbourg.fr>
quit
221 2.0.0 auger.c-strasbourg.fr closing connection

– Le serveur s’annonce par une ligne commençant par le code 220 et se


terminant par l’adresse IP de la machine appelante.
– Le client envoie vrfy jacques.morel
– Le serveur répond 250 2.1.5 <jacques.morel@auger.c-strasbourg.fr>.
Le code 250 est une réponse positive, suit l’adresse légale (zoroastre est
un alias de auger).
Une réponse négative est accompagnée du diagnostic User unknown :

$ nc zoroastre 25
220 auger.c-strasbourg.fr ESMTP Sendmail 8.12.3/8.12.3/Debian-7.1;
Wed, 21 Sep 2005 19:17:16 +0200; (No UCE/UBE)
logging access from: helios.c-strasbourg.fr(OK)-morel@helios.c-strasbourg.fr [193.54.230.78]
vrfy dupond
550 5.1.1 dupond... User unknown
quit
221 2.0.0 auger.c-strasbourg.fr closing connection

Attention, des serveurs peuvent renvoyer toujours une réponse positive.

10.2.4 Vérification d’un alias


La commande EXPN de RFC 821 permet de résoudre (expand) les alias.
Cherchons par exemple qui est l’administrateur de la machine zoroastre.c-strasbourg.fr :

$ nc zoroastre.c-strasbourg.fr 25
expn root
250 2.1.5 Jacques Morel <morel@auger.c-strasbourg.fr>

Cette possibilité permet bien des indiscrétions. Il est possible de la supprimer


sur le serveur.

10.3 Extensions à SMTP : ESMTP, MIME


SMTP est un protocole très simple dont le principal inconvénient est de
n’autoriser que les caractères ASCII sur 7 bits. Il y a deux extensions :
132 CHAPITRE 10. SENDMAIL

– ESMTP : RFC 1651, permet de coder les caractères sur 8 bits. Il les
accepte du client et, si le destinataire ne les supporte pas, sait recoder sur
7 bits (8BITMIME). Le mot clé EHLO à la place de HELO invite le serveur
à indiquer les extensions qu’il supporte.
– MIME : RFC 2045 à 2049, permet :
– plusieurs corps dans un message, chacun étant marqué par Content-Type :
– chaque corps a un type MIME sous la forme type/sous-type, exemple :
text/plain. Les types sont text, image, application, audio, video,
multipart, message
– la représentation de tout caractère sur 7 ou 8 bits : un corps peut
être encodé en 7bit, quoted-printable (représentation presque li-
sible de caractères accentués : ”=” suivi des deux chiffres hexa du ca-
ractère), base64 (codage de 3 octets sur 4, c’est à dire découpe 24 octets
consécutifs (3 x 8) en 4 paquets de 6 bits, 6 bits suffisant pour représenter
un caractère dans un alphabet commun à toutes les machines), 8bit,
binary (codage sur 8 bits)
– l’indication du jeu de caractère utilisé, exemple : charset=iso-8859-1

10.4 Interaction avec le DNS


Le DNS comporte des entrées MX qui indiquent pour un domaine particulier
vers quelle machine le message doit être envoyé. Exemple :
host -t mx phase.c-strasbourg.fr
phase.c-strasbourg.fr MX 5 zoroastre.c-strasbourg.fr
Ainsi le courrier destiné à dupond@phase.c-strasbourg.fr sera envoyé sur
la machine zoroastre.c-strasbourg.fr . phase.c-strasbourg.fr ne désigne
pas une machine.
On peut utiliser les MX records pour forcer le courrier à passer par une
machine centrale, ou pour atteindre des machines qui sont sur un autre réseau
qu’Internet.

10.5 Caractéristiques de Sendmail


Sendmail est un MTA, il :
– envoie des messages
– reçoit
– route (relayage)
– fait délivrer les messages dans les boı̂tes aux lettres
– gère la file d’attente
Sendmail est en concurrence dans Linux Debian avec exim et smail qui sont
plus simples.
Sendmail date de 1983 et a pour auteur Eric Allman. Il reste le MTA le plus
utilisé (55%), c’est surtout le plus fiable.
Quelques caractéristiques de sendmail 8.9.3 :
– Le relayage est interdit par défaut. Le relayage consiste à recevoir un
message non destiné à la machine locale et à le renvoyer vers la machine
destinataire réelle. C’est beaucoup utilisé par ceux qui font de la publicité
sauvage sur le réseau.
10.6. INSTALLATION 133

– Les messages dont le nom de domaine indiqué dans le champ Mail from
n’existent pas dans le DNS sont rejetés.

10.6 Installation
Package Debian sendmail Version : 8.12.3-7.1 (woody), 8.13.4-3 (sarge).
Sendmail nécessite aussi les packages libdb2 (gestion de base de données),
m4 (macro-processeur), procmail (délivrance des messages dans les boı̂tes aux
lettres)
Debian propose un shell script de configuration sendmailconfig qui s’exécute
lors de la configuration du package :
– Le fichier de macros /etc/mail/sendmail.mc est créé,
– son traitement par le macro-processeurm4 donne le fichier /etc/mail/sendmail.cf
qui est le fichier de configuration de sendmail. Les macros m4 pour send-
mail se trouvent dans /usr/share/sendmail.cf
– sendmail est lancé
A la suite on peut corriger cette configuration en éditant /etc/mail/sendmail.mc
et en refaisant exécuter m4.

10.7 Documentation
Elle se trouve dans le package à part sendmail-doc.

10.7.1 Documentation sur la configuration


– Configuration par m4
zmore /usr/doc/sendmail/cf.README.gz
– Installation, emploi de sendmail et description du fichier sendmail.cf :
zmore /usr/share/doc/sendmail-doc/op/op.txt.gz
gzip -cd /usr/share/doc/sendmail-doc/op/op.ps.gz|gv -
Ou impression par :
gzip -cd /usr/doc/sendmail/op.ps.gz|lpr

10.8 Configuration
Fichiers :
– /etc/mail/sendmail.mc : configuration en syntaxe m4 pour générer sendmail.cf
– /etc/mail/sendmail.cf : configuration de sendmail
– /etc/mail/sendmail.cw : noms de domaines pour lesquels nous accep-
tons le mail comme local.
– /etc/mail/sendmail.ct : noms des utilisateurs habilités à changer le
champ mail from :
Méthode recommandée :
– copier /etc/mail/sendmail.mc dans un répertoire accessible par vous
sans être root :
mkdir ~/adm/sendmail
cd ~/adm/sendmail
cp /etc/mail/sendmail.mc config.mc
134 CHAPITRE 10. SENDMAIL

– Vérifier que votre fichier contient en tête une ligne :


include(‘/usr/share/sendmail.cf/m4/cf.m4’)
– Création du fichier config.cf
m4 config.mc > config.cf
– Examiner config.cf
– Test de la config : créer un fichier address.resolve contenant des adresses
à tester.
cat > address.resolve << END
user
user@ma_machine
user@phase.c-strasbourg.fr
Paul.Auchon@trou.la.la.fr
...
END
checksendmail -C ~/adm/sendmail/config.cf > test.txt
Examinez le fichier test.txt. Vous y voyez toutes les transformations d’adresse
faites.
– Si on est satisfait, on peut installer la nouvelle configuration sous root :
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old
cp config.cf /etc/mail/sendmail.cf
chmod 644 /etc/mail/sendmail.cf

10.8.1 Une configuration de ”mail host”


Un ”mail host” est un MTA autonome. Fichier config.mc
divert(-1)
include(‘/usr/share/sendmail.cf/m4/cf.m4’)
define(‘confDEF_USER_ID’,‘‘8:8’’)dnl uid:gid pour mail cf /etc/passwd
define(‘confCHECK_ALIASES’,‘True’)
OSTYPE(‘linux’)
undefine(‘UUCP_RELAY’)
undefine(‘BITNET_RELAY’)
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)dnl sendmail reads /etc/sendmail.cw to get alternate names
define(‘confMAX_MESSAGE_SIZE’, ‘3000000’)
define(‘PROCMAIL_MAILER_PATH’, ‘/usr/bin/procmail’)
FEATURE(access_db, hash -o /etc/mail/access)
FEATURE(‘virtusertable’, ‘hash -o /etc/mail/virtusertable’)dnl
FEATURE(local_procmail)
MAILER(procmail)
MAILER(smtp)
– Les commandes define affectent des valeurs à des paramètres
– confDEF USER ID : fixe le uid et le gid pour le userid mail cf /etc/passwd
– confCHECK ALIASES : si True quand on fait newaliases va vérifier que
l’adresse en partie droite est une adresse déclarée dans le DNS (prend du
temps)
– OSTYPE(‘linux’) implique des options par défaut sur la localisation des
fichiers voir /usr/share/sendmail.cf/ostype/linux.m4 qui ne contient
10.8. CONFIGURATION 135

que :
define(‘LOCAL_MAILER_PATH’, /bin/mail.local)dnl
– undefine(‘UUCP RELAY’) : met à indéfini ce paramètre : je ne fais pas
relais pour UUCP ni BITNET
– FEATURE(redirect) : rejette tout mail pour les adresses notées ”address.REDIRECT”
dans /etc/aliases avec un message d’erreur : ‘551 User not local ; please
try address”. Exemple :
noel:noel@jipelec.com.REDIRECT
– FEATURE(always add domain) : ajoute le nom du domaine local aux adresses
non fqdn. Exemple : morel@zoroastre est transformé en morel@zoroastre.c-
strasbourg.fr
– FEATURE(use cw file : le fichier /etc/mail/sendmail.cw est utilisé pour
indiquer des alias. Il contient par exemple :
phase.c-strasbourg.fr
goa.c-strasbourg.fr
strasbourg.linuxfr.org
Il indique que tout courrier pour ces adresses doit être délivré localement.
– define(‘confMAX MESSAGE SIZE’, ‘5000000’) : taille maximum en oc-
tets pour un message reçu, sinon renvoit avec un diagnostic.
– FEATURE(access db, hash -o /etc/mail/access) : permet d’accepter
ou de refuser des messages. /etc/mail/access est une table qui sera
transformée en base de donnée accédée par hash coding. Exemple de
contenu :
193.54.230 OK
rtc1.u-strasbg.fr RELAY
usa.com 550 We don’t accept mail from spammers
tnt2.everett.wa.da.uu.net 550 We don’t accept mail from spammers
www.free2blieve.com 550 We don’t accept mail from spammers
– OK : J’accepte les mails en provenance de mon réseau 193.54.230.
– RELAY : J’accepte de relayer (=router) les messages en provenance de
cette machine
– usa.com je renvoie un message d’erreur (550) avec ce libellé. (les codes
d’erreur sont décrits dans RFC 821)
– define(‘PROCMAIL MAILER PATH’, ‘/usr/bin/procmail’) : indique où
se trouve procmail
– FEATURE(local procmail) : dit que le courrier local sera délivré par proc-
mail
– MAILER(procmail) : déclare le mailer procmail
– MAILER(smtp) : déclare le mailer smtp
Les bases de données access-db sont créées par :

cat /etc/mail/virtusertable|makemap -v hash /etc/mail/virtusertable


cat /etc/mail/access|makemap -v hash /etc/mail/access

10.8.2 Limitation de la taille des messages


Il est nécessaire de mettre une limite de la taille des messages envoyés
ou reçus, faute de quoi le serveur risque des problèmes d’allocation de pages
mémoires. La limite doit être établie en fonction de la taille de la mémoire Ram
et de la swap disponible. On peut contrôler cette taille à l’émission par smtp ou
136 CHAPITRE 10. SENDMAIL

en local et à la réception.
– define(‘confMAX MESSAGE SIZE’, ‘5000000’) : taille maximum en oc-
tets pour un message reçu, sinon envoi d’un diagnostic.
– define(‘SMTP MAILER MAX’, ‘20000000’) : taille maximum en octets
pour un message transporté par smtp, esmtp ou smtp8.
– define(‘PROCMAIL MAILER MAX’, ‘20000000’) : taille maximum en oc-
tets pour un message délivré par procmail.

10.8.3 Suppression de la résolution d’alias par EXPN


La commande M4 :

define(’confPRIVACY_FLAGS’, ’needmailhelo, noexpn’)

génère dans sendmail.cf :

O PrivacyOptions=needmailhelo, noexpn

Oblige qu’une commande HELO ou EHLO soit passée avant la commande


MAIL et interdit la commande EXPN.

10.8.4 Une configuration de null client


Un null-client est une machine dont le sendmail renvoie tout le courrier à
une autre dite smart host. La configuration doit comporter des règles antire-
layage. Mais comme cette machine n’a pas à recevoir de mail il est préférable
de ne pas laisser tourner sendmail en daemon. Il sera appelé à chaque fois qu’il
faut envoyer un message, mais il n’a pas à écouter le port 25.
Fichier config.mc :

divert(-1)
include(‘/usr/share/sendmail.cf/m4/cf.m4’)
OSTYPE(‘linux’)
undefine(‘ALIAS_FILE’)
define(‘SMART_HOST’, ‘zoroastre.c-strasbourg.fr’)
define(‘confFORWARD_PATH’, ‘’)
MASQUERADE_AS(‘phase.c-strasbourg.fr’)
FEATURE(‘allmasquerade’)
FEATURE(‘masquerade_envelope’)

– SMART HOST : ici tout le courrier est renvoyé sur la machine zoroastre
– MASQUERADE AS : fait apparaı̂tre le mail comme venant du domaine phase.c-strasbourg.fr

10.8.5 Sites miroirs pour tests


Ce sont des adresses qui font écho aux mails qu’elles reçoivent :

echo@univ-rennes1.fr
echo@cnam.fr
ping@oleane.net
echo@alma.fr
10.9. EXPLOITATION DE SENDMAIL 137

10.9 Exploitation de sendmail


10.9.1 Sécurité
Etant suid-root, sendmail est très exposé aux attaques. Il est donc recom-
mandé de fermer l’accès entrant au port smtp (25) de toute machine sauf pour
un mail host.
sendmail est sous tcp-wrapper en Debian : inclure dans /etc/hosts.allow :

sendmail: all

On peut par la suite faire des restrictions d’accès.

10.9.2 Commandes d’exploitation


– runq : force le traitement de la file d’attente des messages localisée dans
/var/spool/mqueue Shell script Debian exécutant sendmail -q
– newaliases : refait la base de données des alias à partir de /etc/aliases
– mailq : interroge la file d’attente des messages /var/spool/mqueue
– /usr/sbin/makemap : construit des base de données pour sendmail

10.9.3 Alias
Ils sont entrés dans le fichier /etc/aliases. Exemple :

# Basic system aliases -- these MUST be present.


MAILER-DAEMON: postmaster
postmaster: root
FaxMaster: root
# Person who should get root’s mail
root: morel
# Other aliases
Jacques.Morel: morel
labo: morel, dupond, durant,
Paul.Hauchon@truc.u-strasbg.fr,
"|cat >>/usr/local/doc/archive-labo.txt"
congres: ":include:/home/morel/congres/adr.txt"

– le courrier pourroot, postmaster, etc est envoyé à morel


– le courrier pour Jacques.Morel est envoyé à morel
– labo est une liste : tout courrier envoyé à labo sera redistribué à morel,
dupond, etc
– "|cat >>/usr/local/doc/phase archive.txt" est une commande exécutée
par sendmail : elle copie le message à la liste labo au bout du fichier indiqué
– congres est aussi une liste contenu dans le fichier indiqué

10.9.4 Réglages fins


– messages timeouts : si la machine destinataire n’est pas joignable, sendmail
envoie à l’expéditeur un avertissement au bout de 4h et au bout de 5 jours
le prévient qu’il détruit le message. Ceci peut être modifié par l’option
OT5d/4h de sendmail.cf ou dans sendmail.mc par :
138 CHAPITRE 10. SENDMAIL

define(’confTO_QUEUERETURN’, ’6d’)
define(’confTO_QUEUEWARN’, ’8h’)

10.9.5 Fichier Log


L’activité de sendmail est enregistrée dans /var/log/mail.log. Exemple
d’entrée :

Dec 8 10:35:34 zoroastre sendmail[6112]: KAA06112:


from=<patrick.mussot@caes.cnrs.fr>, size=1329, class=0, pri=31329,
nrcpts=1, msgid=<01C06102.80912A80.patrick.mussot@caes.cnrs.fr>,
proto=ESMTP, relay=callisto.caes.cnrs.fr [194.57.123.5]
Dec 8 10:35:34 zoroastre sendmail[6113]: KAA06112:
to=<bentz@phase.c-strasbourg.fr>, delay=00:00:01, xdelay=00:00:00,
mailer=local, stat=Sent

– une entrée fait une ligne, ici découpée pour la clarté.


– chaque message est identifié par sendmail, ici KAA06112
– on voit qu’une transaction fait au moins deux entrées (réception, émission)
Regarder aussi le fichier /var/log/mail.err

10.10 Routage d’un domaine virtuel avec send-


mail
Exemple : rediriger le courrier à destination du domaine strasbourg.linuxfr.org
vers tux.u-strasbg.fr
Au niveau du DNS :

$host -t mx strasbourg.linuxfr.org
strasbourg.linuxfr.org MX 100 zoroastre.c-strasbourg.fr

Au niveau de la configuration de sendmail sur zoroastre : sendmail doit


accepter les courriers pour le domaine strasbourg.linuxfr.org et les router
sur tux.u-strasbg.fr
zoroastre.mc contient :

FEATURE(‘use_cw_file’)dnl
FEATURE(‘virtusertable’, ‘hash -o /etc/mail/virtusertable’)dnl

On crée sendmail.cf par :

#m4 zoroastre.mc > zoroastre.cf


#cp zoroastre.cf /etc/mail/sendmail.cf
#chmod 644 /etc/mail/sendmail.cf

/etc/mail/sendmail.cw contient :

strasbourg.linuxfr.org

/etc/mail/virtusertable contient :

@strasbourg.linuxfr.org %1@tux.u-strasbg.fr
10.10. ROUTAGE D’UN DOMAINE VIRTUEL AVEC SENDMAIL 139

On crée la ‘virtusertable’ et on fait relire à sendmail sa configuration par :


#cd /etc/mail
#makemap hash virtusertable < virtusertable
#kill -HUP sendmail.pid
140 CHAPITRE 10. SENDMAIL
Chapitre 11

Apache

11.1 Le serveur WWW Apache


11.1.1 WWW
HTTP, Hyper Text Transfer Protocol et HTML, Hyper Text Markup Lan-
guage, ont été conçu au CERN en 1989 par Tim Berners-Lee qui a voulu im-
pulser :
‘‘A wide-area hypermedia information retrieval initiative aiming to
give universal access to a large universe of documents’’
HTTP est l’extension de la technique hypertexte au réseau. Un hypertexte
est un texte contenant des renvois à d’autres textes (comme dans le programme
info de GNU). Ces renvois sont des pointeurs désignant le texte avec sa localisa-
tion. En HTTP, on appelle ce renvoi URL (Uniform Ressource Locator ) appelé
maintenant URI (Uniform Ressource Identifier ). Dénomination bien connue du
type :
methode://serveur:port/fichier#fragment?paramètres
qui est devenue un standard (RFC 1738) très utilisé.
La fonction d’un serveur Web est de répondre aux requêtes de différentes
ressources (pages html, images, scripts, feuilles de style,...) faites par des clients
suivant le protocole HTTP. Une ressource peut être aussi l’exécution d’un pro-
gramme sur le serveur. Dans ce cas la réponse du programme est renvoyée par
le serveur sous forme d’une page HTML. L’interfaçage entre le serveur http et
le programme s’appelle CGI (Common Gateway Interface).
Le premier serveur httpd vient du CERN, le premier client MOSAIC de
NCSA. Apache est l’héritier du serveur httpd de NCSA. Apache est un des
serveurs les plus utilisés sur Internet.

11.1.2 HTTP
Versions de HTTP :
– HTTP/0.9
– RFC 1945 : Hypertext Transfer Protocol – HTTP/1.0. T. Berners-Lee, R.
Fielding & H. Frystyk. May 1996.

141
142 CHAPITRE 11. APACHE

– RFC 2068 : Hypertext Transfer Protocol – HTTP/1.1. R. Fielding, J.


Gettys, J. Mogul, H. Frystyk, T. Berners-Lee. January 1997.
– RFC 2616 : Hypertext Transfer Protocol – HTTP/1.1. R. Fielding, J.
Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee. June
1999.
HTTP est un protocole sans état dans la mesure où le serveur traite chaque
transaction indépendemment des autres. Il n’y a pas de notion de session du
moins à l’origine car il est prévu depuis RFC 2068 des connexions persistantes.
Il prévoit le typage de la représentation des données (Type MIME) et maintenant
la possibilité de négocier ce type : un client peut dire je préfère des documents
en français et des images au format *.png.

HTTP/1.1
Requête du client Une requête du client au serveur en HTTP/1.1 s’écrit sur
deux lignes :

Method SP Request-URI SP HTTP-Version CRLF


Host: domain-server-name CRLF

Il peut s’y ajouter des lignes ”Request Header Fields” permettant de passer
des paramètres supplémentaires :
– If-Modified-since : voir GET conditionnel plus loin.
– Accept-Language : préférence sur la langue
– Accept : préférence sur les types de media
– ...
Exemple de préférences pondérées par un coefficient q envoyées par un client :

Accept-Language: fr; q=1.0, en; q=0.5


Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6,
image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1

– Method
– OPTIONS
– GET : demande la ressource indiquée par l’URI
– HEAD : fournit des infos sur la page demandée (Last-Modified, Content-Length,
Content-Type...)
– POST : transfert de données à l’URI indiquée (utilisé pour les réponses
à un formulaire)
– PUT : écriture d’une ressource sur le serveur
– DELETE : demande au serveur d’effacer la ressource associée à l’URI
– TRACE
– Request-URI : URI terme un peu plus général que URL. Même syntaxe.
– HTTP-Version : HTTP/1.0 ou HTTP/1.1
En principe HTTP utilise le port TCP 80.
Exemple de requête :
Avec HEAD :

HEAD / HTTP/1.1
Host: www-phase.c-strasbourg.fr

Avec OPTIONS :
11.1. LE SERVEUR WWW APACHE 143

OPTIONS * HTTP/1.1
host: www-phase.c-strasbourg.fr
Avec GET :
GET /phase.html HTTP/1.1
host: www-phase.c-strasbourg.fr
Exemple d’interrogation par telnet. C’est un bon test pour savoir si votre
serveur apache marche :
$ telnet localhost 80
Trying 193.54.230.20...
Connected to zoroastre.c-strasbourg.fr.
Escape character is ’^]’.
HEAD / HTTP/1.1 <----- entré au clavier
Host: www-phase.c-strasbourg.fr <----- entré au clavier

HTTP/1.1 200 OK
Date: Wed, 14 Jun 2000 18:34:27 GMT
Server: Apache/1.3.3 (Unix) Debian/GNU
Last-Modified: Tue, 18 Jan 2000 15:13:24 GMT <---- date maj page d’accueil
ETag: "d98af-1476-38848314"
Accept-Ranges: bytes
Content-Length: 5238
Content-Type: text/html

Connection closed by foreign host.


Pour un contrôle :
$ ls -l /var/www/phase/phase.html
-rw-rw-r-- 1 morel web 5238 Jan 18 16:13 /var/www/phase/phase.html

Réponse du serveur Toute réponse du serveur est précédée d’un en-tête fait
d’une ou plusieurs lignes dont :
– Une Status-Line toujours présente au début :
HTTP-Version SP Status-Code SP Reason-Phrase CRLF
– Content-type : mime type
– Content-length : longueur du document
– Last-Modified : date mise à jour
– Expires : durée de validité du document (optionnel) C’est une informa-
tion sur la durée de validité du document, sa date de fraı̂cheur en quelque
sorte.
– et d’autres entity header
– CRLF une ligne vide

Exemple d’en tête :
HTTP-1.1 301 Now where did I leave that URL
Location: http://xyz.abc.com/foo/bar.html
Content-type: text/html
On voit ces en-têtes quand par telnet on passe des commandes HEAD.
144 CHAPITRE 11. APACHE

HTTP/1.0
HTTP/1.0 est beaucoup plus simple : il ne supporte que 3 méthodes : GET,
POST, HEAD, OPTIONS et il n’y a pas à envoyer de ligne Host :
Apache le supporte aussi. Exemple de requête :
GET /phase.html HTTP/1.0 CRCR
(la requête doit être suivi de deux retour chariot).
Autre exemple :
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is ’^]’.
OPTIONS * HTTP/1.0

HTTP/1.1 200 OK
Date: Sun, 18 Jun 2000 18:09:00 GMT
Server: Apache/1.3.3 (Unix) Debian/GNU
Content-Length: 0
Allow: GET, HEAD, OPTIONS, TRACE
Connection: close

Connection closed by foreign host.

GET
La commande GET permet de demander une ressource par un URI, mais
en plus, on peut coller des paramètres à la suite de l’URI. Dans ce cas, la
ressource est un programme ou un script que le serveur http fait exécuter en lui
transmettant ces paramètres. Les résultats sont des pages HTML que le serveur
renvoie au client (voir programmes CGI). La syntaxe est :
GET URI?param-1=val-1&param-2=val-2& ... &param-n=val-n
Où param-i sont des noms de variables et val-i des chaı̂nes de caractères
où les blancs sont remplacés par des + et les caractères ascii > 120 codés sous
la forme %xx.
GET conditionnel : Un GET suivi d’une condition du type :
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
permet de ne demander au serveur l’envoi de la ressource associée à l’URI
que si celle-ci est plus récente que celle qu’il a dans son cache (spécifique à
HTML/1.1). Il existe d’autres types de conditions.

11.2 Caractéristiques de Apache


C’est un logiciel libre produit par une coopération organisée entre les volon-
taires qui ont continué à améliorer le serveur httpd de NCSA. Apache reprend
tous les paramètres de configuration de httpd NCSA.
Ses caractéristiques :
11.3. DOCUMENTATION 145

– choix de modules qui se chargent quand apache démarre (Dynamic Shared


Objects), grande variété de modules
– interface de programmation pour écrire des modules
– sites virtuels : un même serveur peut héberger plusieurs sites Webs.

11.3 Documentation
– http://www.apache.org/
– ”Apache” par Ben et Peter Laurie Editions O’Reilly (pas fameux, traduc-
tion française pire)
– la doc fournie dans le package Debian apache-doc
Utilisation :
lynx /usr/doc/apache/manual/index.html
ou bien, si Apache fonctionne par :
lynx http://localhost/doc/apache/manual/index.html

11.4 Installation
En Debian, Apache vient en 4 modules :
1. apache : Apache version 1.3.3-7 conforme à RFC-2068
2. apache-common : modules, utilitaires, icones
3. apache-doc : /usr/doc/apache/manual/
4. apache-utils
A l’installation Debian propose une configuration interactive. Il est recom-
mandé au début de prendre les options par défaut proposées, il est toujours
possible de revenir dessus plus tard.

Who should the ServerAdmin be? morel@phase.c-strasbourg.fr


What port should Apache listen on? [80]
Do you want to manually choose which modules to load? [y/N] RC

Prendre les choix par défaut de Debian (noté en majuscule) en tapant RC.

11.5 Lancement de Apache


On peut faire fonctionner Apache à travers inetd mais ce n’est pas du tout
recommandé pour des questions de rapidité de service : on l’utilise donc en
daemon et dés le départ, apache se multiplie en plusieurs copies. En Debian elle
se fait par le script :

/etc/init.d/apache start

Lancez apache faites : ps auxf|grep apache, vous voyez plusieurs process


apache : le père a le userid root, les fils www-data. Le père ne traite pas de
requêtes des clients, c’est trop dangereux. Il s’occupe juste de créer des fils, ou
d’en tuer !
146 CHAPITRE 11. APACHE

$ ps auxf|grep apache
USER PID %CPU %MEM SIZE RSS TTY STAT START TIME COMMAND
root 13021 0.9 0.8 1904 1132 ? S 20:32 0:00 /usr/sbin/apache
www-data 13022 0.0 0.8 1924 1128 ? S 20:32 0:00 \_ /usr/sbin/apache
www-data 13023 0.0 0.8 1924 1128 ? S 20:32 0:00 \_ /usr/sbin/apache
www-data 13024 0.1 0.8 1924 1128 ? S 20:32 0:00 \_ /usr/sbin/apache
www-data 13025 0.1 0.8 1924 1128 ? S 20:32 0:00 \_ /usr/sbin/apache
www-data 13026 0.1 0.8 1924 1128 ? S 20:32 0:00 \_ /usr/sbin/apache

11.6 Configuration
Les fichiers de configuration sont dans /etc/apache.
Suivant la tradition de httpd NCSA il y a 3 fichiers de configuration :
– httpd.conf : paramètres généraux de fonctionnement + virtuals hosts
– access.conf : restrictions d’accès
– srm.conf : répertoires accessibles aux clients
mais il est fortement recommandé de les fusionner dans httpd.conf. En
plus, il y a le fichier mime.types
Debian ajoute un cron.conf pour faire tourner les logs.
Configuration minimale : Elle se fait en éditant le fichier httpd.conf qui est
abondamment commenté :

11.6.1 Paramètres généraux


ServerType standalone
Port 80
User www-data <-------
Group www-data <-------
ServerAdmin morel@phase.c-strasbourg.fr <-------
ServerRoot /etc/apache
BindAddress *
LoadModule env_module /usr/lib/apache/1.3/mod_env.so <-------
LoadModule ... <-------
ErrorLog /var/log/apache/error.log <-------
LogLevel warn
LogFormat ...
CustomLog /var/log/apache/access.log common <-------
PidFile /var/run/apache.pid
LockFile /var/run/apache.lock
ServerName www-phase.c-strasbourg.fr <-------
MinSpareServers 1
MaxSpareServers 5
StartServers 1
MaxClients 150
En Debian tout est configuré convenablement. Vous devez faire attention au
minimum aux paramètres suivants :
– www-data : c’est le userid et le groupe sous lesquels les copies de apache
s’exécute (et les programmes CGI). D’autres distributions Linux utilisent
nobody.
11.6. CONFIGURATION 147

– ServerRoot : c’est le répertoire où vont se trouver les fichiers de configu-


ration /etc/apache en Debian.
– LoadModule : choix des modules, c’est important, mais au début vous vous
laissez guider par les choix par défaut de Debian.
– ErrorLog, CustomLog : emplacement des fichiers logs.
– ServerName : c’est évidemment important. Cela ne se déduit pas automa-
tiquement du nom de la machine car souvent, comme chez moi, c’est un
alias (un RR de type CNAME dans le DNS)
– Pour les autres paramètres, les logs, le nombre de serveurs, laissez les
défauts, vous verrez plus tard

11.6.2 Configuration des ressources


DocumentRoot /var/www/phase <------------
UserDir public_html <------------
DirectoryIndex index.html
FancyIndexing on
...
AddLanguage en .en
...
LanguagePriority en fr de
AccessFileName .htaccess <------------
Alias /icons/ /var/www/icons/ <------------
ScriptAlias /cgi-bin/ /var/www/cgi-bin/ <------------
Alias /doc/ /usr/doc/ <------------

– DocumentRoot : c’est le répertoire racine de l’arborescence des pages Web.


On peut en mettre ailleurs, voir directive Alias.
– UserDir : c’est le répertoire dans les Home directory des utilisateurs où se
trouveront leurs pages web personnelles accessibles par : httt ://url de votre site/~userid
– DirectoryIndex : indique que lorsque un client demande un répertoire
(il termine l’URL par / ou non, voir mod dir), on lui fournit la page
index.html
– AccessFileName : nom du fichier contenant des restrictions d’accès que
l’on peut placer dans un répertoire (dépend de AllowOverride)
– ScriptAlias : répertoire dont les fichiers s’exécutent comme des script
CGI : /cgi-bin/ est l’URL path (correspond à http ://serveur/cgi-bin)
/var/www/cgi-bin/ est le nom du répertoire correspondant (dans l’arbo-
rescence Unix)
– Alias : permet de ranger des documents ailleurs que dans DocumentRoot.
L’URL : http ://serveur/doc/) (n’oubliez pas le /) pointe sur le répertoire/usr/doc/
de l’arborescence Unix. Cette spécificité Debian fait que toute la doc est
lisible par le Web.

11.6.3 Restrictions d’accès


<Directory /var/www> <------------
Options Indexes FollowSymLinks <------------
AllowOverride None <------------
order allow,deny <------------
148 CHAPITRE 11. APACHE

allow from all <------------


</Directory>

<Directory /var/www/cgi-bin>
AllowOverride None
Options ExecCGI FollowSymLinks
</Directory>

<Location /cgi-bin/phf*>
deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
</Location>
# Debian Policy assumes /usr/doc is "/doc/", at least from the localhost.

<Directory /usr/doc>
Options Indexes FollowSymLinks
AllowOverride None
order allow,deny
allow from all
</Directory>

<DirectoryMatch ^/home/.*/public_html>
Options SymLinksIfOwnerMatch Indexes
AllowOverride None
</DirectoryMatch>

– Directory /var/www : règles d’accès au répertoire /var/www et à ses sous-


répertoires.
– Options Indexes FollowSymLinks ExecCGI
– Indexes : si le client demande une URL correspondant à un répertoire et
qu’il n’y a pas de fichier index.html le serveur envoie une liste formattée
du répertoire. Donc tous les fichiers du répertoire sont visibles à un client
Web. C’est donc une option déconseillée.
– FollowSymLinks : le serveur suit les liens symboliques : utile pour
mettre en consultation par apache des documents qui ne sont pas dans
l’arborescence DocumentRoot. SymLinksIfOwnerMatch, ne suit le lien
que si le fichier pointé a le même owner que le répertoire qui contient
ce lien symbolique.
– ExecCGI : exécution des scripts CGI autorisée dans ce répertoire
– AllowOverride None : fichier .htaccess non pris en compte
– order allow,deny : traitement des règles dans cet ordre
– allow from all : accès ouvert à tout le monde.
– ErrorDocument : En cas d’erreur Apache sort par défaut un code d’erreur,
mais il peut aussi afficher un message ou rediriger sur une autre URL, c’est
le cas ici. Autre exemple :
ErrorDocument 403 "Sorry can’t allow you access today
– Directory /usr/doc : La convention Debian est de donner accès par le
Web au répertoire /usr/doc par l’URL :
http://machine_Linux_Debian/doc/
(Ne pas oublier le /).
11.7. LES MODULES. 149

– DirectoryMatch : règles d’accès qui ne s’appliquent qu’aux répertoires


qui satisfont les expressions régulières indiquées. Ici les noms de fichier
qui commencent par /home et se terminent par public html.
Si plusieurs directives Options s’appliquent à une même répertoire, elles ne
se cumulent pas. Mais on peut faire précéder chaque option d’un signe “+” ou
“-”. Une option précédée d’un “+” s’ajoute par rapport à celle en cours, une
précédée d’un “-” se retranche.

11.7 Les modules.


On les choisit soit en éditant /etc/apache/httpd.conf soit en rappelant
/usr/sbin/apacheconfig (faire man apacheconfig).
En Debian Sarge, on exécute :

/usr/sbin/apache-modconf apache

qui met à jour /etc/apache/modules.conf.

Support for passing environment to CGI? [y/N]

Module : mod env


Action : passe des variables d’environnements aux scripts CGI/SSI
Support for configurable logfiles [required]? [Y/n]
Module : mod log config
Action : permet de faire des Logs (directive TransferLog) et de définir
des formats (directive LogFormat), de créer un Log avec un format (directive
CustomLog)
Support for regex based translations [standard]? [Y/n]
Module : mod rewrite
Action : permet de réécrire des URL à la volée à l’aide d’expressions régulières
(comme sendmail sait faire de la réécriture d’adresse). On peut ainsi passer des
arguments avec de ”fausses” URL.
Directives : Rewrite...
Support for determining types automagically? [y/N]
Module : mod mime magic
Action : détermine le type MIME d’un fichier en examinant les premiers
octets comme la commande file de Unix.
Directives : MimeMagicFile
Support for determining document types [required]? [Y/n]
Module : mod mime
Action : gére une ”meta information”, le Mime type pour chaque document.
En plus un handler peut être défini, il détermine le traitement d’un fichier par
le serveur. Les directives AddEncoding, AddHandler, AddLanguage and AddType
sont utilisées pour déterminer le type en fonction de l’extension du fichier. Elles
fixent respectivement le Content-encoding, le handler, le Content-language
et le MIME-type (ou Content-type) du document.
150 CHAPITRE 11. APACHE

Support for content negotiation [required]? [Y/n]


Module : mod negotiation
Action : permet de sélectionner un document qui convient le mieux aux
caractéristiques du client. Apache propose deux méthodes :
– Option MultiViews : On peut ainsi sélectionner la langue, (Directives
AddLanguage), le type d’image.
– un handler type-map permet de définir un fichier où sont indiquées des
alternatives

Support for server status info? [y/N]

Module : mod status


Action : donne l’état du serveur sous forme d’une page HTML : nombre de
fils actifs, oisifs, statistiques sur les accès.
Support for server configuration info? [y/N]
Module : mod info
Action : Informe sur les modules et les directives de configuration On l’in-
terroge par :
http://your.host.dom/server-info
Directive AddModuleInfo
Support for server-parsed HTML (XBitHack)? [y/N]
Module : mod include
Action : active les Server-Side Includes. Tout document avec l’extension
*.shtml sera analysé par ce module si Option +Includes figure pour les répertoires
contenant ces pages. Le résultat aura le mime type text/html.
AddType text/html .shtml
AddHandler server-parsed .shtml

Support for automatic directory listings [required]? [Y/n]

Module : mod autoindex


Action : fabrique un index pour un répertoire qui n’a pas de fichier index.html
Support for index.html indices [required]? [Y/n]
Module : mod dir
Action : ajoute un / aux URL du type http ://servername/foo/dirname
où dirname est un répertoire. Appelle mod autoindex s’il n’y a pas de fichier
index dans ce répertoire
Directive : DirectoryIndex
Support for CGI scripts [required]? [Y/n]
Module : mod cgi
Action : tout fichier qui a le mime type application/x-httpd-cgi ou le
handler cgi-script sera traité par ce module. Des fichiers peuvent avoir ce
type mime si leur extension est définie dans un AddType ou s’ils se trouvent
dans un répertoire défini par ScriptAlias.
11.7. LES MODULES. 151

Support for sending raw HTTP data? [y/N]


Module : mod asis module
Action : tout document avec le mime type httpd/send-as-is sera traité
par ce module. Utile quand on ne veut pas ajouter d’en-tête HTTP au fichier
(mais il faut alors que cet en-tête soit dans le fichier sinon le client n’est pas
content .
Support for imagemaps? [y/N]
Module : mod imap
Action : traite les server-side image maps
Support for filetype-based scripts? [y/N]
Module : mod imap
Action : permet de traiter un fichier comme un CGI suivant son type (direc-
tive Action) ou quand une méthode (GET, POST, PUT, DELETE) est invoquée
(directive Script)
Support for automatic URL spell-correction? [y/N]
Module : mod speling
Action : essaie de corriger des URL fausses, par exemple des erreurs sur la
casse des caractères.
Support for user home directories [required]? [Y/n]
Module : mod userdir
Action : détermine le répertoire d’un utilisateur pour les URL du type :
http ://serveur/~userid
Support for caching proxy service? [y/N]
Module : mod proxy
Action : permet à Apache de fonctionner comme serveur proxy.
Support for aliases and redirects [required]? [Y/n]
Module : mod alias
Action : traite les alias (Alias, AliasMatch, Script, ScriptMatch) et
redirections (Redirect, ...)
Les directives Alias permette de ranger des documents ailleurs que sous
DocumentRoot.
Support for host-based access control [required]? [Y/n]
Module : mod access
Action : gestion des directives allow from, deny from, order permettant
de contrôler l’accès suivant l’adresse IP ou le nom de domaine.
Support for basic authentication [standard]? [Y/n]
Module : mod auth
Action : permet de contrôler l’accès à des documents par userid/pasword
Support for anonymous-FTP authentication? [y/N]
152 CHAPITRE 11. APACHE

Module : mod auth anon


Action : même méthode d’accès que dans ftp anonymous, demande l’adresse
e-mail comme password
Support for dbm-file authentication? [y/N]
Module : mod auth dbm
Action : contrôle d’accès par userid/pasword avec fichier dbm
Support for db-file authentication? [y/N]
Module : mod auth db
Action : idem avec Berkeley db
Support for MD5 authentication? [y/N]
Module : mod digest
Action : contrôle d’accès par authentification MD5 Digest. Mais quels clients
le supportent ?
Support for HTTP header metafiles? [y/N]
Module : mod cern meta
Action : émule les metafile de httpd CERN : ce sont des headers HTTP
Support for custom expiration times [standard]? [Y/n]
Module : mod expires
Action : génère des en-têtes HTTP Expires dans les réponses du serveur.
Support for arbitrary HTTP headers? [y/N]
Module : mod headers
Action : permet de contrôler les en-têtes HTTP dans la réponse du serveur.
Directive : Header
Support for clickstream logs? [y/N]
Module : mod usertrack
Action : gère les cookies. Utilise les fichiers log. Directive :
CustomLog logs/clickstream "%{cookie}n %r %t"
CookieExpires, CookieTracking
Support for unique hit identifiers [standard]? [Y/n]
Module : mod unique id
Action : identifie une requête de manière unique (date, hostname, PID
Support for recognizing UserAgents [required]? [Y/n]
Module : mod setenvif
Action : fixe des variables d’environnement suivant des conditions exprimée
par des expressions régulières. Exemple :
BrowserMatch ^Mozilla netscape
Autre directive SetEnvIf
Les modules sont en /usr/lib/apache/1.3/
11.8. VIRTUAL HOSTS 153

11.8 Virtual hosts


Un même serveur apache peut héberger plusieurs sites Web différents. Donc
qui ont des URL racines différentes. La méthode qui ne présuppose rien quant
au client est celle qui consiste à définir des IP-alias. Ainsi la machine qui tourne
apache a plusieurs adresses IP pour un seul interface réseau. Cela permet de
déclarer des noms de domaines différents.
Les IP-alias sont définis ainsi :
ifconfig eth0:0 193.54.230.104 netmask 255.255.255.0 broadcast 193.54.230.255
route add -host 193.54.230.104 dev eth0:2
Les noms de domaines sont déclarés dans le DNS ainsi :
www-phase 604800 IN CNAME zoroastre.c-strasbourg.fr.
www-sfp2001 604800 IN A 193.54.230.104
Les virtual hosts sont déclarés dans httpd.conf :
<VirtualHost www-phase.c-strasbourg.fr>
ServerAdmin morel@phase.c-strasbourg.fr
DocumentRoot /var/www/phase
ServerName www-phase.c-strasbourg.fr
ErrorLog /var/log/apache/phase-error_log
TransferLog /var/log/apache/phase-access_log
</VirtualHost>

<VirtualHost www-sfp2001.c-strasbourg.fr>
ServerAdmin morel@phase.c-strasbourg.fr
DocumentRoot /var/www/sfp2001
ServerName www-sfp2001.c-strasbourg.fr
ErrorLog /var/log/apache/sfp2001-error_log
TransferLog /var/log/apache/sfp2001-access_log
</VirtualHost>

11.9 Content negotiation


11.9.1 Multiviews
Le serveur peut tenir compte des préférences transmises par le client plutôt
que de proposer un choix manuel.

AddLanguage en .en
AddLanguage fr .fr
LanguagePriority en fr de

<Directory /var/www>
Options Indexes FollowSymLinks ExecCGI Multiviews
AllowOverride None
order allow,deny
allow from all
</Directory>
154 CHAPITRE 11. APACHE

Remarquez la présence de l’option Multiviews. Le répertoire /var/www


contient les fichiers phasnew.html.en et phasnew.html.fr.
Si l’utilisateur configure, dans les préférences de son Netscape, le français
celui-ci envoie une requête du type :
GET http://www-phase.c-strasbourg.fr/phasnew.html HTTP/1.1
host: www-phase.c-strasbourg.fr
Accept-Language: fr
Apache lui envoie alors le fichier phasnew.html.fr. Si l’utilisateur configure
l’anglais dans ses préférences Netscape, il aura le fichier phasnew.html.en.
L’utilisateur peut définir en fait un ordre de préférence. Si l’utilisateur n’en
communique pas, Apache suit le directive LanguagePriority.
Les fichiers peuvent être indifféremment nommés phasnew.html.fr ou phasnew.fr.html
Si l’utilisateur définit une autre langue, Apache envoie le fichier par défaut
phasnew.html.html. Si on veut envoyer la page française par défaut on crée un
lien :
ln -s phasnew.fr.html phasnew.html.html

11.9.2 Handler type-map


Un handler type-map est associé à un fichier qui définit des variantes d’un
document par exemple :
AddType application/x-type-map var
AddHandler type-map var
DirectoryIndex index.var
Fichier index.var :
URI: index; vary="language"
URI: index.en.html
Content-type: text/html
Content-language: en
URI: index.it.html
Content-type: text/html
Content-language: it

11.10 Restrictions d’accès


Il vaut mieux, pour un service plus rapide, les déclarer dans les fichiers de
configuration plutôt que dans les fichiers .htaccess. Elles sont définies soit pour
tout l’ensemble des pages Web soit par répertoire particulier, l’un n’excluant pas
l’autre.
Exemple : restriction d’accès pour usage Intranet
<Directory /var/www/phase/interne>
<Limit GET>
order deny,allow
deny from all
allow from 193.54.230 130.79.74 130.79.194 127.0.0.1
11.11. AUTRES CAPACITÉS DE APACHE 155

</Limit>
</Directory>
Ce qui signifie que pour la méthode GET l’accès de /var/www/phase/interne
est interdit à tous, sauf aux machines dont les adresses IP commencent par
193.54.230, 130.79.74, 130.79.194 et bien sûr localhost.
Remarque : deny,allow forme un seul mot (pas de blanc).
Je voudrais autoriser l’accès de mes pages Web à tous, sauf à la direction du
CNRS. Je crée un fichier /home/morel/public html/.htaccess qui contient :
<Limit GET>
order allow,deny
allow from all
deny from dr10.cnrs.fr cnrs-dir.fr
</Limit>
Mais attention, il faut une directive AllowOverride All pour que le fichier
.htaccess soit pris en compte.
On peut aussi conditionner l’accès par une variable. Par exemple, par BrowserMatch
je crée une variable d’environnement si le nom du Browser satisfait une expres-
sion régulière.
deny from env=cette_variable
interdira l’accès à ce type de Browser.
On peut aussi faire un contrôle d’accès par userid/password

11.11 Autres capacités de Apache


– SSI : Server-side includes. Il faut activer le module mod-include et la
directive Includes. Exemple de SSI pour mettre dans une page *.shtml
sa date de dernière modification :
<!--#config timefmt="%A %d %B %Y" -->
<p>
Date de dernière mise à jour :
<!--#echo var="LAST-MODIFIED" -->
timefmt définit le format de la date avec la même syntaxe que dans man
strftime : %A est le jour de la semaine, %d le numéro du jour dans le mois
%B le mois, %Y l’année.
– SSL : HTTP+SSL= HTTPS. Vient de Netscape, supporté par Apache.
Nécessite d’installer la bibliothèque de chiffrement SSLeay et le patch
Apache-SSL.
– Cookies : supporté
– PHP : supporté
– Serveur proxy : mais j’utiliserais plutôt squid ou junkbuster.

11.12 Maintenance
11.12.1 Erreurs
Regardez les fichiers Logs, dans /var/log/apache en particulier les fichiers
*-error log
156 CHAPITRE 11. APACHE

11.12.2 Statistiques
Exemple : wwwstat fait des statistiques à partir des fichiers logs. Résultat
au format HTML.
http://www.ics.uci.edu/pub/websoft/wwwstat/
Configuration : fichier wwwstat.rc. Vérifier $DefaultLog $Do Archive
Emploi :
wwwstat -h

Statistiques globales :
wwwstat >stat.html
Statistiques d’accès au répertoire de l’utilisateur dupond :
wwwstat -n ’^/~dupond/’
Chapitre 12

Exécution de programmes
CGI sur un serveur WWW

Ce chapitre est une adaptation du document rédigé par Frédéric Couchet,


mad@bocal.cs.univ-paris8.fr
de l’association APRIL,
http://www.april.org

12.1 Introduction à la Common Gateway Inter-


face
12.1.1 Pourquoi utiliser les programmes CGI
Un programme CGI est tout simplement un programme pouvant être exécuté
par un serveur HTTP.
Un exemple classique nous est fourni par les moteurs de recherche qui, à
partir de mots clés saisis dans un formulaire, vous affichent l’ensemble des pages
au format HTML contenant ces mots clés. La recherche étant effectuée par un
programme externe.
La solution pour communiquer à travers une page Web avec le serveur est
l’utilisation de la Common Gateway Interface (CGI). CGI est une interface
permettant l’exécution de programmes externes par un serveur HTTP. Plus
généralement, CGI est en fait un standard pour l’écriture de passerelles entre des
serveurs d’informations tel que HTTP et des programmes externes. L’interface
CGI permet de faire communiquer le programme et le serveur HTTP.

12.1.2 Prérequis et choix techniques


Dans ce document, je suppose connu les bases du langage HTML, le mini-
mum pour pouvoir faire une page. Pour l’écriture des programmes, la connais-
sance d’un langage de programmation plus ou moins évolué est bien entendu
nécessaire (par exemple, C, Perl, Python ...). Nous supposons un serveur Web
tournant sur une machine Unix (tous les exemples présentés dans ce document
ont été réalisés sur une machine Linux 2.0 et le serveur HTTP Apache 1.2b3).

157
158CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

12.1.3 Configuration du serveur Web


Autant l’écriture de pages au format HTML nécessitait juste un navigateur
pour visualiser le résultat, autant l’écriture de scripts CGI nécessite la présence
d’un serveur HTTP tournant sur la machine (en effet, n’oublions pas que c’est
le serveur qui exécute le programme).
Donc première étape, il nous faut installer un serveur HTTP. Voir chapitre
précédent. Comme le but de ce document est d’écrire des scripts CGI, il faut
configurer le serveur pour qu’il puisse exécuter nos programmes. Dans le fichier
srm.conf, il faut décommenter la ligne suivante (supprimer le dièse en début
de ligne) :
#ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
Ainsi, si votre machine s’appelle yoda, lorsque le navigateur accédera à l’url
http ://yoda/cgi-bin/date.cgi le serveur saura que le fichier date.cgi se
trouve dans le répertoire /usr/lib/cgi-bin et qu’il devra l’exécuter (voir 12.2
(Notions fondamentales)).
Vous pouvez également configurer votre serveur pour qu’il puisse exécuter
n’importe quel fichier, où qu’il se trouve, pourvu qu’il ait pour extension .cgi.
Pour cela, décommentez, dans srm.conf, la ligne suivante :

#AddHandler cgi-script .cgi

12.2 Notions fondamentales


Lorsque vous tapez un URL (Uniform Ressource Locator ), par exemple
http://www.april.org/association/index.html
, votre navigateur préféré va se connecter au serveur Web indiqué, c’est à dire
le programme installé sur la machine distante (dans notre exemple www.april.org),
et qui écoute sur le port 80. Le serveur va chercher le document en question sur
son disque et l’envoie au navigateur, en utilisant le protocole HTTP (HyperText
Transfer Protocol ). Il peut s’agir de n’importe quel type de fichier, un fichier au
format HTML, une image, un fichier son etc.
Pour savoir comment et où chercher le document, le serveur possède un en-
semble de fichiers de configuration chargés en mémoire à son lancement (qui,
dans le cas de notre installation, se trouvent dans le répertoire /etc/apache/conf).
Dans notre exemple, le serveur ira chercher le fichier april.html dans le répertoire
/var/www/association (où /var/www/ est le répertoire racine du serveur). Un
autre exemple d’URL est
http://www.bocal.cs.univ-paris8.fr/\~{}drieu/index.html
. Le caractère ˜ indique que la chaı̂ne qui suit correspond à un nom de login
sur la machine du serveur. Ainsi, dans ce cas, le serveur va chercher le document
en question dans le répertoire /home/drieu/public html (selon la configuration
classique du serveur). Le fichier index.html se trouve dans ce répertoire. Les
utilisateurs ont ainsi la possibilité de créer un répertoire public html (accessible
en lecture et exécution) dans leur compte pour publier sur le Web.
Mais ce type de document est statique, or il est possible d’accéder à de
l’information dynamique. Une possibilité est l’utilisation de scripts CGI. En
effet, ce programme est exécuté, par le serveur, en temps réel sur la machine
distante, au moment où le navigateur fait une requête vers ce programme.
12.3. UN PROGRAMME EN BOURNE SHELL 159

Un exemple assez puissant étant l’accès, via un formulaire HTML, à une


base de données. Par l’intermédiaire du formulaire, vous saisissez les nom et
prénom d’une personne. A l’aide d’un bouton ’valider’ présent sur le formulaire,
le serveur invoque alors un programme qui, à partir des informations saisies
dans le formulaire, va interroger le moteur de votre base de données et envoyer
en réponse une page au format HTML, contenant les informations concernant
cette personne, que votre navigateur va alors afficher.
Mais ne nous attaquons pas tout de suite à des requêtes SQL, et commençons
par beaucoup plus simple. Pour montrer le dynamisme de notre page, nous
allons faire un programme qui affiche l’heure courante dans une page HTML
(exemple d’école, car beaucoup plus facilement réalisable avec les Server Side
Includes).

12.3 Un programme en Bourne shell


Pour écrire un script CGI, nous pouvons utiliser n’importe quel langage
de programmation. Nous devons simplement pouvoir lire sur l’entrée standard,
écrire sur la sortie standard et accéder aux variables d’environnement.
Nous allons écrire notre premier programme que nous appelerons date.cgi.
Nous devons penser aux permissions de ce fichier. Le programme doit être
exécutable par tous, et lisible par tous dans le cas de script shell, perl ... En effet,
n’oublions pas que c’est le serveur HTTP qui va exécuter notre programme. Or,
le serveur tourne dans la majeure partie des cas sous l’utilisateur nobody, et
donc il n’a pas de droits particuliers (retenons bien que le serveur ne s’exécute
pas sous l’utilisateur qui a écrit le script).
Nous installerons notre progamme dans le répertoire /usr/lib/cgi-bin, qui
est le répertoire par défaut des scripts CGI (encore faut-il que l’administrateur
du système nous en laisse le droit). En effet, n’importe qui n’a pas le droit
de faire des scripts CGI. L’administrateur peut limiter la possibilité de mettre
des scripts CGI que dans un seul répertoire. Il contrôlera ainsi beaucoup plus
facilement ces scripts. Car, il faut le savoir, les scripts CGI sont une bonne
source de trous de sécurité.
Ainsi, le serveur sait que tous les fichiers se trouvant dans ce répertoire
devront être exécutés et non pas envoyés directement au navigateur, et ce seront
les seuls dans ce cas. C’est le programme qui devra envoyer les informations au
navigateur, par l’intermédiaire de la sortie standard (d’où l’obligation de pouvoir
écrire sur la sortie standard). Donc, notre programme doit produire sur sa sortie
standard quelque chose de compréhensible par le navigateur. Ainsi, lorsque votre
navigateur accédera à l’URL correspondant à ce fichier (par exemple :
http://www.april.org/cgi-bin/date.cgi
), le serveur exécutera le programme date.cgi qui produira un fichier au for-
mat HTML contenant la date courante. Le navigateur affichera alors le résultat.
Source du programme
Notre premier programme est écrit sous la forme d’un script shell. Voici le
source de date.cgi :

#!/bin/sh

tmp=‘/bin/date‘
160CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

La date courante sur le serveur est


Sun Mar 30 11:48:54 GMT+0100 1997

cat << EndFile


Content-type: text/html

<HTML><HEAD><TITLE>Script Cgi</TITLE></HEAD>
<BODY>

<CENTER>

<H1>La date courante sur le serveur est</H1>


$tmp

</CENTER>

</BODY>
</HTML>

EndFile

On fait un chmod 555 date.cgi et on copie le fichier dans le répertoire


/usr/lib/cgi-bin. Ensuite, on peut utiliser notre navigateur pour voir le résultat.
On accède à l’URL
http://www.april.org/cgi-bin/date.cgi
et on obtient le résultat suivant :
Au niveau du source, on affecte à la variable tmp le résultat de la commande
/bin/date ($tmp permet ensuite d’avoir accès au contenu de la variable tmp).
Ensuite, il faut juste savoir que la commande cat << EndFile permet d’af-
ficher sur la sortie standard tout ce qui suit jusqu’à ce que l’on rencontre une
ligne formée uniquement par EndFile (la chaı̂ne suivant immédiatement <<).
En fait, tout ce qui se trouve entre << EndFile et EndFile est utilisé comme
entrée standard de la commande cat (la chaine EndFile est choisie arbitraire-
ment).1
Ce qui est important de noter, c’est la première ligne écrite sur la sortie
standard (Content-type : text/html), c’est à ce niveau que l’on spécifie le
type de données que l’on envoie au navigateur. Cette ligne fait en fait partie
du header HTTP. Ce header est indispensable pour que le navigateur puisse
interpréter correctement les données reçues (les autres parties du header seront
ajoutées par le serveur HTTP). Le type ”text/html” est le type MIME stan-
dard pour un document HTML. Si notre programme devait générer une image
au format Gif (par exemple pour implémenter un compteur graphique), nous
aurions utilisé le type ”image/gif”. Le header doit obligatoirement être terminé
par une ligne vide (comme le header de tous les protocoles). Cette ligne sépare
l’en-tête de la réponse (c’est à dire les informations au sujet de la réponse) du
contenu de la réponse.
1 Ce type de script shell où les données sont directement incluses dans le script s’appellent

des documents in-line ou des here documents.


12.4. SAISIE ET TRAITEMENT DES CHAMPS D’UN FORMULAIRE 161

Ce qu’il faut retenir à ce niveau, c’est qu’un script CGI doit produire sur
sa sortie standard quelque chose de compréhensible par le navigateur, donc,
dans la majorité des cas, une sortie au format HTML. La seule obligation est la
présence, sur la première ligne, du header Content-type. Les autres parties du
header seront ajoutées par le serveur HTTP. C’est pourquoi ce type de script
est appelé Parsed Header Script. Il existe un autre type de script CGI, appelé
Non Parsed Header Script. Pour ce type de script, le serveur ne rajoute rien,
et c’est donc le script lui-même qui a la charge de fournir un header complet,
conforme au protocole HTTP.
Voilà, nous avons écris notre premier script CGI. On y accède directement
par le navigateur.
Faites le test :
http://www.april.org/cgi-bin/date.cgi
.

12.4 Saisie et traitement des champs d’un for-


mulaire
L’exemple précédent était relativement simple, et illustrait l’appel direct
d’un script CGI. Maintenant nous allons aborder un problème un peu plus
complexe et intéressant. L’exercice consiste à pouvoir saisir des données dans
un formulaire et, grâce à un script CGI, effectuer un traitement quelconque sur
ces données (ce qui est le mode de fonctionnement des moteurs de recherche).
Ceci nécessite deux étapes :
– la création d’un document HTML contenant un formulaire, ce qui permet-
tra à l’utilisateur de saisir des données.
– l’écriture d’un programme traitant ces données.
Pour pouvoir saisir des données dans une page HTML, nous allons utiliser
la balise FORM. Cette balise permet de réaliser un questionnaire. Les réponses
saisies par l’utilisateur sont codées par le navigateur et transmises au serveur
HTTP. Utilisons l’exemple suivant (fichier form.html) :
L’utilisateur pourra ainsi entrer son prénom, nom (champ de type texte)
et sélectionner l’une des quatres valeurs possibles pour l’âge (champ de type
SELECT).
Le champ d’un formulaire est identifié par l’attribut NAME. Les données
sont transmises au serveur sous la forme de paires : name=value, codées au
format URL et séparées par le symbole &. Le format de codage URL est le
suivant :
– les caractères non ASCII (ceux dont le code est supérieur à 128) sont
remplacés par la chaı̂ne de caractères %xx où xx représente le code ASCII
du caractère en hexadécimal.
– les caractères réservés sont également remplacés par leur valeur hexadécimale.
– le caractère espace est remplacé par le caractère +.
il est absolument nécessaire de connaı̂tre ce codage pour écrire des scripts
CGI. En effet, le programme doit savoir décoder ces chaı̂nes. Il est également
possible, en connaissant ce codage, d’appeler directement un script sans passer
par la page HTML appelant le script.
Le script CGI est identifié par l’attribut ACTION de la balise FORM, cet
162CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

<HTML><HEAD><TITLE>Formulaire simple</TITLE></HEAD>
<BODY>
<H2>R&eacute;pondez aux questions suivantes</H2>
<FORM ACTION="http://www.april.org/cgi-bin/treat.pl" METHOD=GET>
Prénom : <INPUT TYPE="text" NAME=prenom SIZE=20><BR>
Nom : <INPUT TYPE="text" NAME=nom SIZE=20><BR>
Age : <SELECT NAME=age>
<OPTION>- de 18 ans
<OPTION>19 &agrave; 40 ans
<OPTION>41 &agrave; 60 ans
<OPTION>+ de 60 ans
</SELECT><BR>
<INPUT TYPE=submit VALUE="Envoyer"> <INPUT TYPE=reset VALUE="Remettre
&agrave; z&eacute;ro">
</FORM>
</BODY>
</HTML>

prenom=Marcel&nom=Gnou&age=41+%E0+60+ans

attribut contenant l’URL du programme externe. Dans notre exemple, le script


est le fichier treat.pl qui se trouve sur le serveur www.april.org (dans le
répertoire /usr/lib/cgi-bin/ comme nous l’avons vu précédemment). L’attri-
but METHOD de la balise FORM spécifie le mode de transfert des données vers
le serveur. On peut en distinguer deux : GET et POST.
Dans la méthode GET le navigateur concatène à l’URL précisée par l’at-
tribut ACTION, le symbole ? et la chaı̂ne contenant les données saisies par
l’utilisateur. Et lorsque l’utilisateur clique sur le bouton ”Envoyer” on accède à
cet URL.
Dans la méthode POST la chaine contenant les données saisies par l’utilisa-
teur est insérée dans le corps de la requête HTTP.
Si dans notre formulaire, on saisit pour le prénom ”Marcel”, pour le nom
”Dugenou” et pour l’âge on sélectionne ”41 à 60 ans”, la chaı̂ne transmise sera
alors la suivante :
Le %E0 correspond au caractère à. Alors, dans le cas de la méthode GET on
accédera à l’URL suivante :
Ce qui montre, par ailleurs, que l’on peut donc directement accéder à un
script CGI, en lui passant ses paramètres de cette façon. Ceci peut être très
dangereux si on n’écrit pas ses scripts avec beaucoup de précautions.
Dans le cas de la méthode POST on accédera à l’URL suivante :
et la chaı̂ne prenom=Marcel&nom=Gnou&age=41+%E0+60+ans est insérée dans
le corps de la requête, et donc le programme ira récupérer cette chaı̂ne sur son
entrée standard.

http://www.april.org/cgi-bin/treat.pl?prenom=Marcel&nom=Gnou&age=41+%E0+60+ans
12.4. SAISIE ET TRAITEMENT DES CHAMPS D’UN FORMULAIRE 163

http://www.april.org/cgi-bin/treat.pl

12.4.1 Récupération des informations en Perl et en shell


Nous avons écrit le formulaire, on a vu comment transmettre les informations
au script (GET ou POST), maintenant on va écrire le programme.
Précisons tout de suite le rôle du programme externe :
– d’abord récupérez les données saisies par l’intermédiaire du formulaire.
– traiter ces données
– enfin, fournir sur sa sortie standard le résultat qui sera alors transmis au
client (le navigateur).
La première chose qui nous intéresse est d’extraire l’information envoyée par
le navigateur à l’aide du formulaire. La méthode dépend en fait de celle choisie
dans le formulaire.
Dans le cas de la méthode GET, l’information est contenue dans la variable
d’environnement QUERY STRING, qui a pour longueur la valeur de la variable
CONTENT LENGTH. Ainsi dans notre exemple précédent, la variable contiendra la
chaı̂ne prenom=Marcel&nom=Gnou&age=41+%E0+60+ans.
Dans le cas de la méthode POST, le programme récupère les informations
sur son entrée standard.
Pour mettre en pratique ces principes, nous allons juste écrire un programme
qui récupère les informations, les décode et qui écrit sur sa sortie standard une
page HTML contenant les données décodées (que le navigateur affichera alors).
La partie traitement des données n’est pas abordée ici car cela dépend de ce que
doit faire votre programme, et il n’y a rien à dire de spécifique par rapport au
sujet.
Nous allons utiliser deux langages différents : Perl et le shell.
En général, la phase de récupération des données est toujours la même, ce
qui permet d’écrire des fonctions d’extraction réutilisables.
Voyons le code source de treat.pl :
Etant donné que la méthode choisie est GET, on récupère les données dans
la variable QUERY STRING, par la ligne : $buffer=$ENV{"QUERY STRING"} ;. Si
nous avions, au niveau du formulaire, choisi la méthode POST, nous aurions
récupéré les données par la ligne : read(STDIN,$buffer,$ENV{"CONTENT LENGTH"}) ;.
La variable CONTENT LENGTH contenant la longueur de QUERY STRING.
Pour bien comprendre l’exemple, il faut évidemment connaı̂tre Perl. Les
commentaires mis dans le programme l’explicitant un peu.
Nous pouvons écrire le programme avec d’autres langages, voici le code
source de treat.sh écrit en shell.
Il suffit de remplacer treat.pl par treat.sh dans la balise FORM du for-
mulaire.
L’algorithme de décodage utilisé est le suivant (la chaı̂ne à traiter étant dans
notre exemple
prenom=Marcel&nom=Gnou&age=41+%E0+60+ans :
– récupération des paires name=value (qui sont séparées par le caractère
&). En shell, cela se fait par OPTS=‘echo $QUERY STRING | sed ’s/&/
/g’‘ (on remplace & par un espace) et en perl on utilise un tableau :
local(@donnees) = split(/&/, $buffer) ;
– séparation de chaque paire en name et value
164CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

#!/usr/bin/perl

# les donnees sont envoyees par methode GET


# donc on recupere les donnees dans la variable
# d’environnement QUERY_STRING
$buffer=$ENV{"QUERY_STRING"};

# on split la chaine de donnees en des paires name=value


local(@champs) = split(/&/, $buffer);
local($donnees) = "";

# affichage du debut du code HTML


printf STDOUT "Content-type: text/html\n\n";
printf STDOUT "<HTML><HEAD>";
printf STDOUT "<TITLE>Reponse au questionnaire</TITLE>";
printf STDOUT "</HEAD>";
printf STDOUT "<BODY BGCOLOR=\"#ffffff\">";

printf STDOUT "<H1>R&eacute;sultat du traitement de votre questionnaire</H1>";


printf STDOUT "<H2>Chaine de donn&eacute;es reçue par le programme</H2>";
printf STDOUT "QUERY_STRING <STRONG>%s</STRONG>",$buffer;
printf STDOUT "<H2>Liste des informations d&eacute;cod&eacute;es</H2>";
printf STDOUT "<UL>";
printf STDOUT "<BL>";

# recuperation et mise en forme des donnees


# on parcourt la liste des paires name=value
foreach $i (0 .. $#champs) {
# On convertit les plus en espaces
$champs[$i] =~ s/\+/ /g;

# On separe chaque champ en une cle et sa valeur


($key, $val) = split(/=/,$champs[$i],2);

# On convertit les %XX de leur valeur hexadecimale en alphanumerique


$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;

# on affiche le resultat
printf STDOUT "<LI><STRONG>%s:</STRONG>%s\n",$key,$val;
}

printf STDOUT "</BL>";


printf STDOUT "</UL>";

printf STDOUT "</BODY>";


printf STDOUT "</HTML>";
12.4. SAISIE ET TRAITEMENT DES CHAMPS D’UN FORMULAIRE 165

#!/bin/sh
#

if [ "$REQUEST_METHOD" = "POST" ]; then


read QUERY_STRING
fi

# on split la chaine de donnees en des paires name=value


OPTS=‘echo $QUERY_STRING | sed ’s/&/ /g’‘

echo "Content-type: text/html"


echo ""
echo "<HTML><HEAD>"
echo "<TITLE>Reponse au questionnaire</TITLE>"
echo "</HEAD>"
echo "<BODY BGCOLOR=\"#ffffff\">"

echo "<H1>R&eacute;sultat du traitement de votre questionnaire</H1>"


echo "<H2>Chaine de donn&eacute;es reçue par le programme</H2>"
echo "QUERY_STRING <STRONG>"$QUERY_STRING
echo "</STRONG>"
echo "<H2>Liste des informations d&eacute;cod&eacute;es</H2>"

# recuperation et mise en forme des donnees


# on parcourt la liste des paires name=value
echo "<UL>"
echo "<BL>"
for opt in $OPTS
do
NAME=‘echo $opt | sed ’s/=/ /g’ | awk ’{print $1}’‘
VALUE=‘echo $opt | sed ’s/=/ /g’ | awk ’{print $2}’ | sed ’s,%,\\\x,g’ | sed ’s/+/ /g’‘
printf "<LI><STRONG>$NAME:</STRONG>$VALUE"
done

echo "</BL>"
echo "</UL>"
echo "</BODY></HTML>"
166CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

#include <stdio.h>

main(int argc, char **argv, char **env)


{
int i = 0;

printf("Content-Type: text/html\n\n");
printf("<HTML><HEAD><TITLE>Variables</TITLE></HEAD><BODY>\n");

while(*env){
printf("%s <BR>\n",*env++);

printf("</BODY></HTML>\n");
}

– pour chaque champ value, conversion des + en espaces, et tous les %xx en
leur valeur alphanumérique.
Les deux méthodes GET et POST différencient le moyen de communication
entre le serveur et le programme. La méthode GET est limitée par la taille
maximale acceptée par le serveur au niveau d’un URL, la méthode POST n’étant
pas restreinte par cette limite.
Testez le formulaire et son script sur
http://www.april.org/groupes/doc/cgi-bin/form.html

12.4.2 Les variables d’environnement


Les scripts CGI peuvent accéder aux variables d’environnement. Selon les
systèmes, on peut accéder à un nombre plus ou moins important de variables
d’environnement.
Certaines variables sont relatives au serveur HTTP (par exemple HTTP HOST
contient l’adresse IP de la machine hébergeant le serveur HTTP). D’autres
sont relatives à la connexion client-serveur (par exemple REMOTE ADDR contient
l’adresse IP de la machine cliente effectuant la requête. Enfin, certaines sont
relatives à la requête (par exemple QUERY STRING contient la chaı̂ne contenant
les informations de la requête).
Voici deux programmes permettant l’accès à l’ensemble des variables d’en-
vironnement, le premier en C, le deuxième en Perl :
Code de env.c :
Code de env.pl :
Il suffit alors de compiler env.c et de copier l’exécutable résultant dans le
répertoire des cgi-bin du serveur. Pour le script Perl, il suffit de le copier dans
le répertoire, en n’oubliant pas de le rendre lisible et exécutable par tous.
Cliquez sur les liens suivants pour voir le résultat :
http://www.april.org/cgi-bin/env
et
12.5. DÉBOGUER UN SCRIPT CGI 167

#!/usr/bin/perl

print "Content-Type: text/html\n\n";


print "<HTML><HEAD><TITLE>Variables</TITLE></HEAD><BODY>\n";

while(($name,$value) = each %ENV){


print "$name = $value <BR>\n";
}

print "</BODY></HTML>\n";

http://www.april.org/cgi-bin/env.pl

12.5 Déboguer un script CGI


Vous venez de terminer la lecture de ce document, d’installer avec succès
votre serveur HTTP, d’écrire un script CGI en vous basant sur les exemples
fournis. Vous lancez votre navigateur pour faire un test. D’ailleurs, à ce propos,
utilisez bien Ouvrir URL pour accéder au script, et non pas Ouvrir Fichier.
Si votre machine s’appelle yoda, et que vous avez placé le script date.cgi dans le
répertoire des scripts CGI, vous devez ouvrir l’URL http ://yoda/cgi-bin/date.cgi.
Et là, que voyez-vous apparaı̂tre à la place de la sortie attendue de votre
programme ? Le navigateur vous affiche une erreur du genre Internal server
error. Affreux.
Nous voilà donc lancé dans l’enfer du debug d’un script CGI. Disons tout de
suite que le debug d’un script CGI n’est pas tout à fait le même problème que
le debug d’un programme normal.
En effet, la plupart des programmes que vous avez écrits jusqu’à maintenant
étaient lancés directement à partir de la ligne de commande. Ce n’est pas le cas
des scripts CGI. Ils sont exécutés par une autre programme, le serveur HTTP,
et souvent sur une machine différente de celle sur laquelle ils ont été écrits.
Si au lieu de la sortie attendue de votre programme, vous voyez s’afficher le
code source du programme c’est que le serveur HTTP n’est pas configuré pour
pouvoir exécuter des scripts CGI. Contacter l’administrateur du serveur, ou si
c’est votre propre serveur relisez la partie 12.1.3 (Installation du serveur) pour
voir si vous l’avez correctement configuré.
Le secret du debug est donc de bien comprendre que c’est le serveur
HTTP qui exécute le programme.
Gardons cela en tête, et commençons le debug de notre programme.
La première chose à vérifier est que le programme soit exécutable par tous
dans le cas d’un programme compilé, et lisible et exécutable par tous dans le
cas d’un script. Ceci parce que le serveur s’exécute sous un nom d’utilisateur
différent du votre. Donc une fois votre programme installé dans le répertoire
adéquat n’oubliez pas de faire un petit chmod 555 date.cgi, par exemple.
Si cela ne marche toujours pas, il faut essayer d’exécuter le programme sur
la ligne de commande pour voir ce qu’il affiche en sortie. En effet, quand votre
programme est exécuté par le serveur HTTP, le résultat de sa sortie est envoyé
168CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW

au navigateur, et donc vous ne voyez en fait que ce qu’en fait le navigateur. Votre
programme peut donc s’exécuter correctement sur le serveur, afficher quelque
chose sur sa sortie standard, mais cette sortie est peut-être incohérente pour le
navigateur, qui vous affiche alors un message d’erreur.
Exécutez donc votre programme sur la ligne de commande, qu’affiche t’il
en sortie ? Comme nous l’avons déjà vu précédemment, la première ligne af-
fichée doit être le champ Content-Type du header HTTP, suivi par une ligne
blanche. Si ce n’est pas le cas, corrigez-le. Une erreur fréquente est, en lan-
gage C, l’instruction suivante : printf("Content-Type : text/html\n") ;.
Cette instruction est syntaxiquement correcte, mais elle n’affiche pas de ligne
blanche après l’affichage de la chaı̂ne. Le \n ne fait aller qu’à la ligne. Il faut
deux newline. L’instruction correcte est la suivante : printf("Content-Type :
text/html\n\n") ;. Ceci est une des erreurs les plus fréquement commises au
début de la programmation de scripts CGI. Le reste de l’affichage, après le hea-
der et la ligne blanche, doit être cohérent avec le header. Donc, dans ce cas de
figure, une sortie au format HTML. Par exemple :

Content-type: text/html

<HTML><HEAD>
<TITLE>Sortie Correcte</TITLE>
</HEAD>
<BODY>

<H1>Ceci est une sortie correcte</H1>

</BODY></HTML>

Ce test peut être suffisant si votre programme ne traite aucune donnée


en entrée. Mais si votre programme traite des données, par exemple par l’in-
termédiaire d’un formulaire (voir le deuxième exemple), il faut tester le pro-
gramme dans les conditions les plus proches du réel, et donc lui passer des
arguments en entrée.
Si le formulaire utilise la méthode GET, votre programme récupère les
données par l’intermédiaire de la variable d’environnement QUERY STRING. On
peut alors facilement affecter une valeur à cette variable sous le shell. Par
exemple, en bash :

export QUERY_STRING="prenom=Marcel&nom=Gnou&age=41+%E0+60+ans"

Il faut affecter une valeur la plus proche possible du réel (donc éventuellement
avec les %xx correspondant aux caractères accentués et réservés). On peut alors
exécuter le programme sur la ligne de commande et étudier sa sortie.
Enfin, si votre script doit être installé sur une autre machine que celle sous la-
quelle vous l’avez écrit, pensez à vérifier les chemins (path) des programmes que
vous utilisez. Dans l’exemple de date.cgi, le programme peut planter (et donc
votre navigateur vous affiche un message d’erreur), si par exemple le programme
date ne se trouve pas dans le répertoire /bin. Votre programme, donnant une
sortie correcte sur votre machine, exécuté sur l’autre machine, affichera en sor-
tie :
12.5. DÉBOGUER UN SCRIPT CGI 169

./date.cgi: /bin/date: command not found


Content-type: text/html

<HTML><HEAD><TITLE>Script Cgi</TITLE><HEAD>
<BODY>

<CENTER>

<H1>La date courante sur le serveur est</H1>

</CENTER>

</BODY>
</HTML>

Ce qui, vous en conviendrez, n’est pas une sortie correcte. Le problème peut
se poser également avec les scripts écrits en Perl. En effet, dans nos exemples, on
supposait que Perl se trouvait dans le répertoire /usr/bin/ (première ligne de
nos scripts : # !/usr/bin/perl). Si sur la machine sur laquelle doit s’exécuter
notre programme perl ne se trouve pas dans ce répertoire nous aurions commme
sortie :

./env.pl: No such file or directory

Ce qui n’est pas une sortie attendue par un navigateur.


170CHAPITRE 12. EXÉCUTION DE PROGRAMMES CGI SUR UN SERVEUR WWW
Chapitre 13

Samba

13.1 Introduction
Samba sur une machine Unix offre les mêmes services aux machines Windows
qu’un serveur Windows NT : serveur de fichier et d’impression.
Samba (de Andrew Tridgell) est un serveur de fichiers et d’impression fonc-
tionnant en UNIX, sur Linux en particulier et compatible avec les clients réseau
Microsoft. Il rend (à peu près) les mêmes services que Windows NT serveur.
Donc on peut se passer de ce dernier. Il permet aux utilisateurs Windows
d’accéder à des ressources UNIX et inversement aux utilisateurs Unix d’accéder
aux ressources partagées par les machines Windows. Utilité pour Windows :
– accès à des ressources distantes comme si elles étaient locales
– manipulation des fichiers distants ”à la souris”
– espace disque supplémentaire pour chaque utilisateur (sécurisé par des
sauvegardes)
– espace commun pour échanges de fichier
– accès aux imprimantes réseau
– accès au lecteur de cartouches pour sauvegardes
– distribution de logiciels
– partage de logiciels

13.2 Protocoles Microsoft


SMB (Server Messaging Block) est le protocole utilisé par Microsoft pour
partager fichiers et imprimantes entre WfWg, W95, W98, WNT. C’est une sorte
de NFS.
SMB est également appelé le protocole NetBIOS (Microsoft a repris le Net-
Bios développé par IBM et qui a été porté sur IP, NBT : NetBios over IP, RFC
1001-1002) ou LanManager.
CIFS (Common Internet File System) gère les fonctions de type NFS.
L’intérêt de SMB est qu’il peut fonctionner soit sur NetBeui, soit sur IPX,
(deux protocoles qu’on se dépêche d’oublier), soit sur IP. Nous l’utilisons évidemment
sur IP.
Types de serveurs :
– Domain Controler

171
172 CHAPITRE 13. SAMBA

– Primary Domain Controler (PDC)


– Backup Domain Controler (BDC)
– ADS Domain Controler
– Domain Member Server
– Active Directory Domain Server
– NT4 Style Domain Server
– Stand Alone Server
Samba-3 émule un NT4 Style Domain Controler à l’exception des pôssibilités
de réplication SAM.
Samba-3 peut être membre actif d’un Win2k Active Directory Domain. Mais
il n’a pas toutes les fonctionnalités d’un Active Directory Primary Domain
Controler.
Les machines Windows peuvent interagir de deux manières :
– standalone system, elles font partie d’un workgroup. Il n’y a pas de security
machine accounts.
– participante d’un security system, elles sont membres d’un domain. Chaque
machine est enregistrée dans la Domain account database.
Quelques concepts :
– Workgroup (groupe de travail) : ensemble de machines auxquelles on
accède (notion Windows 3.11 for workgroups)
– Name registration : Nom déclaré par une machine quand elle se connecte
au réseau, (doit être unique). Il est recommandé de prendre le même nom
que le nom de domaine Internet
– Sharename (Partage) : nom de la ressource partagée (répertoire disque
ou imprimante)
– Browse : fonction à deux niveaux :
1. Visualiser la liste des machines qui partagent des ressources.
2. Visualiser les ressources partagées par une machine.
– Browse list : liste des machines du workgroup
– Local Browse Master : machine qui tient à jour la browse list. N’im-
porte quelle machine Windows peut être Local Browse Master (il y a un
concours). Chaque machine qui partage un service, l’annonce par un mes-
sage broadcast.
– Domain Browse Master : machine qui réunit les browse lists de Work-
groups répartis sur différents sous-réseaux IP.
– Domain : En 1ère approximation un Domain est un Workgroup avec un
Domain Controler.
– WINS : Windows Internet Name Services. WNT serveur ou Samba font
serveur WINS. Le serveur WINS permet la traduction de noms NetBIOS
(SMB) en adresse IP. WINS permet aussi aux clients d’avoir des informa-
tions sur les NetBIOS name type. Si un WNT serveur existe, le prendre
comme serveur WINS. Sinon prendre Samba. Chaque machine Microsoft
ou Samba doit indiquer le serveur WINS.
– Microsoft Domain Security : permet en se loggant sur n’importe quelle
machine du domaine de se retrouver dans son propre environnement.
– Domain Controler : assure l’authentification des utilisateurs (gère un
système userid/password = Security Account Manager -SAM-). Gère aussi
des logon scripts et des profils utilisateurs.
– PDC : Primary Domain Controller en NT
13.2. PROTOCOLES MICROSOFT 173

– BDC : Backup Domain Controller en NT : simple copie d’un PDC


Noms NetBIOS : suite d’au plus 15 caractères plus un caractère de type
codé en hexa :
– 00 Standard Workstation Service
– 20 Serveur de fichiers (et d’imprimantes) (défaut)
– 03 Service Messenger (Winpopup)
– 06 Serveur RAS
– 21 Client RAS
– 1b Domain master browser
– 1d Master Browser Name
– 1f Serveur NetDDE
– be Network Monitor Agent
– bf Network Monitor Utility
Types de noms de groupe :
– 00 Groupe standard
– 1c Serveur de logons
– 1d Master Browse Name
– 1e Normal group Name
– 20 Internet group Name
– 01 MSBROWSE (utilisé pour annoncer un groupe aux autres Master
Browser)

13.2.1 Ports ouverts sur les machines Windows Microsoft


– 137/tcp netbios-ns
– 137/udp netbios-ns
– 138/tcp netbios-dgm
– 138/udp netbios-dgm
– 139/tcp netbios-ssn
– 139/tcp netbios-ssn
– 445/tcp microsoft-ds (pour W2000/XP)
– 445/udp microsoft-ds (pour W2000/XP)

13.2.2 Configuration des clients réseau Microsoft sur Win-


dows
En W98 :
– Démarrer/Paramètres/Panneau de configuration
– Double cliquer l’icône réseau
– Ajouter : Clients/Microsoft/Client pour les réseaux Microsoft
– Ajouter : Protocoles/Microsoft/TCP-IP
– Configurer en sélectionnant TCP-IP/Propriétés : remplir adresse IP ...
– Remplir WINS Server : adresse IP du serveur WINS
– Onglet : Identification
– Nom de l’ordinateur : (Name registration)
– Groupe de travail : (Workgroup)
– Description de l’ordinateur : nom propriétaire, par exemple.
– Optionnel : Si on veut utiliser Samba comme un PDC, sélectionnez Clients/Microsoft/”Client
pour les réseaux Microsoft”. Dans ”Propriétés” : cocher la case ”ouvrir la
174 CHAPITRE 13. SAMBA

session sur un domaine NT”, et indiquer le nom du DOMAINE qui est


identique au WORKGROUP.
– Sélectionnez ”Partage de fichiers et d’imprimantes”
– Onglet : Contrôle d’accès
Par suite, une icône ”voisinage réseau” (Network Neighborhood) apparaı̂t
sur le bureau. Quand on clique cette icône apparaissent toutes les machines
(Windows ou Unix-Samba) du groupe de travail.
A l’entrée de Windows apparaı̂tra une fenêtre demandant nom d’utilisa-
teur et mot de passe. On verra que pour accéder au serveur Samba, ces use-
rids/passwords doivent être définis en Unix (voir security=user plus loin).
Si on a sélectionné ”ouvrir la session sur un domaine NT” un 3ème champ
apparaı̂t dans cette fenêtre : ”Groupe de travail”

13.3 Commandes Lan-Manager sous DOS


13.3.1 Commandes net
– Usage : net /h|more
– Marche : net start
– Arrêt : net stop
– Liste des serveurs et des partages : net view
– Liste des partages d’un serveur : net view \\serveur
– Accès à un disque d’une machine distante :
net use e: \\zoroastre\tmp
e:
dir
net use e: /delete (fermeture de l’accès au disque)
– Fermeture de l’accès à un disque distant :
net use e: /delete
– Accès à une imprimante distante :
net use lpt2: \\zoroastre\hp5m
type fichier>lpt2
net use lpt2: /delete
– Fermeture de l’accès à une imprimante distante :
net use lpt2: /delete
zoroastre est le nom du serveur, hp5m, le nom de l’imprimante, lpt2 le
nom local sous lequel l’imprimante est déclarée
– synchronisation horloge : net time \\serveur /set/ yes

13.3.2 Interrogation de noms NetBIOS


nbtstat -a NetBIOS name

13.4 Le logiciel Samba


13.4.1 Installation
Version : Sur Debian woody 2.2.3a-15, sur Debian sarge 3.0.14a-3.
Site www : http ://fr.samba.org
13.5. CONFIGURATION DE SAMBA 175

Packages Debian : samba, samba-common, smbclient, samba-doc. samba-doc


est facultatif. smbclient l’est aussi mais très utile pour tester en Linux le fonc-
tionnement d’un serveur Samba.
Debian fait à l’installation une configuration par sambaconfig qui propose
de démarrer samba à travers inetd (déconseillé) ou comme daemon, de créer un
fichier /etc/samba/smbpasswd et de démarrer samba s’il est en daemon. Ces
paramètres sont rangés dans /etc/samba/debian config

13.4.2 Description
– Le serveur est constitué de deux daemons :
– smbd : serveur SMB : gère les accès aux ressources partagées
– nmbd : serveur de noms Netbios : permet de localiser les serveurs
– Fichier de configuration : /etc/samba/smb.conf
– Ports TCP et UDP : Entrées dans /etc/services
netbios-ns 137/tcp # NETBIOS Name Service
netbios-ns 137/udp
netbios-dgm 138/tcp # NETBIOS Datagram Service
netbios-dgm 138/udp
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
– Démarrage des daemons : En Debian /etc/init.d/samba start Remarque :
smbd et nmbd peuvent être démarrés par inetd
– Test :
testparm|more
smbclient -L serveur_samba
netstat -a|grep netbios
Le test déterminant est l’accès depuis Windows.

13.4.3 Utilitaires
– testparm : test de la configuration de Samba configuration
– testprns lp : teste l’accès à l’imprimante lp
– smbstatus : liste des connexions Samba en cours
– nmblookup : interrogation de noms NetBIOS

13.4.4 Documentation
– Livre ”Using Samba” chez O’Reilly.
ftp://ftp.medasys-digital-systems.fr/pub/linux/doc/
– http ://fr.samba.org/samba/samba.html
– man pages pour smbd, nmbd et smb.conf.
– cd /usr/doc/samba-doc

13.5 Configuration de Samba


A l’installation en Debian une configuration est proposée sous debconf Tout
le paramétrage est regroupé dans le fichier : /etc/samba/smb.conf
Quand on modifie smb.conf il faut relancer Samba.
176 CHAPITRE 13. SAMBA

13.5.1 Structure et syntaxe


Le fichier est fait de sections (nom entre crochets) et de paramètres (nom =
valeur). La casse des caractères est indifférente. Une ligne commençant par ; ou
# est ignorée.

;
; /etc/smb.conf
;
; Sample configuration file for the Samba suite for Debian GNU/Linux
;
; Please see the manual page for smb.conf for detailed description of
; every parameter.
;

[global]
...
[homes]
...
[printers]
...
[tmp]
...
[partage]
...

Test de la configuration : testparm

13.5.2 Section ”global”


Les paramètres définis dans la section global sont valables dans les autres
sections. Exemple :

[global]
printing = bsd
printcap name = /etc/printcap
load printers = yes
guest account = nobody
invalid users = root
hosts allow = 193.54.230. 127.
security = user
workgroup = PHASE
server string = %h server (Samba %v)
socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=4096 SO_RCVBUF=4096
socket address = 193.54.230.121
interfaces = 193.54.230.121
encrypt passwords = true
smb passwd file = /etc/samba/private/smbpasswd
wins support = yes
; wins server = 172.16.0.10
os level = 65
13.5. CONFIGURATION DE SAMBA 177

; domain master = no
local master = yes
preferred master = yes
name resolve order = host wins bcast
max log size = 1000
debug level = 0

Explications : voir man smb.conf


– printing : type de système d’impression Unix : BSD, SYSV, LPRNG, ...
– printcap name : nom du fichier où les imprimantes sont définies
– load printers : si yes (défaut) toutes les imprimantes du fichier printcap
sont rendues visibles.
– guest account : userid utilisé pour les services ”guest ok”. Par exemple
un client lira la browse list tenue par samba comme guest. Si guest
account est absent, il ne pourra le faire.
– invalid users : liste d’utilisateurs interdits
– hosts allow : adresses IP des machines autorisées à accéder au service.
193.54.230. désigne un réseau de classe C
– security : si user (défaut) le userid/password donné en entrée de session
Windows doit être défini sur Unix (/etc/passwd ...)
– encrypt passwords : par défaut en W98 et WNT les passwords sont
cryptés (il faut modifier la base de données de registres pour qu’ils soient en
clair). Il est recommandé maintenant de mettre encrypt passwords=yes.
– smb passwd file : nom du fichier des mots de passe. En version 3.0,
les mots de passe sont gérés dans une base de données SAM. Cette ligne
est remplacée par : passdb backend = tdbsam guest. Les mots de passe
sont dans le fichier /var/lib/samba/passdb.tdb et manipulés par la com-
mande pdbedit. Au passage de la version 2.2 à 3.0 l’installateur Debian
propose une conversion automatique.
– workgroup : nom du groupe de travail. On n’utilise pas les domaines NT.
– server string : chaı̂ne de caractères apparaissant en commentaire dans
la ”Browse List”. %h désigne le nom du serveur, %v la version de Samba.
– socket options : paramètres d’optimisation de l’interface réseau
– socket address : adresse IP écoutée par Samba. Utile en cas de IP-
aliasing.
– interfaces : précise le ou les interfaces réseaux à utiliser pour le browsing,
l’enregistrement de noms.
– wins support : si yes le daemon nmbd fera serveur WINS.
– wins server : adresse IP du WINS serveur si Samba ne le fait pas.
– os level : il y a un concours pour choisir un ”local master browser” pour
le workgroup. Celui qui a le plus fort os level l’emporte. (Wfg=W95=1,
W98=2, WNT WS=16 ou 17 WNT Serveur= 32 ou 33).
– domain master : no (utile si sous-réseaux IP)
– local master : yes Samba tiendra à jour la browse list de son workgroup
– preferred master : force nmbd à gagner le concours de master browser
au démarrage
– name resolve order : ordre de consultation des services de noms pour
résoudre les hostnames en adresses IP. host désigne le fichier /etc/hosts
et le serveur DNS, wins interroge le WINS server, bcast l’envoi d’un
broadcast.
178 CHAPITRE 13. SAMBA

– max log size : taille en Kilooctets du fichier log après quoi smbd le préfixe
en .old et en recrée un autre. Fichiers log : Depuis Samba 2.2 ils sont en
Debian dans /var/log/samba/. Ce sont /var/log/samba/log.smbd et
/var/log/samba/log.nmbd
– debug level : niveau de debug (si problème, voir les messages dans fi-
chiers logs.)

13.5.3 Partage
Un partage (share) ou service est défini par un répertoire auquel il permet
d’accèder et des conditions d’accès. C’est soit un partage de fichiers, soit un
partage d’imprimante. Les droits d’accès aux fichiers sont conditionnés par les
permissions Unix.

13.5.4 Section ”homes”


Si une section ”homes” existe, à la connexion d’un utilisateur un partage est
créé à la volée avec pour nom son userid, pour chemin d’accès (path) son home
directory et comme paramètres ceux de la section ”homes”. Cela suppose que
l’utilisateur Windows a un login Unix. Ces partages ne seront accessibles qu’à
leur propriétaire.

[homes]
comment = Home Directories
browseable = no
read only = no
create mask = 0755
directory mask = 0755

– browseable Si no, n’apparaı̂t pas dans la browse list.


– create mask : Les permission sur les fichiers Linux sont obtenues en fai-
sant un AND logique entre ce masque et le DOS mode. La valeur par
défaut de ce masque enlève les permissions write et execute pour group et
others. Exemples :
– create mask = 0700 (c’est l’option par défaut) donne rw-------
– create mask = 0700 donne rw-------
– create mask = 0700 donne rw-------
– directory mask : idem pour les répertoires

13.5.5 Section ”printers”


[printers]
comment = All Printers
browseable = no
path = /tmp
printable = yes
public = no
writable = no
create mode = 0700
13.5. CONFIGURATION DE SAMBA 179

Toutes les imprimantes décrites dans /etc/printcap seront accédées comme


c’est décrit ici. path est le répertoire où les fichiers sont stoqués avant d’être
envoyés à l’impression.

13.5.6 Partage accessible par tous en lecture/écriture


Permet aux utilisateurs Windows d’échanger des fichiers sans passer par la
messagerie ou ftp.

[tmp]
comment = Espace public temporaire
path = /tmp
read only = no
public = yes

13.5.7 Partage accessible par tous en lecture, réservé en


écriture
Ce répertoire est public mais seuls christof et weymann ont le droit d’écriture.

[fournis]
comment = Base de donnees des fournisseurs
path = /home/fournis
public = yes
writable = yes
printable = no
write list = christof, weymann

13.5.8 Partage à accès réservé


Seul le userid christof peut accéder à ce répertoire

[pv]
comment = Pages Web photovoltaique
path = /var/www/phase/pv
valid users = christof
public = no
writable = yes
printable = no

13.5.9 Authentification
La méthode recommandée est d’utiliser security=user et de prendre comme
userid/password Windows les mêmes userid/password qu’en Unix.
Si pour un partage on a mis la clause guest ok = yes, alors aucun password
n’est demandé pour l’accéder.

Mots de passe cryptés


[global]
security = user
180 CHAPITRE 13. SAMBA

encrypt passwords = yes


smb passwd file = /etc/samba/private/smbpasswd

Ce fichier /etc/samba/private/smbpasswd ne doit être lisible que par root.


Faire :
chmod 500 /etc/samba/private
Passage aux mots de passe cryptés :
cat /etc/passwd | mksmbpasswd >/etc/samba/private/smbpasswd
chmod 600 /etc/samba/private/smbpasswd
mksmbpasswd crée une entrée par utilisateurs, mais les passwords cryptés ne
sont pas entrés. Pour le faire, dans smb.conf ajouter :
encrypt passwords = no
smb passwd file = /etc/samba/private/smbpasswd
update encrypted = yes
Les machines clientes continuent à envoyer des passwords en clair mais ils
sont entrés sous forme cryptée dans /etc/samba/private/smbpasswd. Quand
ils sont tous entrés on passe à la forme cryptée en modifiant sur le serveur
smb.conf ainsi :
encrypt passwords = yes
smb passwd file = /etc/samba/private/smbpasswd
update encrypted = no
et sur les clients en modifiant la base des registres pour que les passwords
soient cryptés.
Les passwords peuvent être modifiés par l’utilisateur, il suffit de taper smbpasswd
comme pour passwd de Unix.
Documentation :zmore /usr/doc/samba-doc/ENCRYPTION.txt.gz

Gestion des mots de passe par tdbedit

13.6 Audit :
– testparm : contrôle la validité du fichier de configuration de Samba
– ping : test connectivité du client, du serveur
– smbclient -L serveur : affiche les partages de la machine serveur
– netstat -a|grep netbios : contrôle des sockets ouverts
– nmblookup : interrogation de noms NetBios
Il y a deux types de résolution de nom NetBIOS : Broadcast (option -B),
point à point (option -U).
– nmblookup -B serveur SAMBA : teste d’un serveur Samba (B comme
adresse de broadcast)
– nmblookup SAMBA : teste tous les serveurs Samba
– nmblookup ’*’ : teste toutes les machines actives supportant NetBios/SMB
dans la même zone de broadcast
– nmblookup -S serveur : liste les noms déclarés par un serveur (S comme
node status query)
13.7. INCIDENTS 181

[morel@zoroastre morel]$ nmblookup -S zoroastre


Sending queries to 193.54.230.255
193.54.230.20 zoroastre<00>
Looking up status of 193.54.230.20
received 7 names
ZOROASTRE <00> - M <ACTIVE>
ZOROASTRE <03> - M <ACTIVE>
ZOROASTRE <20> - M <ACTIVE>
..__MSBROWSE__. <01> - <GROUP> M <ACTIVE>
PHASE <00> - <GROUP> M <ACTIVE>
PHASE <1d> - M <ACTIVE>
PHASE <1e> - <GROUP> M <ACTIVE>
– nmblookup -U zoroastre -R phase : Interroge le serveur WINS zo-
roastre pour le nom PHASE (U comme Unicast)

13.7 Incidents
– Si problème consultez les log avec un niveau de debug 2 ou 3.
– ”Si je veux aller sur le serveur samba a partir de windows 95 par l’icône
Voisinage réseau. il ouvre une fenetre et me demande un password pour
\\serveur_samba\IPC$
Quel est ce password ? Pourquoi cette requete ?”
Soit vous n’avez pas répondu à la question userid/password en début de
session Windows, soit votre userid/password n’est pas conforme à celui du
serveur Samba, soit il y a désaccord sur le cryptage des passwords entre
le serveur et votre machine.En Windows 98 par défaut les passwords pour
les échanges réseau sont cryptés. Pour l’empêcher modifier ainsi la base de
registres :
Démarrer/Exécuter/regedit
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Vxd\VNETSUP\
Menu Edit/Nouveau/Valeur DWORD
Mettre le nom à EnablePlainTextPassword
(Attention aux majuscules)
Sélectionner ce nom puis
Menu Edit/Modifier/Données de la valeur:00000001
Puis rebooter.

13.8 Accès depuis Unix aux ressources Windows


Le client Unix est smbclient, il permet d’accèder aux fichiers et impri-
mantes Windows. Le support de smbfs par le noyau Linux permet de monter
des filesystems Windows à travers Samba.

13.8.1 smbclient : accès aux fichiers Windows à la ftp


– smbclient -L zoroastre -U% : liste des partages de la machine zo-
roastre et de sa browse list (si c’est un local master browser). L’option
-L indique le nom NetBIOS de la machine. L’option -U désigne le userid.
Si % cela signifie password vide.
182 CHAPITRE 13. SAMBA

– smbclient ’\\zoroastre\public’ -U% : accès au partage ”public” de


zoroastre, sans password. On accède aux fichiers à la manière de ftp, com-
mandes ls, put, get, faire help On utilise des quotes pour empêcher le
shell d’interpréter ’\’.
– smbclient //aline/java -U% : accès au partage java de la machine aline.
On remarque qu’on peut utiliser ’/’ au lieu de ’\’. Les quotes ne sont plus
nécessaires.

13.8.2 Messages Winpopup


echo "salut Eric"| smbclient -M canyon : message envoyé à Winpopup
de la machine canyon.

13.8.3 smbtar
smbtar est un shell script qui appelle smbclient. Il permet de sauver sur
un lecteur de cartouche Unix les fichiers d’un partage Windows.
Appel :

smbtar -s aline -x java -t /dev/nst0 -v

sauvegarde par tar le partage java de la machine de nom NetBIOS aline


sur le lecteur de cartouches SCSI /dev/nst0 en mode verbose.

13.8.4 smbmount
Le support de smbfs doit être configuré dans le noyau et, en Debian, il faut
le package smbfs.
– smbmount-2.0.x //aline/java smb -n : monte le partage java de la
machine aline sur le répertoire smb sans mot de passe (-n). Il n’est pas
nécessaire d’être root.
– smbmount-2.0.x -h : décrit les options
– smbumount-2.0.x smb : démonte le filesystem

13.8.5 smbprint
smbprint est un shell script qui appelle smbclient pour envoyer un fichier à
imprimer sur une imprimante Windows.
Pour imprimer il suffit de se connecter à un service d’impression et de faire
print fichier. Exemple :

smbclient //ananda/laser -U%


print nom_fichier

Ceci peut se faire par lpr via un filtre.


Configuration dans /etc/printcap, exemple :

pv|laser|LaserWriter Select 360:\


:lp=/dev/null:\
:sd=/var/spool/lpd/pv:\
:sh:\
:af=/var/spool/lpd/pv/acct:\
13.9. APPLICATIONS DE SAMBA 183

:lf=/var/log/lp3-errs:\
:if=/var/spool/lpd/pv/smbprint

Un fichier /var/spool/lpd/pv/.config doit valoriser les variables :

[morel@zoroastre pv]$ cat .config


server=ananda
service=laser
password=""

Exécute :

(echo "print -"; cat)| smbclient ’\\ananda\laser’

13.9 Applications de samba


13.9.1 Distribution de logiciels pour Windows
Au lieu de faire une installation d’un logiciel sur le disque local d’une ma-
chine, il peut être installé sur un partage d’un serveur Samba par exemple.

13.9.2 Fonction Primary Domain Controller de Samba


Comme WNT, Samba peut authentifier les utilisateurs Windows et définir
un environnement personnalisé : raccourcis du menu démarrer, icones du bureau,
préférences comme fond d’écran ou couleurs que chacun retrouvera quelque soit
la machine sur laquelle il se connecte.
Cette fonctionnalité n’est disponible qu’à partir de Samba 2.1 pour des
clients Windows NT. Pour W85/98, dans Configuration Réseau sélectionnez
Clients/Microsoft/Client pour les réseaux Microsoft Dans ”Propriétés” : cocher
la case ”ouvrir la session sur un domaine NT”, et indiquer le nom du DOMAINE
qui est identique au WORKGROUP.

Script de logon
Cela se fait par un fichier *.bat rangé sur le serveur Samba.

[global]
security=user
domain logons = Yes
logon script=%U.bat
[netlogon]
comment = Network Logon Services
path=/home/samba/netlogon
writeable= no
guest ok = no
browseable = no
locking = no
case sensitive = no
184 CHAPITRE 13. SAMBA

%U prend comme valeur le nom de l’utilisateur. Le partage netlogon est l’en-


droit où sont rangés les scripts *.bat. Ainsi pour l’utilisateur dupond il y aura
un fichier : /home/samba/netlogon/dupond.bat
Exemple d’un script dupond.bat

echo Mise a l’heure


net time \\zoroastre /set /yes
echo Ouverture de partages
net use h: \\zoroastre\tmp

Ce script sera exécuté sous Windows, il doit avoir des fins de ligne à la
MSDOS.
Le script de logon peut être collectif, par exemple :

logon script=startup.bat

Profil mobile (roaming profile)


Il permet de garder le même environnement de travail tout en changeant de
machine : l’environnement est stocké sur le serveur.

[global]
domain logons = yes
security = user
logon path = \\zoroastre\profile\%U
[profile]
comment = User profiles
path = /home/samba/profile
create mode = 0600
directory mode = 0700
writable = yes
browsable = no

Le partage profile contiendra les profils utilisateurs. Par exemple le répertoire


/home/samba/profile/dupond. Des fichiers sont copiés dans ce répertoire à la
1ère connexion, notamment un user.dat.
L’utilisateur Windows peut changer son profil. L’administrateur peut rendre
un profil obligatoire (mandatory) en renommant user.dat en user.man et en
mettant les fichiers read-only.

13.9.3 Installation partagée de drivers d’imprimante pour


W9x
Quand on clique depuis W95 sur une imprimante partagée par Samba, le
driver peut-être installé automatiquement comme depuis un serveur WNT.
Ceci ne marche pas sur WNT.
1. Créer un répertoire et un partage par exemple :

[printer$]
comment = Pilotes d’imprimante
13.9. APPLICATIONS DE SAMBA 185

path=/home/samba/printer
public=yes
writable=no
browseable=yes
2. Installer les drivers sur une machine W95.
3. Repérer les drivers nécessaires pour une imprimante. Copier
c:\windows\inf\msprint*.inf
sur Linux dans /home/samba/lib. Exécuter, par exemple :
cd /home/samba/lib
make_printerdef msprint.inf "Apple LaserWriter" >> printers.def
ce programme affiche sur stderr tous les fichiers nécessaires. Copiez les
dans /home/samba/printer
4. Ajoutez deux paramètres dans /etc/samba/smb.conf. Dans la section
[global] ’printer driver file’ doit pointer sur printers.def que
l’on vient de créer. L’autre ’printer driver location’ pour chaque
partage d’imprimante pointe sur le répertoire où le client trouvera les
drivers
Exemple :

[global]
printer driver file=/home/samba/lib/printers.def

[lp]
comment = My old printer laser
browseable = yes
printable = yes
public = yes
writable = no
create mode = 0700
printer driver=Apple LaserWriter
printer driver location=\\%h\printer$
%h donnera le nom du serveur Samba, et printer$ est le nom du partage
créé plus haut.
Voir /usr/doc/samba-doc/PRINTER DRIVER.txt.gz

13.9.4 Serveurs virtuels


La commande netbios aliases permet à un serveur de porter plusieurs
noms NetBios.
La commande include permet d’inclure de manière dynamique des pa-
ramètres de configuration.

[global]
netbios aliases = admin other
include = /etc/samba/smb.conf.%L
186 CHAPITRE 13. SAMBA

Ici le serveur apparaı̂tra dans le voisinage réseau des clients sous son nom
par exemple zoroastre et aussi sous admin et other. %L prendra les valeurs
zoroastre, admin et other.
Le fichier /etc/samba/smb.conf.admin peut contenir une section global et
des partages. S’il n’existe pas, cela ne fait pas d’erreur.
Chapitre 14

Netatalk : serveur
AppleTalk

14.1 Une implémentation du protocole Apple-


Talk en Unix BSD like
Netatalk est une implémentation du protocole AppleTalk pour les systèmes
voisins de BSD. La version actuelle supporte EtherTalk Phase I et II, DDP,
RTMP, NBP, ZIP, AEP, ATP, PAP, ASP, et AFP. La pile des protocoles est la
suivante :

AFP
|
ASP PAP
\ /
ATP RTMP NBP ZIP AEP
| | | | |
-+---------------------------------------------------+- (kernel boundary)
| Socket |
+-----------------------+------------+--------------+
| | TCP | UDP |
| DDP (kernel) +------------+--------------+
| | IP |
+-----------------------+---------------------------+
| Network-Interface |
+---------------------------------------------------+

– Couche réseau :
– DDP : Datagram Delivery Protocol
– Couche transport :
– RTMP : Routing Table Maintenance Protocol (émet un paquet RTMP
tous les 10 secondes)
– AEP : Appletalk Echo Protocol : ping utilisé au départ de chaque
session

187
188 CHAPITRE 14. NETATALK : SERVEUR APPLETALK

– ATP : Appletalk Transaction Protocol : assure la livraison des paquets


sans perte
– NBP : Name Binding Protocol : assure la correspondance entre adresses
Appletalk et entités nommées sous la forme ”objet :type@zone”. Le
sélecteur du Mac permet de sélectionner les entités nommées.
– Couche session :
– ASP : Appletalk Session Protocol : sert à établir une session
– PAP : Printer Access Protocol : fait communiquer une station et un
service d’impression
– ZIP : Zone Information Protocol permet avec RTMP de gérer la corres-
pondance entre numéros de réseaux et noms de zone.
– Couche présentation :
– AFP : AppleTalk Filing Protocol : permet d’accéder à des fichiers dis-
tants, utilisé par Appleshare.

14.2 Implémentation en Linux


– DDP est dans le noyau (mettez le de préférence en module sinon pour
arrêter Netatalk vous êtes obligé de faire shutdown)
– atalkd implémente RTMP, NBP, ZIP, and AEP. C’est l’équivalent Ap-
pleTalk de ”routed”
– afpd donne aux Mac l’accès aux filesystem Unix
– papd permet aux Mac l’accès aux imprimantes Unix
– pap permet à Unix l’accès aux imprimantes Mac

14.3 Documentation :
http://www.umich.edu/\~{}rsug/netatalk/

14.4 Installation
Package Debian netatalk Version : 2.0.2-3
Compilation du noyau :
Appletalk DDP doit être compilé sous forme de module. Sinon on ne peut
redémarrer les serveurs netatalk. Il est préférable d’autoriser le multicast.

Appletalk DDP (CONFIG_ATALK) [M/n/y/?] M


CONFIG_IP_MULTICAST = Y

Le module appletalk fait appel au module psnap qui appelle p8022.


Démarrage : Le shell script /etc/init.d/netatalk démarre les daemons
afpd papd atalkd.

/etc/init.d/netatalk start
Starting AppleTalk daemons (this will take a while):

Le package libslp1 est requis. Il met en oeuvre le protocole SLP (Service


Location Protocol RFC 2614) qui permet de localiser des services.
14.5. CONFIGURATION 189

14.5 Configuration
14.5.1 atalkd
/etc/netatalk/atalkd.conf : en général vide. Peut contenir :

eth0 -phase 2 -net 0-65534 -addr 65280.215

65280.215 est l’adresse de notre machine. Ce fichier peut être nécessaire si


on a plusieurs interfaces réseau.

14.5.2 afpd
afpd : daemon interface avec AppleTalk Filing Protocol(AFP)
Configuration
– /etc/netatalk/afpd.conf : en général vide.
– /etc/netatalk/AppleVolumes.default : répertoires accessibles depuis
le chooser d’un Mac
# default user-specific volumes to be exported go here.
# this file can be overridden by a file named ’AppleVolumes’ in the
# user’s home directory.
# local directory name of macintosh volume
~/ "Home Directory"
– $HOME/.AppleVolumes : contient les répertoires auxquels le user à accès
– /etc/netatalk/AppleVolumes.system : définit les correspondances pour
les extensions de fichiers.
Documentationman afpd
Dans chaque répertoire du serveur Linux où accèdes un Mac par Netatalk
un répertoire ”invisible” .AppleDouble est créé qui contient les mêmes noms de
fichiers que le répertoire où il se trouve. Ces fichiers sont de type AppleDouble
encoded Macintosh file.

14.5.3 papd
Le serveur papd permet aux Mac d’imprimer sur des imprimantes Unix.
Configuration dans /etc/netatalk/papd.conf :

Printer 1:LaserWriter@Printing and Mailing:\


:pr=|/usr/bin/lpr -Plp2:

14.5.4 pap
pap permet depuis Unix d’imprimer sur une imprimante Appletalk. Il faut
configurer une imprimante Unix avec les filtres de /usr/lib/atalk/filters/
qui utilisent /usr/sbin/psf.

14.6 Commandes
– aecho (=ping)
aecho "LaserWriter Select 360":LaserWriter@*
– nbplkup : affiche toutes les entités AppleTalk
190 CHAPITRE 14. NETATALK : SERVEUR APPLETALK

$ nbplkup
zoroastre:AFPServer 65280.102:128
zoroastre:netatalk 65280.102:4
zoroastre:Workstation 65280.102:4
phoebus:AFPServer 65280.8:128
phoebus:netatalk 65280.8:4
phoebus:Workstation 65280.8:4
HP LaserJet 4050 Series :SNMP Agent 65281.4:8
HP LaserJet 4050 Series :LaserWriter 65281.4:157
HP LaserJet 4050 Series :HP LaserJet 65281.4:158
LaserJet 5:SNMP Agent 65281.128:8
LaserJet 5:LaserWriter 65281.128:157
LaserJet 5:LaserJet 5 65281.128:158
direction:ARA - Client-Only 10707.22:2
direction: Power Macintosh 10707.22:252
direction:Workstation 10707.22:4
– Impression depuis Linux sur imprimante Mac
– pap -p nbpname file : envoie un fichier sur l’imprimante nbpname
Exemple : pap -p"Stylus Color" :EPSONLQ2 fichier
– papstatus -p nbpname . Exemple :
papstatus -p"LaserWriter Select 360"
– Enregistrement de nom dans la base NBP
– nbprgstr -p 4 nbpname : enregistre un nom dans la base NBP
– nbpunrgstr nbpname : signale à atalkd que nbpname est parti
– megatron est utilisé pour transformer des fichiers de BinHex, MacBinary,
AppleSingle, ou les fichiers en format AppleDouble à la manière netatalk
en MacBinary ou AppleDouble à la manière netatalk. Le format Apple-
Double à la manière netatalk est le format de fichier utilisé par afpd, le
Apple Filing Protocol (AppleShare) du serveur netatalk. BinHex, MacBi-
nary, and AppleSingle sont des formats de fichier usuels pour transférer des
fichiers Macintosh entre machines par mail ou ftp. Si megatron est appelé
sous le nom unhex, unbin, ou unsingle, il essaiera de convertir le ou les
fichiers de BinHex, MacBinary, ou AppleSingle en format AppleDouble.

14.7 Incidents
Starting AppleTalk Daemons (this will take a while):socket: Address family not s
upported by protocol
socket: Address family not supported by protocol
atalkd: can’t get interfaces, exiting.
atalkd afpd papd

Cause : le module appletalk n’est pas chargé, faites


modprobe appletalk
Chapitre 15

HylaFAX

HylaFAX est un serveur de Fax sur Unix écrite par Sam Leffler (1990-1996)
Silicon Graphics Inc.
Références HylaFAX
– Documentation HylaFAX :
http://www.hylafax.org/
– Documentation de votre serviteur :
http://www-phase.c-strasbourg.fr/inform/fax.html
Déchargement :
ftp://ftp.hylafax.org

15.1 Les normes de fax


Les organismes de normalisation : ITU (anciennement CCITT), EIA/TIA

15.1.1 Standard ITU : Groupes de Fax


– Groupe 3 : 1980 : Encodage binaire ; une page en moins de une minute.
Le plus répandu à l’heure actuelle. Suit les avis T.30 et T.4 de l’ITU.
– Group 4 : 1984 : Standard de transmission de fax sur réseau ISDN (RNIS)
à 64kbps

15.1.2 Standards ITU de vitesse de transmission


– V.17 : 14,400 bps, synchrone, half duplex, utilisé pour la transmission de
l’image
– V.29 : 9600 bps, synchrone, half duplex, utilisé pour la transmission de
l’image
– V.27ter : 4800 bps, synchrone, half duplex, utilisé en repli
– V.21 : 300 bps, utilisé pour la négociation du début

15.1.3 Protocoles d’envoi de fax


– ITU T.4 : Définit le format standard de l’image transmise par fax. L’image
est comprimée de plusieurs façons :

191
192 CHAPITRE 15. HYLAFAX

– 1-D : schéma de codage à une dimension (ou MH : Modified Hoffman)


En résolution ”fine” (7.7 lignes/mm) un fax A4 fait 3.8 millions de pixels
soit 464KB. La compression 1-D le réduit à 20-50KB.
– 2-D : codage à deux dimensions (ou MR : Modified Read) : rare
– ITU T.30 : Définit le dialoque entre deux machines de fax sur les lignes
téléphoniques. Inclut les standards de modulation et de format de données.Le
dialogue se fait en cinq phases :
– A - Initialisation de l’appel
– B - Procédure avant message : identification et choix des options
– C - Transmission du message
– D - Procédure après message
– E dit ce qu’il veut faire :
– envoi d’une autre page
– terminer EOP
– demande intervention opérateur
– R envoie son accusé de réception de la page précédente
– MCF : message confirmation : bien reçu
– RTN : retrain negative : il y a des erreurs dans la transmission
– si erreur aller à B
– si autre page aller à C
– si EOP aller à E
– E - Fin de communication
– Remarque sur T.30 :Détection d’erreur, mais pas de correction sauf si
extension ECM, Error Correction Mode

Les normes de Fax Modems


– Classe 1 (1988) EIA/TIA-578 C’est une extension du jeu de commandes
Hayes (commandes AT+F...) permettant à des ordinateurs d’envoyer et
de recevoir des fax par modem. C’est un protocole de bas niveau, car
l’ordinateur doit faire :
– la rastérisation
– la compression T.4
– la gestion du protocole T.30
L’avantage est que le protocole T.30 étant géré par logiciel, les corrections
sont faciles. Les inconvénients :
– le développeur du logiciel doit respecter T.30 qui est complexe.
– un logiciel classe 1 est très sensible aux contraintes de temps et les
systèmes multitâches comme UNIX ont des problèmes pour les respec-
ter. (voir modems classe 4 avec buffers)
– Classe 2 (1988-1992) Comme groupe 1 mais ici l’essentiel de T.30 est pris
en charge par le modem. L’ordinateur doit toujours faire la rastérisation
et la compression T.4. Avantages :
– l’écriture des logiciels est plus facile
– le logiciel n’est plus assujetti à des contraintes de temps de réponse très
strictes : c’est donc fait pour UNIX.
Mais problèmes :
– le standard a mis beaucoup de temps pour être adopté par le groupe
TR-29.2 de l’ITU-T
– en 1988 le standard est ”voté mais non adopté” : draft SP-2388
15.1. LES NORMES DE FAX 193

– en 1989 révision mais toujours non adoptée :


– draft SP-2388 document TR-29/89-21R8 du 21 mars 90
– draft SP-2388-A du 30 août 1991
– les industriels adoptent ce draft c’est la ”vieille” classe 2.
– pire : des erreurs ont été commises dans l’implémentation de SP-2388.
Ils faut distinguer :
– la vraie classe 2 : modems Everex 24/96D et modems MultiTech
– les autres basées en particulier sur les chips Rockwell ou EXAR
– Classe 2.0 EIA/TIA/ANSI-592
– après 92 on décide d’appeler le standard officiel classe 2.0
– fin 1994 seuls USRobotics et ZyXEL supportent la classe 2.0

T.30 Session Subparameter Codes


Capabilities are returned using a syntax specified in the Class 2/2.0 specifi-
cation :
(vr),(br),(wd),(ln),(df),(ec),(bf),(st)
where,
vr
indicates which vertical resolutions are supported : 0 (98 lpi), 1 (196 lpi)
br
indicates which signaling rates are supported : 0 (2400 bits/sec), 1 (4800
bits/sec), 2 (7200 bits/sec), 3 (9600 bits/sec), 4 (12200 bits/sec), 5 (14400
bits/sec)
wd
indicates which page widths are supported : 0 (1728 pixels in 215 mm), 1
(2048 pixels in 255 mm), 2 (2432 pixels in 303 mm), 3 (1216 pixels in 151
mm), 4 (864 pixels in 107 mm)
ln
indicates which page lengths are supported : 0 (A4, 297 mm), 1 (B4, 364
mm), 2 (unlimited length)
df
indicates which data formats are supported : 0 (1-D Modified Huffman),
1 (2-D Modified Huffman), 2 (2-D Uncompressed Mode), 3(2-D Modified
Modified Read)
ec
indicates whether or not the optional Error Correction Mode (ECM) is
supported : 0 (disable ECM), 1 (enable T.30 Annex A, ECM), 2 (enable
T.30 Annex C, half duplex), 3 (enable T.30 Annex C, full duplex)
bf
indicates whether or not the optional Binary File Transfer (BFT) protocol
is supported : 0 (disable file transfer modes), 1 (select BFT, T.434)
st
indicates which minimum scan times are supported : 0 (scan time/line :
0 ms/0 ms), 1 (scan time/line : 5 ms/5 ms), 2 (scan time/line : 10 ms/5
ms), 3 (scan time/line : 10 ms/10 ms), 4 (scan time/line : 20 ms/10 ms), 5
194 CHAPITRE 15. HYLAFAX

(scan time/line : 20 ms/20 ms), 6 (scan time/line : 40 ms/20 ms), 7 (scan


time/line : 40 ms/40 ms)

15.2 Fonctions de HylaFAX


Hylafax est un logiciel de télécommunication pour machines UNIX permet-
tant :
– d’envoyer et de recevoir des faxdepuis des machines en réseau TCP/IP
– de partager un modem de manière transparente entre plusieurs machines
sur réseau TCP/IP
Ses caractéristiques sont les suivantes :
– Les fax peuvent être de toutes tailles (A4, B4), soit 98 or 196 lpi et transmis
ou reçus soit en format 1D-encoded ou 2D-encoded.
– Hylafax supporte tout modem de Class 1, Class 2, ou Class 2.0.
– Les documents qui peuvent être transmis sont en format Postscript ou
TIFF Class F
– Hylafax peut générer des pages de gardes.
– Hylafax fournit une passerelle avec la messagerie.
– Les documents reçus sont en format TIFF Class F ils peuvent être conver-
tis en Postscript par fax2ps et imprimés ou envoyés par mail en attachment
en fonction du numéro de fax de l’expéditeur.
– Le modem-fax est partagé avec les applications de communications sor-
tantes qui respectent le UUCP locking protocol : cu, minicom, tip, kermit,
uucp, slip, et ppp.
– On peut aussi configurer Hylafax pour qu’il appelle getty quand des données
autres qu’un fax se présentent en entrée.
– Plusieurs modems peuvent être utilisés par le serveur.
– Hylafax possède une architecture client-serveur et supporte 2 protocoles :
– HylaFAX Client-Server Protocol sur TCP
– Le serveur gère la file d’attente des fax, il permet de programmer l’envoi
de fax en heures creuses.
– Les applications clientes sont :
– sendfax, faxstat, faxrm sur machine Unix
– Macflex sur Mac
– Winflex sur Windows 3.x
– Whfc sur Windows 95 et NT
– HylaFAX, anciennement FlexFAX, est une marque déposée de Silicon Gra-
phics Inc. Il a pour auteur Sam Leffler <sam@engr.sgi.com> et la dernière
mise à jour date de 1996/08/16. C’est un free software.

15.3 Sur quelles machines fonctionne Hylafax ?


HylaFAX est prévu pour fonctionner sur tout système UNIX qui dispose de :
– fichiers spéciaux FIFO ou tubes nommés (named pipes) commande mkfifo
– sockets à la BSD et protocoles TCP/IP
– mécanisme de locking à la BSD (flock) ou fonctionnalité équivalente per-
mettant de l’émuler (fcntl, lockf)
– interfaces POSIX 1003.1 incluant termios pour manipuler les devices tty.
15.4. CHOISIR ET INSTALLER UN MODEM : 195

Linux a ces fonctionnalités.

15.4 Choisir et installer un modem :


15.4.1 Hylafax et les modems :
– Class 1 : En classe 1 avec un USR Sporster Voice 33.6 kbps nous avons eu
des problèmes. Les modems de class 1 sont déconseillés pour HylaFAX.
– Class 2 : HylaFAX a été bien testé sur beaucoup de modems de class 2. Il il
fournit même des solutions pour contourner des erreurs d’implémentation
de T.30.
– Class 2.0 : c’est un standard encore jeune. Le driver 2.0 a été écrit pour
USR Courier puis testé sur ZyXEL 1496E

15.4.2 Les modems recommandés :


– Multi-Tech MT1432BA, MT1432BG, MT224BA, MT1932ZDX, MT2834BA,MT2834ZDX,
Class 2 Chez BlackBox France (tel 01 45 60 67 37 fax : 01 45 60 67 47) :
– MT2834ZDXF (930F HT)
– MT2834ZDXF-33 (1070F HT)
– ZyXEL U1496 Class 1, 2, 2.0 interdit à la vente en Europe. ZyXEL Elite
2864 avec Flash EPROM, extensible RNIS (2990F HT) équivalent ?
On choisira un modem externe, parce que :
– si on veut réinitialiser le modem, suite à un numéro brûlé, on n’est pas
obligé d’arrêter l’ordinateur
– les voyants lumineux permettent de voir l’activité du modem
– le modem peu aisément être déplacé sur une autre machine

15.4.3 Installer le modem sur un PC


1. Tester le port série
– Vérifier les switchs sur la carte série pour les numéros de port COM. et
les numéros d’IRQ
– sous root activer le contrôle de flux hardware :sttty -a crtscts </dev/ttyS0
2. Connecter le modem
3. Tester le modem :Avec un logiciel type cu ou minicom :
– Tester si le modem répond :Taper : ATE1QV1
Le modem doit répondre : OK
– Demander les classes de modem-fax supportées : AT+FCLASS= ?
– Demander les possibilités en fax :
– en Class1 : AT+FTM= ?
– en Class 2 : AT+FDCC= ?
– en Class 2.0 : AT+FCC= ?
– Essayer un appel : ATDT0388....
196 CHAPITRE 15. HYLAFAX

15.5 Installation de HylaFAX


15.5.1 Prérequis :
– TIFF distribution 3.4 ou suivantes
– libtiff3.4
– tiffcp(1), tiff2ps(1), tiffinfo(1), fax2ps(1)
– ftp ://ftp.sgi.com/graphics/tiff
– compilateur C++, gcc2.6.3 ou suivant libg++2.6.2 sont recommandés
– ghostscript version 2.6.1 et suivantes
– http ://www.cs.wisc.edu/ ghost/ghostscript
– il faut les drivers tiffg3 et tiffg32dvérifier par : gs -h
– pour l’installation ajouter tiffg3.dev dans Makefile list de configured
devices
– gmake >=3.63The make files are extensive and work untouched with the
system make under many systems. If your make does not understand them,
then you should be able to use the GNU make (gmake) instead.
– gawk >=2.15 utilisé dans les shell-scripts.These uses are reasonably simple,
but will not work if your awk is old enough that it does not support func-
tions or the -v command line option for setting variable values before the
BEGIN action is executed. If you encounter problems using the standard
awk on your system, try the GNU awk : gawk.
– sed de GNU
– /bin/test avec option -c

15.5.2 Procédure d’installation


– cd hylafax-v4.0pl1
– ./configure (emplacement des logiciels, librairies ...)
– make
– make install (sous root)

15.5.3 Documentation
man hylafax
man hfaxd
man config
lynx /usr/doc/hylafax-doc/index.html (en Debian)

15.6 Configuration de HylaFAX


15.6.1 Les scripts de configuration
L’essentiel du travail de configuration est fait par le script faxsetup
– contrôle l’installation des logiciels et de l’arborescence /var/spool/fax
– crée un user fax de même uid et gid que uucp.
– crée pour le daemon client-serveur hfaxd dans /etc/services les entrées :
flexfax 4557/tcp # Ancien protocol hylafax
hylafax 4559/tcp fax # Hylafax
et dans /etc/inetd.conf :
15.7. ENVOI D’UN FAX 197

hylafax stream tcp nowait fax /usr/local/sbin/hfaxd hfaxd -I


flexfax stream tcp nowait fax /usr/local/sbin/hfaxd hfaxd -O
– appelle faxaddmodem
faxaddmodem ttyS0
– crée un fichier de configuration /var/spool/fax/etc/config.ttyS0 en
fonction du modem (il y a des configurations types dans /var/spool/fax/config
– teste le modem par probemodem ttyS0
– faxaddmodem sert à ajouter un autre modem

15.6.2 Les fichiers de configuration :


– /var/spool/fax/etc/config contrôle le ”scheduler” faxq
– /var/spool/fax/etc/config.ttyS0 contrôle les programmes utilisant ce
port : faxgetty qui reçoit les fax, getty lancé par faxgetty si on permet
le mode ”données” (des connexions) sur ce modem et faxsend
– /var/spool/fax/etc/dialrules contient les règles pour composer les
numéros de téléphone.
– /var/spool/fax/etc/hosts.hfaxd contient les noms des machines clients
autorisées à accéder hfaxd
– /var/spool/fax/etc/hfaxd.conf configure hfaxd
– /var/spool/fax/etc/hyla.conf configure les clients Hylafax. En parti-
culier, la ligne Host : indique la machine serveur Hylafax.
En Linux Debian les fichiers de configuration sont en /etc/hylafax et il y
a un lien :

/var/spool/fax/etc -> /etc/hylafax/

15.6.3 Démarrage de HylaFAX


HylaFAX est servi par trois daemons : hfaxd, faxq, faxgetty
– le daemon client-serveur hfaxd est démarré par inetd (ou au boot dans
/etc/init.d/hylafax)
– le ”scheduler” faxq est démarré au boot dans /etc/init.d/hylafax
– si on autorise la réception de fax sur un modem on lance faxgetty sur son
port par init en mettant dans /etc/inittab :
S0:2345:respawn:/usr/local/sbin/faxgetty ttyS0

– si on n’utilise un modem qu’en émission de fax, on indique le modem à


faxq par faxmodem :

15.7 Envoi d’un fax


15.7.1 Commande d’envoi de fax sur Unix : sendfax
sendfax -n -d faxnum1 -d faxnum2 fichier1 fichier2 ...

– -d indique le numéro du fax destinataire, on peut le répéter


– fichier.. sont des fichiers Postscript ou Tiff. Les fichiers ASCII sont aussi
supportés mais il s’agit d’ASCII à 7 bits donc les minuscules accentuées
198 CHAPITRE 15. HYLAFAX

du français ne sont pas supportées. Nous utiliserons donc de préférence du


Postscript (généré par dvips pour les TeX groupies).
Le fax expédié est la concaténation des fichiers indiqués sur la ligne de
commande.
Exemple :

sendfax -n -d 0388106335 fichier.ps

15.7.2 Contrôle de l’envoi :


La commande faxstat permet de voir les files d’attente :
– faxstat -s : liste les fax en attente d’envoi
– faxstat -d : liste des fax envoyés
– faxrm num job : tue un fax en instance d’envoi
Vous recevez systématiquement dans votre mailbox un message qui vous
renseigne si le fax a été bien envoyé :

From: Hylafax User <fax@zoroastre.c-strasbourg.fr>


To: morel@zoroastre.c-strasbourg.fr
Subject: facsimile job 60 to 6293 completed

Your facsimile job to 6293 was completed successfully.


Pages: 2
Quality: Normal
Page Width: 209 (mm)
Page Length: 296 (mm)
Signal Rate: 9600 bit/s
Data Format: 1-D MR
Submitted From: localhost
JobID: 60
GroupID: 60
CommID: c00000133
Processing time was 1:24.

15.8 Réception d’un fax


– faxgetty doit fonctionner. Il gère le protocole T.30 en réception.
– Le fax reçu est un fichier TIFF/F, il est stocké dans /var/spool/fax/recvq
– faxgetty appelle le script /var/spool/fax/bin/faxrcvd
– Le script faxrcvd :
– regarde le numéro du fax expéditeur par faxinfo
– si ce numéro est associé à un nom d’utilisateur du serveur HylaFAX par
le script etc/FaxDispatch :
le fichier TIFF/F est converti en Postscript par fax2ps et envoyé par
mail en attachement MIME au destinataire.
– ce script peut dans les autres cas imprimer le fax par une commande
du genre :
fax2ps /var/spool/fax/recvq/faxVAAa0051G 2>/dev/null|lpr -Plp
15.9. CONFIGURATION DES CLIENTS HYLAFAX SUR UNE MACHINE LINUX199

ou être visualisé par :


fax2ps /var/spool/fax/recvq/faxVAAa0051G 2>/dev/null|ghostview -

– Un utilisateur peut voir la file des fax reçus par :


faxstat -r

Commandes de traitement des fichiers TIFF


– tiff2ps : convertit du TIFF en PS ou EPS
tiff2ps -a2 fax.tiff | lpr
– tiffinfo : affiche les tags d’un fichier TIFF
– tiffcp : copie et convertit un fichier TIFF copie de a.tiff dans b.tiff avec
la compression 1-D de T.4 pour ITU groupe 3 :
tiffcp -c g3:1d a.tiff b.tiff
– tiff2fax : convertit un fichier TIFF en TIFF/F
– ps2fax : convertit un fichier PS en TIFF/F en appelant ghostscript :
gs -q -sDEVICE=dev -dNOPAUSE -sPAPERSIZE=a4 \
-r204x$vres -sOutputFile=fichier.tiff fichier.ps
avec dev=tiffg3 pour compression 1-D ou tiffg3d pour 2-D, vres=98 ou
196lpi

15.9 Configuration des clients Hylafax sur une


machine Linux
Sur une autre machine que le serveur, machine Linux ou Unix, on installe la
partie cliente de HylaFAX. En Debian c’est le package hylafax-client.
Pour le configurer faire :

man hylafax-client

L’essentiel de la configuration consiste à indiquer la machine serveur Hyla-


FAX dans le fichier /etc/hylafax/hyla.conf :

# /etc/hylafax/hyla.conf
# System-wide client configuration file
Host: helios.c-strasbourg.fr
DialRules: "/etc/hylafax/dialrules"
# envoi un mail de notification a l’émetteur du fax dans tous les cas
Notify: done

Un utilisateur peut avoir une configuration particulière dans ~/.hylarc.


Exemple :

MailAddr: morel@phase.c-strasbourg.fr
Notify: done

15.10 Les clients HylaFAX


Contrôle d’accès : Tous les clients doivent être déclarés dans le fichier /var/spool/fax/etc/hosts.hfaxd
– Client Unix : sendfax, faxstat, faxrm
– Client sur PC et Mac :
200 CHAPITRE 15. HYLAFAX

– Le service de fax apparaı̂t comme une imprimante particulière, donc


tout logiciel qui sait imprimer peut envoyer un fax
– L’interface offre moins de possibilité que senfax : On ne peut envoyer
un fax qu’à un destinataire à la fois
– La réponse par mail doit être redemandée à chaque fois
– L’utilisateur dispose d’un carnet d’adresse de fax
– On peut contrôler l’envoi du fax (équivalent de faxstat -s) et tuer un
fax en cours ou en attente d’envoi
Client windows 3.1/3.11 : Winflex Winflex apparaı̂t comme un port
d’impression. On lui attache un driver Postscript. Il utilise l’ancien protocole
flexfax (port 4557)
ftp ://ftp.Progressive-Systems.Com/pub/unsupported/windows/winflexa4.zip
Client Mac : MacFlex

ftp://ftp.eats.com/pub/MacFlex-15b1.sea.hqx
ftp://eats.com/pub/MacFlex-1-0-B2.sea.hqx

Windows 95 et NT : Whfc

http://www.rgw-express.de/whfc/
ftp://ftp.rgw-express.de/pub/whfc/whfc.0.3e_dynamic.zip

Choisissez de préférence le driver ”HP LaserJet 4/4M Postscript”


Dans les options du driver prendre : Postscript optimisé pour portabilité.

15.11 Gestion du serveur HylaFAX


15.11.1 Optimisation des envois
HylaFAX maintient une base de données des caractéristique des fax avec qui
il a échangé en vue d’une optimisation de l’envoi la fois suivante. Exemple :

bash$ less /var/spool/fax/info/14126249163


supportsHighRes:yes
supports2DEncoding:yes
supportsPostScript:no
calledBefore:yes
maxPageWidth:1728
maxPageLength:-1
maxSignallingRate:"14400"
minScanlineTime:"20ms/10ms"
remoteCSI:""
sendFailures:0
dialFailures:0

15.11.2 Contrôle d’accès


Il est possible d’interdire d’envoyer vers certains numéros de fax ou de rece-
voir de ces numéros.
15.12. CONCLUSION 201

15.11.3 Statistiques
2 tâches quotidiennes sont lancées par cron :

0 23 * * * root /usr/local/sbin/faxqclean
25 23 * * * root sh /usr/local/sbin/faxcron | mail -s HylaFax FaxMaster
– faxqclean nettoie les spools
– faxcron envoie les statistiques d’utilisation à l’administrateur ainsi que
les rapports d’incidents

15.11.4 Incidents
Pour résoudre les incidents liés à l’envoi de fax l’administrateur dispose des
outils suivants :
– il est averti par mail
– il a une trace des échanges des modems
– pour débrouiller son problème, il a :
– la documentation sous forme man et html
– les FAQ de HylaFax
– la Mailing List : flexfax@sgi.com dont les archives sont à ftp.celestial.com
– il doit avoir une doc détaillée sur son modem
– une documentation simplifiée sur le protocole T.30
Quelques incidents
– Demande du Password lors de l’envoi d’un fax sur une machine cliente.
Cause : la machine cliente n’est pas citée dans /etc/hylafax/hosts.hfaxd

15.12 Conclusion
Intérêt d’un serveur de fax
– économie de modems et de lignes téléphoniques
– permet de limiter les points d’accès par modems à des ordinateurs
Retour d’expérience sur HylaFAX
– A condition que le modem soit choisi parmi ceux recommandés pour Hy-
laFAX, le fonctionnement est satisfaisant
– En cas d’incident, l’administrateur doit connaı̂tre un minimum sur son
modem et le protocole T.30.

You might also like