I) Les fichiers II) Les variables systèmes ou d‟environnement III

Transcription

I) Les fichiers II) Les variables systèmes ou d‟environnement III
I)
Les fichiers
II)
Les variables systèmes ou d‟environnement
III)
Les commandes Unix
IV)
L‟éditeur VI
V)
Le Shell
VI)
La compilation
VII)
Le Ramdisk
VIII)
Le système de fichiers
IX)
Création d‟archives (les outils cpio et tar)
X)
La planification de taches (crontab)
XI)
Le démarrage (boot)
XII)
Le routage
XIII)
Le serveur Apache
XIV)
Le démon inetd
XV)
Le système NFS (Network File System)
XVI)
Le Proxy
XVII)
Samba
XVIII) L‟optimisation du système
XIX)
Exemples de Shell
XX)
IPtables et Netfilters (avec le firewall UFW)
XXI)
Les Permissions Unix
UNIX /Linux – Jean Michel Meulien
Page 1
I) Les fichiers
Introduction aux fichiers Unix
Sous les systèmes UNIX tout élément est représenté sous forme de fichier. L'ensemble des
fichiers est architecturé autour d'une unique arborescence dont la base, appelée racine, est
notée «/».
Les différents types de fichiers



Les fichiers physiques, enregistrés sur le disque dur. Il s'agit du fichier au sens où on
l'entend généralement.
Les répertoires sont des fichiers (nœuds) de l'arborescence pouvant contenir des
fichiers ou d'autres répertoires. Un répertoire contient à minima un répertoire parent
(noté ..), correspondant au répertoire de plus haut niveau, et un répertoire courant
(noté .), c'est-à-dire lui-même.
Les liens sont des fichiers spéciaux permettant d'associer plusieurs noms (liens) à un
seul et même fichier. Ce dispositif permet d'avoir plusieurs instances d'un même
fichier en plusieurs endroits de l'arborescence sans nécessiter de copie, ce qui permet
notamment d'assurer un maximum de cohérence et d'économiser de l'espace disque.
On distingue deux types de liens :



Les liens symboliques représentant des pointeurs virtuels (raccourcis) vers
des fichiers réels. En cas de suppression du lien symbolique le fichier pointé
n'est pas supprimé. Les liens symboliques sont créés à l'aide de la commande
ln -s selon la syntaxe suivante :
 ln -s nom-du-fichier-réel nom-du-lien-symbolique
 Les liens physiques (aussi appelées liens durs ou en anglais hard links)
représentent un nom alternatif pour un fichier. Ainsi, lorsqu'un fichier possède
deux liens physiques, la suppression de l'un ou l'autre de ces liens n'entraine
pas la suppression du fichier. Plus exactement, tant qu'il subsiste au minimum
un lien physique, le fichier n'est pas effacé. En contrepartie lorsque l'ensemble
des liens physiques d'un même fichier est supprimé le fichier l'est aussi. Il faut
noter toutefois qu'il n'est possible de créer des liens physiques qu'au sein d'un
seul et même système de fichiers. Les liens physiques sont créées à l'aide de la
commande ln (sans l'option -n) selon la syntaxe suivante :
 ln nom-du-fichier-réel nom-du-lien-physique
Les fichiers virtuels n'ayant pas de réelle existence physique car ils n'existent qu'en
mémoire. Ces fichiers, situés notamment dans le répertoire /proc, contiennent des
informations sur le système (processeur, mémoire, disques durs, processus, etc.).
Les fichiers de périphériques, situés dans le répertoire /dev/, correspondent aux
périphériques du système. Cette notion peut être déroutante pour un nouvel utilisateur
dans un premier temps.
UNIX /Linux – Jean Michel Meulien
Page 2
L‟arborescence des fichiers :
/ la racine, elle contient les répertoires principaux
/ bin
exécutables
/sbin
exécutables systèmes
/lib
contient les bibliothèques standards partagées entre les différentes applications du
système
/mnt
permet d'accueillir les points de montage des partitions temporaires (cd-rom,
disquette)
/home contient les répertoires personnels des utilisateurs
/usr hiérarchie secondaire
/usr/X11R6 ce répertoire est réservé au système X version 11 release 6
/usr/X386 utilisé avant par X version 5, c'est un lien symbolique vers /usr/X11R6
/usr/bin contient la majorité des fichiers binaires et commandes utilisateurs
/usr/include contient les fichiers d'en-tête pour les programmes C et C++
/usr/lib contient la plupart des bibliothèques partagées du système
/usr/local contient les données relatives aux programmes installés sur la machine locale par le
root
/usr/local/bin binaires des programmes locaux
/usr/local/include fichiers d'en-tête C et C++ locaux
/usr/local/lib bibliothèques partagées locales
/usr/local/sbin binaires système locaux
/usr/local/share hiérarchie indépendante
/usr/local/src fichiers sources locaux
/usr/sbin contient les fichiers binaires non essentiels au système réservés à l'administrateur
système
/usr/share réservé aux données non dépendantes de l'architecture
/usr/src contient des fichiers de code source
/proc regroupe un ensemble de fichiers virtuels permettant d'obtenir des informations sur le
système ou les processus en cours d'exécution.
UNIX /Linux – Jean Michel Meulien
Page 3
/dev contient les points d'entrée des périphériques.
/opt données optionnelles
/root répertoire personnel de l'administrateur root. Le répertoire personnel de l'administrateur
est situé à part des autres répertoires personnels car il se trouve sur la partition racine, afin de
pouvoir être chargé au démarrage, avant le montage de la partition /home.
/etc contient les fichiers de configuration nécessaires à l'administration du système (fichiers
passwd, group, inittab, ld.so.conf, lilo.conf).
/var données variables (spooler, logs)
/tmp
fichiers temporaires
/boot contient les fichiers de chargement du noyau, dont le chargeur d'amorce.
Les principaux types de fichiers sous unix (résumé):
Tout est fichier sous Unix.
1)
2)
3)
4)
5)
6)
7)
8)
Les fichiers ordinaires
Les fichiers répertoires
Les fichiers blocs
Les fichiers caractères
Les fichiers pipe nommés (redirection)
Les fichiers liens symboliques
Les fichiers virtuels
Les fichiers périphériques
Notion de point de montage
Les fichiers d'un système UNIX sont organisés dans une arborescence unique. Il est toutefois
possible d'avoir plusieurs partitions grâce à un mécanisme appelé montage, permettant de
raccorder une partition à un répertoire de l'arborescence principale. Ainsi le fait de
monter une partition dans le répertoire /mnt/partition rendra l'ensemble des fichiers de la
partition accessibles à partir de ce répertoire, appelé «point de montage».
UNIX /Linux – Jean Michel Meulien
Page 4
II) Les variables systèmes ou d‟environnement
Ce sont des variables définies par le système d’exploitation. Elles définissent le chemin
système afin de relier des informations entre une commande ou un programme se trouvant à
des emplacements différents.
La liste ci-dessous recense les variables système les plus fréquemment rencontrées :
Variable
Signification
CDPATH
En anglais change directory path, cette variable liste les répertoires ou
sous-répertoires devant être parcourus si un nom de répertoire est saisi
derrière la commande cd.
HOME
Contient le chemin d'accès absolu au répertoire courant. Il s'agit du
répertoire dans lequel la commande cd vous fait arriver sans paramètre.
Cette variable est importante pour le Shell ( fichier ${HOME}/.profile) et
pour l'éditeur vi (fichier ${HOME}/.exrc).
IFS
En anglais Internal Field Separator, cette variable contient les caractères
séparant les mots entre eux sur une ligne de saisie. Par défaut, il s'agit de
l'espace, de la tabulation et du caractère de saut de ligne.
LANG
Cette variable permet de définir la langue que vous utilisez. Elle définit
aussi le jeu de caractères utilisables.
MAIL
Cette variable contient le nom du fichier où le système ira regarder si vous
avez reçu du courrier. Cette variable est utilisée par la commande mail.
MAILCHECK
Cette variable définit, en secondes, l'espace de temps entre lequel le système
ira voir si vous avez reçu du courrier. Par défaut, la valeur standard est de
600 (5 minutes). Si vous indiquez 0, le système ira regarder votre boite à
lettres après que vous ayez validé une commande.
PATH
Cette variable contient une liste de répertoires séparés les uns des autres par
un double point. Si une commande est saisie et reconnue comme variable
externe, le Shell parcourra ces différents répertoires pour trouver cette
commande.
UNIX /Linux – Jean Michel Meulien
Page 5
PS1
En anglais Prompt String, elle contient le texte standard que le Shell
affiche à l'écran comme invite de saisie.
PS2
Le Shell affiche le contenu de cette variable lorsque le contenu d'une ligne
de saisie n'est pas conforme à la saisie attendue. Ceci peut arriver, par
exemple, lorsque le nombre de guillemets n'est pas pair au moment où vous
validez une ligne de saisie.
SHELL
Cette variable contient le chemin d'accès absolu au programme Shell. Cette
variable est utilisée par l’éditeur vi pour choisir le Shell qui traitera les
commandes placées après le point d'exclamation.
TERM
Cette variable définit votre émulation de terminal c'est-à-dire les
différentes fonctions de votre clavier (notamment les touches de fonction),
le type d'affichage (interprétation des caractères reçus et émis, nombre de
lignes, de colonnes, etc.).
III) Les commandes Unix
Le passage d'arguments aux commandes
La plupart des commandes acceptent des arguments. On peut distinguer deux types
d'arguments :

Les options, qui sont en général précédées du caractère - pour leur forme courte ou
des caractères -- pour leur forme longue, introduite par les outils GNU.
Exemple :
$> ls -l --color
Cette commande affiche le contenu du répertoire courant de façon détaillée (-l) et en colorant
les fichiers selon leur type (--color).

Les chaînes de caractères qui peuvent représenter un fichier, une expression
rationnelle, une commande interne, etc.
Exemple :
$> grep titi mon_fichier
Cette commande recherche la chaîne titi dans le fichier mon_fichier.
UNIX /Linux – Jean Michel Meulien
Page 6
Une fonctionnalité puissante de certaines commandes Unix est de pouvoir rediriger la sortie
d'une première commande comme argument d'une seconde via le caractère pipe (tuyau en
français).
Exemple :
$> ps ax | grep init
N'affichera que les lignes retournées par la commande ps ax qui contiennent la chaîne init. Il
s'agit ici d'une redirection utilisant grep comme filtre.
Aide







info (GNU) : obtenir le manuel GNU info d'une commande.
apropos : liste les pages de manuel contenant dans leur description le(s) mot(s) clé(s)
recherché(s).
man : obtenir le manuel d'une commande.
help : obtenir de l'aide pour une commande interne du shell.
which : où se trouve ce programme ?
whatis : liste quelles commandes sont en rapport avec un mot-clef.
Commande --help : affiche une aide succincte et liste les arguments qui peuvent être
passés à la Commande en question. Cette option est la forme longue de l'option
Commande -h, des premiers systèmes UNIX.
Commandes générales


history : affiche l'historique des commandes.
type : affiche le type de la commande (alias, exécutable, etc.) et précise sa nature. s'il
s'agit d'un programme trouvé sur $PATH, il affiche le chemin absolu. (ex: type vi vs
type vim)
Communications




mesg : contrôler l'accès à votre terminal par d'autres personnes (par write).
talk : faire une conversation avec un autre utilisateur du système.
wall : envoyer un message à tous les utilisateurs du système (Write ALL).
write : envoyer un message à un utilisateur en particulier (voir mesg).
Éditeurs de texte

ed : éditeur de texte orienté ligne. (EDitor), éditeur standard d'UNIX (IEEE Std






1003.1-2004 POSIX).
emacs : éditeur de texte.
nano : éditeur de texte.
pico : éditeur de texte.
vi : éditeur de texte présent dans presque tous les systèmes Unix. (Visual Interface)
vim : voir vi (VI aMélioré, ou VI iMproved).
gedit : éditeur de texte.
UNIX /Linux – Jean Michel Meulien
Page 7
Écran




less (GNU) : visualise le contenu d'un fichier texte, avec une progression ligne par
ligne ou page par page et la possibilité de retourner en arrière et d'effectuer une
recherche. Etant beaucoup plus élaboré que son prédécesseur more, less en est son
opposé (le nom de ce programme comporte une touche d'humour car less signifie
moins, alors que more signifie plus).
more : affiche le contenu d'un fichier texte, page par page (la page correspond à la
taille du terminal).
screen : permet d'ouvrir des programmes associés à des écrans virtuels desquels
l'utilisateur peut se détacher et auxquels il peut de nouveau s'attacher plus tard.
twin : simule en mode texte (ncurses) un écran graphique.
Fichiers et répertoires
















cd : change le répertoire courant. (Change Directory)
cp : copie un fichier (CoPy), peut copier une liste de fichiers dans un autre répertoire
en conservant leur nom.
dd : effectue une copie d'un fichier avec possibilité de conversion du format (Copy
and Convert, mais cc étant déjà pris, les lettres suivantes de l'alphabet ont été
choisies, soit dd).
dir : equivalent à ls (DIRectory), n'existait pas à l'origine d'UNIX
du : affiche l'utilisation du disque. (Disk Usage)
df : affiche l'utilisation des disques. (Disk Free)
file : affiche le type de fichier en lisant son en-tête.
ln : crée un lien avec un autre dossier ou fichier. (LiNk)
ls : affiche la liste des fichiers dans le dossier courant ou d'un autre dossier. (LiSt)
mkdir : crée un ou plusieurs répertoires (MaKe DIRectory)
mv : déplace (ou renomme) un fichier, y compris si c'est un répertoire (MoVe), peut
déplacer une liste de fichiers dans un autre répertoire en conservant leur nom.
pwd : affiche le chemin du dossier courant. (Print Working Directory)
rm : supprime un/des fichier(s) ou des répertoires (avec l'option -r). (ReMove)
rmdir : supprime un ou plusieurs répertoires (ReMove DIRectory) s'il est (ou s'ils
sont) vide(s)
touch : change la date de modification d'un fichier, en le créant s'il n'existait pas.
lsof: affiche la liste des fichiers ouverts. (LiSt Open Files)
Manipulations d'archives et compressions







bzip2/bunzip2 : compresse et décompresse des fichiers
cpio : copie de fichiers à partir de ou vers une archive cpio/tar
gzip/gunzip : compresse et décompresse des fichiers. (Gnu ZIPper)
pax : un outil qui rassemble les fonctions de tar et de cpio
tar : archiveur, capable de fonctionner avec bzip2 ou gzip. (Tape ARchiver)
zip/unzip : compresse et décompresse des fichiers. (ZIP)
zcat : affiche un fichier compressé (comme cat, mais décompresse au passage)
UNIX /Linux – Jean Michel Meulien
Page 8
Recherche




find : recherche récursive, à partir d'un répertoire, de fichiers ayant des
caractéristiques données.
locate : recherche un fichier à partir de la dernière version de la base de données des
fichiers (base généralement créée par updatedb). Beaucoup plus rapide que find, mais
moins flexible.
whereis : recherche une commande dans le PATH et les pages de man
correspondants (éventuellement dans MANPATH) et retourne le ou les chemins
d'accès complet(s). Si une commande existe avec plusieurs extensions différentes, il
les liste toutes (exemple : whereis fsck listera non seulement le chemin complet de
fsck, mais aussi celui de fsck.ext2). Il recherche aussi l'éventuelle présence des
fichiers sources.
which : retourne le chemin d'accès complet d'une commande.
Gestion des disques/points de montage












df : affiche l'espace libre sur les partitions (Disk Free)
dump/restore : sauvegarde et restauration d'un système de fichiers.
fsck : effectue une vérification du système de fichiers (FileSystem ChecK); en
fonction du type de partition, il appelle l'utilitaire correspondant
 e2fsck (ou fsck.ext2) pour ext2 ou ext3 (fsck.ext2 et e2fsck sont identiques, il
s'agit de deux liens vers le même fichier)
 reiserfsck pour ReiserFS
 cramfsck pour cramfs
 fsck.jfs pour JFS
 fsck.xfs pour XFS
 fsck.minix pour le système de fichier de minix
 fsck.xiafs pour Xiafs
fsdb : débogueur de système de fichiers, pour les experts
hdparm : tuning d'un disque IDE
Sdparm : tuning d'un disque SCSI
mkfs : crée un système de fichiers. (MaKe FileSystem)
mount : attache un système de fichiers sur un point de montage.
umount : détache un système de fichiers. (UnMOUNT). « unmount » reste autorisé.
sync : pour imposer une écriture disque (par exemple, avant un arrêt électrique brutal)
tune2fs : pour le paramétrage d'une partition ext2 ou ext3
cryptsetup : cryptage d'image disque transparent
Manipulation de texte






awk : effectue des opérations sur les fichiers (afficher une colonne, la traiter, ..)
(initiales de ses créateurs : Aho, Kernighan, Weinberger)
cat : concatène des fichiers texte. Peut aussi servir à simplement afficher ou lire un
fichier. (conCATenate)
cut : supprime une partie des lignes d'un fichier selon un critère.
diff : affiche les différences entre deux fichiers.
dos2unix : convertit les retours à la ligne d'un fichier pour qu'elles soient compatibles
avec le monde Unix.
echo : affiche une ligne de texte donnée en paramètre.
UNIX /Linux – Jean Michel Meulien
Page 9
















expr : évaluer une expression (mathématique ou sur une chaîne de caractères)
fgrep : affiche les lignes qui contiennent une chaîne de caractères donnée (grep -f
sous Linux).
grep et egrep : affiche les lignes qui contiennent une expression régulière donnée,
egrep (grep étendu) est plus riche en possibilités.
head : affiche les premières lignes d'un fichier. (opposé de tail)
join : fusionne les lignes de deux fichiers contenant un ou plusieurs champs
identiques.
nl : permet de numéroter les lignes d'un fichier.
read : lit une chaîne de caractères à partir de l'entrée standard.
sed : effectue des transformations sur un flux de texte (Stream EDitor)
sort : trie les lignes d'un texte selon l'ordre alphabétique (ou numérique avec l'option n).
strings : affiche seulement les caractères imprimables (ASCII) d'un fichier binaire.
tail : affiche les dernières lignes d'un fichier. (opposé de head)
tee : copie de l'entrée standard sur la sortie standard et vers un fichier. (le nom vient de
la forme de la lettre T, qui a aussi une « entrée » et deux « sorties »)
tr : transpose ou élimine des caractères dans une chaîne (TRanspose)
uniq : recopie les données en entrée en ne conservant qu'un unique exemplaire de
lignes identiques consécutives.
unix2dos : convertit les retours à la ligne d'un fichier pour qu'elles soient compatibles
avec le monde DOS.
wc : permet de compter le nombre de caractères, de mots ou de lignes dans un fichier.
Permissions




chgrp : change le groupe propriétaire d'un fichier. (CHange GRouP)
chmod : change les permissions en lecture, écriture et/ou exécution d'un fichier.
(CHange MODes)
chown : change le propriétaire d'un fichier. (CHange OWNer)
getfacl, setfacl : respectivement, lister ou modifier les ACL de fichier (c'est
l'équivalent du CACLS pour le NTFS de Windows)
Processus






bg : met en background un process en stand-by (quitté avec ctrl-Z) comme s'il était
lancé avec &.
fg : reprend la main (foreground) d'un programme en background (ou quitté avec
ctrl-Z ou lancé avec &).
free : affiche des informations sur l'utilisation de la mémoire.
sleep : suspend l'exécution d'un processus pendant un intervalle de temps.
fuser : affiche quel processus utilise le fichier donné en paramètre.
kill : envoyer un message à un processus donné, généralement pour y mettre fin.
Signal SIGTERM (15) par défaut : arrêter le processus proprement 63 signaux
possibles de SIGHUP (1) à SIGRTMAX (63)
Valeur la plus utilisée : SIGKILL (9), qui termine brutalement un processus


killall : tue tous les processus d'un certain type, ou leur envoie un signal donné.
killall5 : tue tous les processus.
UNIX /Linux – Jean Michel Meulien
Page 10










nohup: permet de lancer un processus qui restera actif même après la déconnexion de
l'utilisateur l'ayant initiée.
nice : exécute une commande avec une priorité modifiée.
pidof : donne le PID du processus spécifié.
pkill : même commande que kill, mais par son nom au lieu de son numéro.
ps : affiche les processus en cours d'exécution (Process Status)
pstree : affiche l'arbre des processus en cours d'exécution.
renice : modifie la priorité d'un processus.
top : programme interactif qui affiche les processus les plus actifs selon un critère
donné.
xkill : permet de tuer une application lancée sous X.
vmstat : affiche les statistiques systèmes (consommation CPU, mémoire virtuelle).
Shells







bash (GNU) : Shell compatible sh de GNU (Bourne Again Shell)
sh : Shell standard (bourne Shell)
csh : C-shell, sa syntaxe de commandes est proche du langage C
tcsh : amélioration de csh
ksh : Korn Shell, le plus répandu parmi les UNIX commerciaux
zsh : Z Shell
dash : Debian Almquist Shell
Services et démarrage





dmesg : affiche les messages apparus au démarrage du système et contrôle les
tampons de messages du noyau.
init : change le niveau d'exécution (runlevel) du système.
runlevel : donne le niveau d'exécution en cours
service : démarre, arrête ou redémarre un service, sur certaines distributions linux
(Red Hat et ses cousins, mais pas sur Debian et ses dérivés)
who
who -r : pareil que runlevel
who -b : date de dernier boot (basé sur /proc/uptime)
who am I voir quel est le login initial

whoami voir sous quel login on est connecté
Réseaux


curl : transfert des données de ou vers un serveur (supporte plusieurs protocoles parmi
les plus courants).
dhclient ou pump : permet à un client DHCP d'obtenir son adresse Internet
Protocol. De façon plus détaillée, le client DHCP cherche un serveur DHCP, via
plusieurs requêtes DHCPDISCOVER en BroadCast, puis si tout se passe bien, il fait
un DHCPREQUEST adressé au serveur trouvé, il reçoit ensuite de ce serveur un
DHCPACK qui lui donne un bail pour une adresse IP. Les ports utilisés sont 67
(BOOTP serveur) et 68 (BOOTP client)
UNIX /Linux – Jean Michel Meulien
Page 11




ftp : Client FTP en ligne de commande.
host : affiche le nom d'hôte ou l'adresse IP de la machine en argument.
hostname : affiche ou modifie le nom d'hôte de la machine.
ifconfig : configurer et afficher les paramètres d'une interface réseau
La deuxième ligne contient l'adresse IP


















irssi : un client IRC en mode texte
iwconfig pour les réseaux sans fil (affichage et configuration)
links : navigateur web en mode texte
lynx : navigateur web en mode texte
mail : lire ou envoyer des courriels.
nslookup : permet de connaître l'adresse IP d'un ordinateur, via un serveur DNS.
ping : effectue un ping sur une machine distante, utilise ICMP.
route : manipulation des tables de routage.
rsh : Shell à distance (Remote SHell) (déprécié au profit de SSH qui apporte le
chiffrement).
rsync : synchronise un dossier entre deux machines distantes (Remote
SYNChronization).
sftp : client FTP en mode sécurisé, appelé SFTP.
scp : copie distante sécurisée (Secure Copy).
ssh : client SSH (Secure SHell).
traceroute : trace la route vers une machine distante routeur par routeur, en utilisant le
protocole ICMP.
tnsping : vérifie si un service Oracle répond sur un serveur.
w3m : encore un navigateur en mode texte
wget : (Www GET) télécharge des fichiers via les protocoles HTTP, HTTPS et
FTP.
whois : informations sur les enregistrements de noms de domaine ou d'adresses IP.
Utilisateurs














chfn : modifie les informations finger de l'usager. (CHange FiNger)
chsh : modifie le Shell par défaut de l'usager. (CHange SHell)
finger : donne des renseignements sur l'utilisateur
groupadd : ajoute un groupe d'utilisateurs.
groupdel : supprime un groupe d'utilisateurs.
su : commence un nouveau Shell ou une autre commande en changeant l'utilisateur.
(Switch User)
id : affiche l'identité de l'utilisateur.
sudo : exécute un processus avec les droits d'un autre utilisateur selon les règles
définies dans le fichier /etc/sudoers
users : liste compacte des utilisateurs connectés dans le système (who est meilleur).
useradd : ajoute un utilisateur au système.
userdel : supprime un utilisateur du système.
visudo : édite le fichier /etc/sudoers atomiquement, afin de donner des droits pour
l'utilisation de la commande sudo
w : affiche la liste des utilisateurs connectés et ce qu'ils sont en train de faire.
who : affiche la liste des utilisateurs connectés au système.
UNIX /Linux – Jean Michel Meulien
Page 12

whoami et who am i : savoir sous quel nom d'utilisateur (ou d'administrateur) on est
connecté (en anglais Who am I?, « Qui suis-je ? ») ; whoami ne donne pas le même
résultat que who am i si l'on est en cours de substitution d'utilisateur (su). Avec who
am i, on obtient toujours l'identité de départ (par exemple, si l'utilisateur Jeanmichel
adopte l'identité de root avec su, whoami retourne root tandis que who am i renvoie
bien Jeanmichel).
Commande pour X Window System (X11)
startx pour lancer manuellement l'interface graphique










lister des informations graphiques :
 xdpyinfo : informations générales sur le serveur graphique
 xwininfo : l'utilisateur lance cette commande, puis il clique sur la fenêtre qui
l'intéresse et il obtient des informations très détaillées sur les caractéristiques
graphiques de cette fenêtre
editres : éditeur de ressources graphiques
xev : crée une fenêtre et montre quels sont les évènements générés par les différentes
actions sur cette fenêtre (MotionNotify, LeaveNotify, ButtonPress, VisibilityNotify,
Expose...etc.)
xhost : pour contrôler l'accès au serveur X Window System
xmodmap : utilitaire pour clavier et souris (tend à disparaître)
xrdb : utilitaire pour la base de données des ressources X Window System
xset : paramétrer les préférences d'un utilisateur
xvidtune : tuning de X Window System
xwd : réalise une capture d'écran
xeyes : ouvre une fenêtre contenant deux yeux qui suivent le pointeur de la souris,
utile pour tester
IV) L‟éditeur VI
Unix propose un outil très puissant qui est un éditeur de texte appelé VI. C’est un éditeur
de type pleine page qui permet de visualiser plusieurs lignes à la fois.
Modes opératoires :
Mode de saisie : ce qui est tapé sera pris en compte en tant que texte à insérer dans le fichier.
Attention, ce n’est pas le mode par défaut.
Mode commande : ce qui est tapé sera interprété comme une commande. Dans ce cas les
caractères n’apparaissent pas à l’écran. C’est le mode par défaut.
Mode ex : ce qui est tapé est également interprété comme une commande. Mais cette fois les
caractères sont affichés en bas d’écran et l’appui sur la touche entrée rend la commande
effective. On y bascule depuis le mode commande en tapant « : », « / », « ?» « ! ».
Le mode commande
UNIX /Linux – Jean Michel Meulien
Page 13
La syntaxe d’une commande est la suivante : [n] verbe [objet]. Le nombre n permet de
répéter la commande n fois. Le verbe matérialise l’action. L’objet est ce sur quoi la
commande doit agir (un mot, une ligne…).
Les commandes qui basculent en mode saisie pour l‟ajout de texte :






a ajoute du texte après le curseur.
A ajoute du texte en fin de ligne courante.
i insert du texte avant le curseur.
I insert du texte en début de ligne courante.
o ouvre une ligne après la ligne courante.
O ouvre une ligne avant la ligne courante.
Déplacement de curseur :













k d’une ligne vers le haut.
j d’une ligne vers le bas.
h d’un caractère vers la gauche.
I d’un caractère vers la droite.
G sur la dernière ligne.
nG sur la ligne numéro n.
w au début du mot suivant.
b au début du mot précédent.
e à la fin du mot suivant.
$ à la fin de la ligne courante.
O au début de la ligne courante.
L sur la dernière ligne affichée à l’écran.
H en haut de l’écran.
Les principales commandes d‟affichage :


CTRL + f affiche la page écran suivante.
CTRL + b affiche la page écran précédente.
Les principales commandes d‟effacement :





x le caractère courant.
dw à partir du curseur jusqu’au début du mot suivant.
dG jusqu’à la fin du fichier.
dd la ligne courante.
d$ jusqu’à la fin de la ligne courante.
Pour agir sur un ensemble homogène, il suffit de donner un facteur de répétition. 3dw efface
trois mots.
Les principales commandes pour modification de texte :

rX remplace le caractère courant par le caractère X.
UNIX /Linux – Jean Michel Meulien
Page 14





R passe en mode refrappe (overwrite).
cw change le mot.
cc change la ligne courante.
ZZ sortie de vi avec sauvegarde.
u pour annuler la dernière commande
On rencontre ici les limites du mode commande, si l’on veut sortir sans sauvegarder,
sauvegarder sous un autre nom, ou encore sauvegarder le fichier sans sortir, il est
indispensable de passer en mode ex.
Les manipulations de fichier en mode ex
Les manipulations sur les fichiers :







:q sort sans sauvegarde (ou :q ! pour forcer la sortie si vi le demande).
:wq(ou ZZ) sort et sauvegarde.
:w sauvegarde (write) sans sortir.
:r nom_fichier (read) insère le contenu de nom_fichier à partir du curseur.
:e nom_fichier (edit) affiche un nouveau fichier en remplaçant le fichier courant.
:n,mw nom_fichier écrit le bloc des lignes n à m du fichier courant dans
nom_fichier.
:w >> nom_fichier écrit le fichier courant à la fin de nom_fichier.
Recherches et remplacements :
recherche la chaîne de caractère chaîne_car en balayant le texte
vers la fin du fichier et en bouclant.
même principe avec un balayage du curseur vers le début du
?chaîne_car
fichier.
permet d’atteindre l‟occurrence suivante dans le sens de la
n
recherche.
permet d’atteindre l‟occurrence précédente en inversant le sens
N
de la recherche.
substitue sur la ligne courante ancien par nouveau.
:s/ancien/nouveau/g
:1,$s/ancien/nouveau/g même action sur le fichier entier.
:n,ms/ancien/nouveau/g même action sur les lignes n à m.
g permet de recommencer l’opération si l’occurrence apparaît plusieurs fois sur une même
ligne.
/chaîne_car
Pour rechercher du texte

/texte_cherché
Pour substituer du texte

: ligne_début, ligne_fin/chaine1/chaine2/g substitue la chaine2 à la chaine1
entre les lignes ligne_début et ligne_fin sans demande de confirmation.
UNIX /Linux – Jean Michel Meulien
Page 15

: ligne_début, ligne_fin/chaine1/chaine2/c substitue la chaine2 à la chaine1
entre les lignes ligne_début et ligne_fin avec demande de confirmation.
Les expressions régulières
Certains caractères spéciaux peuvent être utilisés dans les chaînes à rechercher (nommées
aussi pattern). Ils vont faciliter les recherches et les remplacements en permettant par exemple
de décrire plusieurs chaînes en une seule. Les chaînes de caractères composées de caractères
spéciaux sont appelées expressions régulières.
Caractères spéciaux utilisés :





^chaîne_car sélectionne chaîne_car si elle se trouve en début de ligne.
chaîne_car$ sélectionne chaîne_car si elle se trouve en fin de ligne.
[a-d A-D] sélectionne le caractère s’il appartient à l’ensemble entre crochets.
. sélectionne tout caractère simple.
X* sélectionne de zéro à plusieurs X.
Exemples de combinaison de caractères spéciaux :


/^[adj].* recherche toutes lignes commençant par la lettre a,d ou j et qui se poursuit
par n’importe quels caractères quelque soit leur nombre.
/exo[0-1][0-9] recherche exo00 exo01….. exo19.
Pour protéger un caractère spécial, c'est-à-dire ne pas l’interpréter mais l’inclure dans la
chaine à rechercher, il faut précéder d’un back slash.
Couper, copier, coller
Les tampons (buffers) :
Lorsque l’utilisateur coupe ou copie du texte, il est placé dans un tampon en mémoire. Le
contenu du tampon peut être récupéré et collé ailleurs, et reste disponible jusqu’à ce que
l’utilisateur coupe ou copie à nouveau. Chaque nouvelle mémorisation écrase la précédente :




d objet : coupe (efface) l’objet et le place dans le tampon.
y objet : copie l’objet dans le tampon.
p : colle après le curseur.
P : colle avant le curseur.
La succession couper, coller correspond à un déplacement de texte.
Quelques commandes pratiques

. : Une action dans le texte doit être parfois effectuée plusieurs fois à des endroits
différents. La commande. permet de répéter ailleurs le dernier changement intervenu
sur le texte.
UNIX /Linux – Jean Michel Meulien
Page 16





u, U (undo) : En cas d’erreur, il est utile de pouvoir annuler la dernière commande. u
permet d’annuler le dernier changement et U permet d’annuler ceux réalisés sur la
ligne courante, à condition toutefois de ne pas avoir déplacé le curseur précédemment.
J : permet de supprimer un retour ligne. Elle joint la suivante à la ligne courante.
CTRL+ g : permet d’afficher le nom du fichier ouvert, en bas de l’écran.
:!commande : exécute la commande Shell spécifiée avant de revenir à vi.
!!commande : exécute la commande Shell spécifiée et intègre son résultat dans le
texte. Un seul ! apparaît en bas de l’écran.
Configuration de l‟éditeur
Pour rendre l‟éditeur plus souple à l‟utilisation, le mode ex modifie la configuration d’un
certain nombre d’options pour la session vi courante.
Syntaxe de la commande set :



: set all : affiche la configuration courante.
:set option : active l’option.
:set nooption : désactive l’option.
Quelques options utiles :





autoindent : conserve la dernière indentation utilisée d’une ligne à l’autre. CTRL +
d replace le curseur à la marge au changement de ligne.
number : le numéro de lignes s’affiche tout à fait à gauche.
tabstop=X : configure le nombre d’espaces générés par l’appui de la touche de
tabulation. Par défaut X est égal à 8 espaces.
redraw : rafraîchit l’écran après chaque changement, ce mode est activé par défaut,
selon le type de terminal utilisé, il peut être nécessaire de le désactiver. Dans ce cas, la
mise à jour de l’affichage s’effectue par CTRL + r ou CTRL +1.
showmode : en mode saisie, l’indication INPUT MODE est affichée en bas d’écran.
Toutes ces options peuvent être configurées de manière permanente en entrant ces lignes
(sans les deux points placés en première position) dans le fichier d’initialisation de vi nommé
« .exrc » stocké dans le répertoire d’accueil de l’utilisateur (HOME directory).
UNIX /Linux – Jean Michel Meulien
Page 17
V) Le Shell
Il y a plusieurs types de Shell, qui sont disponibles pour Unix/Linux. Les plus
populaires sont :

Bourne shell (sh) : C'est le Shell original d'Unix, il est très classique, et dépassé.

C shell (csh) : La syntaxe du csh est similaire à celle du langage C.

TC shell (tcsh) : Ce Shell vient avec les caractéristiques du csh, mais avec le style
emac pour l'edition {emac : un éditeur et ...}

Korn shell (ksh) : Il a les mêmes caractéristiques que le tcsh, mais sa syntaxe est
similaire à celle du sh.

Bourne Again SHell (bash) : C’est le plus populaire, il est basé sur le sh, mais il a
toutes les caractéristiques facilitant l'administration système.
(Voir quelques exemples de Shell « chapitre XIX de ce fichier »)
Quelques commandes Shell intéressantes :
$ ? : Valeur de retour de la dernière commande saisie.
Attention : la valeur 0 retourne vraie, autres valeurs que 0 toujours fausses.
$# : Nombre de paramètres d’une commande.
$* : Liste des paramètres d’une commande.
$0 –ksh : Nom du programme.
$$ : Le numéro du PID en cours.
La commande « test » :
1) test sur les fichiers
$ test –f fich1
$ echo $ ?
0
Option
-b
-c
-d
-f
-h
Signification
Le fichier est-il orienté bloc?
Le fichier est-il orienté caractère ?
Le fichier représente t-il un répertoire ?
Le fichier est-il un fichier ordinaire ?
Le fichier possède-t-il un lien symbolique ?
UNIX /Linux – Jean Michel Meulien
Page 18
Le fichier est-il un « pipe nommé » ?
Le fichier est-il lisible pour l’utilisateur ?
Le fichier a-t-il au moins un caractère ?
Le fichier peut-il être écrit par l’utilisateur ?
Le fichier peut-il être exécuté par
l’utilisateur ?
-p
-r
-s
-w
-x
2) test sur les chaines de caractères
$ test –z “variable”
Si la variable est une chaine de caractères vide, la commande retourne le code 0.
$ test –n “variable”
Si la variable est une chaine de caractères non vide, la commande retourne le code 0.
3) test numérique
$ a=10
$ test “${a}” –gt 8
Option
-eq
-ne
-lt
-gt
-le
-ge
Signification
égalité
Différence
Strictement inférieur
Strictement supérieur
Inférieur ou égal
Supérieur ou égal
Combinaison de test :
Option
!
-a
-o
Signification
Négation logique du test
Combinaison de test par un ET logique
Combinaison de test par un OU logique
L‟expression « if »
Syntaxe:
if Commandes
then Commandes
fi
Ou :
UNIX /Linux – Jean Michel Meulien
Page 19
if Commandes
then Commandes
else Commandes
fi
L‟expression « case»
Syntaxe:
case valeur in
choix 1) commandes ;;
choix 2) commandes ;;
esac
L‟expression « select»
On peut également entrer une valeur avec la commande select qui permet de présenter un
menu suivant une valeur de choix.
Syntaxe:
select <variable> in <liste de choix>
do
commande 1
commande 2
….
done
A noter que la commande select affiche une liste de choix numérotés, le numéro répondu se
trouve dans la variable prédéfinie REPLY et le choix de la liste sera contenu dans
<variable>. On peut sortir de la boucle avec la commande break.
La boucle « for»
Contrairement aux autres langages, elle n’est pas utilisée pour du comptage. On ne peut
pas fixer une valeur de départ et une valeur de fin.
Syntaxe:
for variable in liste
do
UNIX /Linux – Jean Michel Meulien
Page 20
commandes
done
La boucle « while»
La boucle consiste à piloter l’exécution d’une commande en fonction du code de retour de
la commande précédente. Aussi longtemps que la dernière commande de la série placée
derrière le mot-clé « while » retourne la valeur de 0, la série de commandes placée entre les
mots-clés do et done sera exécutée. Si cette valeur est différente de 0, la boucle sera
interrompue.
Syntaxe:
while Suitedecommandes
do
Série de commandes
done
La boucle « until»
Cette boucle inverse la logique de la boucle « while ».
Syntaxe:
until Suitedecommandes
do
Série de commandes
done
La boucle « until » est exécutée jusqu’à ce que la dernière commande de la suite de
commandes placée derrière le mot-clé « until » renvoie une valeur de 0,
UNIX /Linux – Jean Michel Meulien
Page 21
VI) La compilation
La compilation des noyaux 2.4
Elle passe par trois étapes :



génération des dépendances
compilation du noyau
compilation des modules
[root@server] # make dep (gestion des dépendances entre les modules)
[root@server] # make bzImage (noyau)
[root@server] # make modules (création des modules)
La compilation des noyaux 2.6
[root@server] # make
Résumé :
Etape
Action Noyau 2.4
Action Noyau 2.6
Edition du Makefile pour positionner l’EXTRAVERSION
make menuconfig
make dep
make bzImage
make
make modules
cp arch/i386/boot/bzImage /boot/vmlinuzVERSION[EXTRAVERSION]
make modules_install
mkinitrd /boot/initrd-VERSION[EXTRAVERSION].img
VERSION[EXTRAVERSION]
cp .config /boot/config-VERSION[EXTRAVERSION]
cp System.map /boot/System.mapVERSION[EXTRAVERSION]
Configuration
Compilation
Installation
Configuration du
chargeur de démarrage
Edition /etc/lilo.conf puis
lilo
ou Edition /boot/grub/menu.lst
VII) Le ramdisk (initrd)
Lorsqu’un noyau Linux utilise des modules, certains pilotes nécessaires au démarrage de la
machine peuvent se trouver compilés sous forme de modules et ainsi empêcher ce démarrage
de s’effectuer correctement (par exemple les pilotes des cartes SCSI, si le pilote n’est pas
chargé, le noyau ne pourra accéder aux disques durs qui contiennent les fichiers fournissant le
ou les modules du pilote SCSI). Pour éviter cela, le noyau Linux utilise au démarrage un
UNIX /Linux – Jean Michel Meulien
Page 22
mécanisme de ramdisk qui contient les pilotes nécessaires à accéder aux disques. Ce
ramdisk est chargé en mémoire par le chargeur de démarrage. Lorsque le noyau s’exécute,
il utilise les pilotes contenus dans cet initrd.
Le ramdisk se présente sous la forme d’un fichier situé habituellement dans le répertoire
/boot/initrd-VERSION[EXTRAVERSION].img.
Une commande permet de créer l’initrd, celle-ci s’appelle mkinitrd. Elle prend en
paramètre l’emplacement du fichier à créer et le numéro de version (plus l‟extraversion) du
noyau. Sa syntaxe peut légèrement varier selon les distributions Linux. Il est donc conseillé
de vérifier cette syntaxe. Dans l’exemple, la syntaxe correspond à une distribution Red Hat
ou Mandrake :
[root@server] # mkinitrd /boot/initrd-2.4.31-xeon-smp.img 2.4.31-xeon-smp
Le fichier généré ici s’appellerait /boot/initrd-2.4.31-xeon-smp.img.
VIII) Le Système de fichiers
Super bloc
I-List
Blocs
Les informations du super bloc
-taille du système de fichiers
-nom du système de fichiers
-taille de zone des inodes
-taille d’un bloc logique
-liste des inodes libres
-liste des blocs de données libres
-nom du système de fichiers
-taille du bloc 4k ou 8k
-magic number
-nombre total de blocs libres
-nombre total d’inodes libres
-taille des blocs
Inodes (information node) : nœud d’informations. Les points de montage ont toujours un
numéro d’inodes égalent à 2.
Pour formater il y a en principe deux choses a faire:
1) partitionner le disque en une ou plusieurs partitions, par exemple avec la commande:
UNIX /Linux – Jean Michel Meulien
Page 23
fdisk /dev/hdb
Dans l'hypothèse ou le disque serait /dev/hdb (2ème disque ide par exemple), on peut aussi
avoir /dev/hda, /dev/hdc, ... (1er, 3eme disque ide) ou /dev/sda, /dev/sdb pour de disques
scsi, sata. A savoir les cdrom/graveurs ide peuvent aussi occuper un nom comme /dev/hdb et
dans ce cas un 2ème disque serait plutôt /dev/hdc.
Apres avoir lance fdisk on tape "m" pour avoir la liste de commandes (affichage du tableau
des partitions, crée, détruire de partitions, changer l’attribut d'une partition etc.). Si on a
installe un disque tout neuf, il faut alors créer de partitions qui s'appellent alors /dev/hdb1,
/dev/hdb2, ... ou /dev/hdb5, ...
Il est possible que le disque soit déjà correctement partitionné et que l’on souhaite simplement
formater une des partitions. Dans ce cas passer à l'étape 2.
2) Une fois qu’on a les partitions, on peut les formater, c.-a-d. créer un système de fichiers la
dessus ("filesystem"). En Linux (Mandrake/Fedora) on utilise d'habitude un système de
type ext3. Il y a aussi riser (typiquement dans Suse) et plein d'autres. Notamment il y a vfat
(pour fat32, compatible avec Windows).
Par exemple, pour créer un système de fichiers ext3 sur la 2eme partition d'un 2ème disque
ide on pourrait faire:
mkfs.ext /dev/hdb2
Ou
mkfs.ext -c /dev/hdb2
Ou
mkfs.ext -c -c /dev/hdb2
La première méthode est la plus rapide sans vérification, la 2ème (avec un "-c") fait un
formatage avec une vérification simple en lecture des blocs et la 3ème (celle avec deux "-c")
fait une vérification longue en lecture et écriture. Selon la taille du disque et vitesse du PC ca
peut durer très longtemps (10 minutes, 30 minutes, des heures), notamment le truc avec "-c c". Le mieux est certainement la vérification simple avec "-c".
Pour créer un vfat, c'est pareil mais avec la commande mkfs.vfat (ou mkfs.msdos ou
mkdosfs, tout marche). Cependant pour le vfat (fat32), on peut aussi passer par Windows
pour formater, c'est peut-être mieux.
Pour toutes les commandes les pages man ("man mkfs.ext3", "man fdisk" etc.) pour
connaitre les autres options et leurs significations. Inutile de dire que tout ca, la création de
partitions et aussi le formatage est hyper dangereux et très délicat. C'est très facile de détruire
son système avec une mauvaise manipulation (par exemple confondre 1er disque /dev/hda et
2ème disque /dev/hdb).
Utiliser l‟utilitaire LVM
 LVM (Logical Volume Manager)
Installer lvm2 aptitude install lvm2 ensuite :
UNIX /Linux – Jean Michel Meulien
Page 24
1) création des partitions
lvcreate –L 5G –n home /dev/vg00
2) création d‟un système de fichier
mkfs –j /dev/vg00/home –L home
Création d‟un système de fichier en mode caractère
mkfs –j /dev/vg00/rhome –L home
3) montage du système de fichiers sur le point de montage
mount /dev/vg00/home / cible
UNIX /Linux – Jean Michel Meulien
Page 25
IX) La création d‟archive
Deux façons de procéder avec « cpio » ou avec « tar »:
 CPIO
Création d‟archive ou sauvegarde :
find . –print | cpio –ocvB > /dev/rt0
B: bloc copié sur bande 512 MO
Interrogation de la fiche archive:
cpio –icvBt < /dev/rt0
Restauration :
cpio –icvBdm < /dev/rt0
 TAR (tape archiver)
Création d‟archive ou sauvegarde :
tar cvf /tmp/fichier.tar
/home/fichier.
Interrogation de la fiche archive:
tar tvf /tmp/fichier.tar
Restauration de la fiche archive:
tar xvf /tmp/fichier.tar
UNIX /Linux – Jean Michel Meulien
Page 26
X) La planification de taches (crontab)
cron.allow
cron.deny
Créer un fichier de commande de cron « essai » dans :
usr/spool/cron/crontabs

*
Minute
(0-59)
*
heure
(0-23)
*
jour du mois
(1-31)
*
*
mois de l‟année jour de la semaine
(1-12)
(0-6)
Créer un Shell (sauve)
cd
find . –print | cpio –ocvB > /tmp/ &logname.cpio
rajouter cette ligne dans le fichier essai
0
21 * * 1-5
/users/dossier/sauve
Exécuter: crontab essai
crontab –l (pour savoir si le fichier existe)
crontab –l > essai
UNIX /Linux – Jean Michel Meulien
Page 27
XI) Le démarrage (boot)
Le processus /etc/init lance le démarrage du système :
boot  chargement du noyau  /etc/init  lancement des commandes à l‟état sysinit 
lancement des commandes à l‟état boot lancement des commandes à l‟état bootwait
lancement des commandes à l‟état wait.
Le fichier initab :
Champ 1
Identifiant de l‟entrée
Champ 2
Run-Levels
Champ 3
Action, condition
Champ 4
Processus #Commentaires
de lancement
Le run level : champ 2
Niveau S,s : mode mono-utilisateur
Niveau 0 : Arrêt machine.
Niveau 1: Idem niveau s, avec en plus démontage des systèmes de fichiers.
Niveau 2-5: Niveaux libres pour le fonctionnement du système.
Niveau 6 : Arrêt machine puis reboot.
L‟action : champ 3
off : La commande du dernier champ ne doit pas être exécutée, si un processus est actif, il est
arrêté.
respawn : Si la commande du dernier champ n’a pas été lancée, un processus fils est crée en
vue de son exécution. Il travaille de façon asynchrone. Dès qu’il a fini son travail, un nouveau
processus est mis en place.
wait : Un processus fils est crée en vue de son exécution. Il travaille de façon synchrone et
donc /etc/init attend la fin de son exécution avant de poursuivre l’examen du fichier inittab.
once: Identique à wait, mais sans synchronisation.
boot: La commande correspondante ne sera lancée qu’au démarrage du système. Pas d’attente
de la fin de son activité.
bootwait: Comme boot, mais avec attente de la fin de son action.
powerfail: Cette entrée et la commande correspondante ne sont traitées que si le processus
/etc/init a reçu un signal SIGPWR. Ce signal est utilisé pour informer d’une rupture de
l’alimentation électrique.
UNIX /Linux – Jean Michel Meulien
Page 28
powerwait: Comme powerfail avec attente de fin d’exécution.
sysinit: Lors du lancement de la commande, la console devra être accédée de façon matérielle
et non logique.
initdefault: indique le run-level implicite du système.
Exemple :
/etc/rc.d/rc{runlevel}.d
/etc/rc.d/rc0.d ou init 0 (arrêt de la machine)
UNIX /Linux – Jean Michel Meulien
Page 29
XII) Le routage
Lancer le service : /etc/init.d/network start (ou restart ou stop)
vi /etc/hosts
127.0.0.1
160.1.0.1
localhost
SE2
160.1.0.20 PC20
150.1.0.1
SE1
150.1.0.20 PC10
vi /etc/networks
vi /etc/networks (On décrit les réseaux)
eth0_SE2
160.1
eth0_SE1
150.1
SE1
HP) route add net 160.1.0.0 gateway SE1
Linux) route add -net 160.1.0.0 netmask 255.255.0.0 gw SE1 dev eth0
SE2
HP) route add net 150.1.0.0 gateway SE2
Linux) route add -net 150.1.0.0 netmask 255.255.0.0 gw SE2 dev eth0

On peut également utiliser /etc/sysconfig/network et /etc/sysconfig/networkscripts/ifcfg-eth0 à la place de /etc/networks
Une route par défaut (pas de Gateway)
HP) route add default dev eth1
Linux) route add -net 90.0.0.0 netmask 255.0.0.0 dev eth1
Liaison point à point TCP/IP (routage host à host)
Linux) route add –hosts 90.1.1.18 dev eth1
UNIX /Linux – Jean Michel Meulien
Page 30
XIII) Le serveur Apache
1) Vérification que le démon apache est installé
ps –ef | grep apache ou httpd ou rpm –qal | grep httpd
2) Vérification du service réseau
netstat –antp | grep more
Lancer ou relancer le service : /etc/init.d/httpd start ou restart
3) Le « Document root » (faire une recherche dans le fichier httpd)
DocumentRoot « /var/www/html »// ce chemin peut-être modifié.
4) Le « Virtual host » deux ou plusieurs sites sur le même serveur
<VirtualHost * : 7500>
DocumentRoot « /home/dossier»
DirectoryIndex index.html
<Directory « /home/dossier»>
Order allow, deny
allow from all
</Directory>
< /VirtualHost>
5) La clause “Listen”
Le port d‟écoute sur lequel l’application va s’afficher :
listen 0.0.0.0 : 80
listen 0.0.0.0 : 7500
(Ajouter une clause listen pour chaque site supplémentaire sur le serveur)
6) Les logs apache :
cd
var/log/httpd
access_log, error_log, ssl_access_log, ssl_error_log, ssl_request_log.
Les ouvrir avec head ou tail
Exemple : head access_log ou tail –f access_log
La compression GZIP
AddOutputFilterByType DEFLATE text/plain text/css application/x-javascript
text/javascript text/xml text/html
UNIX /Linux – Jean Michel Meulien
Page 31
Si vous utilisez GWT (Google Webmaster Tools), vous avez pu constater qu’il donne des
pistes d’amélioration pour la performance des sites internet, j’ai constaté pour un site un peu
lent que GWT suggérait :
Autoriser la compression à l’aide de gzip
Pour faire cela, il va falloir modifier les paramètres d’Apache. Il faut tout d’abord charger les
modules deflate et headers, sur une configuration debian classique cela donne dans le fichier
de configuration d’Apache :
LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
La configuration de deflate est gérée dans le fichier deflate.conf du répertoire modsavailable, il faut y ajouter :
AddOutputFilterByType DEFLATE text/plain text/css application/x-javascript text/xml
text/html
Feedburner RSS htaccess
Si vous avez en place un flux rss depuis un moment et que vous souhaitez obtenir des
statistiques sur celui-ci, vous pouvez utiliser feedburner qui est fait pour ça. Un problème va
cependant se poser, les utilisateurs qui auront déjà souscrit à votre flux ne seront pas
comptabilisés dans ces statistiques.
Vous pouvez alors effectuer une redirection htaccess (ou directement dans vos paramètres
apache) de votre flux initial (disons http://www.monsite.com/rss.xml vers
http://feeds.feedburner.com/monsite). Cependant attention aux règles que vous placez
dans votre htaccess, car il faut que votre flux reste accessible au robot de feedburner, sinon,
il ne pourra plus s’afficher, vous pouvez faire ainsi :
RewriteCond %{ HTTP_USER_AGENT} ! FeedBurner
RewriteRule ^/rss\.xml$ http://feeds.feedburner.com/monsite [L,R=302]
Ainsi, le robot lira de manière normale votre flux et les utilisateurs de votre flux habituel
seront redirigés vers sa réplique FeedBurner, ce qui permettra d’intégrer les utilisateurs déjà
inscrits à vos statistiques RSS.
Forcer le téléchargement d‟un type de fichier sur Apache
Pour forcer le téléchargement d’un type de fichier, on peut utiliser plusieurs méthodes. Cela
peut être utile si par exemple vous souhaitez que les fichiers pdf soient téléchargés et pas
simplement affichés dans le navigateur.
Nous utiliserons le fichier de configuration d‟apache :
UNIX /Linux – Jean Michel Meulien
Page 32
AddType application/octet-stream .pdf .zip .rar
Ainsi, les fichiers pdf zip et rar seront téléchargés.
Autre méthode :
<FilesMatch "\.(pdf|zip|rar)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
Créer un fichier htpasswd
Rien de plus simple avec la commande htpasswd de Linux.
Utilisation : htpasswd -c .htpasswd demo
L’option -c sert à créer un nouveau fichier si besoin, demo correspond à l’identifiant que l’on
souhaite, l’invite de commande demandera ensuite un mot de passe et une confirmation de
celui-ci. Voici un inventaire des options possibles :
-c créer un nouveau fichier
-n ne pas ajouter l'entrée, juste montrer le résultat dans la console
-m force l'encryptage md5 du mot de passe.
-d force encryptage du mot de passe.
-p n'encrypte pas le mot de passe.
-s force l'encryptage SHA du mot de passe.
-D Supprime l'utilisateur du fichier.
Domaine avec et sans www
Cette partie est classée dans la catégorie apache, mais relève plus de la gestion des DNS et
des serveurs de noms de domaine tel que Bind. Souvent, certains sites ne sont disponibles
qu’en tapant “http://www.jmm.net” ou http://jmm.net. La bonne pratique voudrait que
celui-ci soit disponible via les deux urls. Pour parvenir à cette fin, encore faut-il que Bind et
Apache soient bien paramétrés.
Configuration de Bind : le fichier d‟enregistrement devrait ressembler à peu près à ceci
(hébergé par ovh) :
$ttl 38400
jmm.net. IN SOA
1255006489
10800
3600
xxxx.ovh.com. sl.jmm.com. (
UNIX /Linux – Jean Michel Meulien
Page 33
604800
38400)
@
IN NS xxxx.ovh.com. # DNS primaire
@
IN NS ns.ovh.com. #DNS secondaire
www.jmm.net. IN CNAME www.ovh.com. #Alias
@ IN A xxx.xxx.xxx.xxx #remplacer par votre IP
Le “@” (arobase) est un alias pour jmm.net, tout simplement. N’oubliez pas d’enregistrer un
DNS secondaire, même pour les domaines en .com .net et consort, c’est largement
préférable.
Ainsi, www.jmm.net et jmm.net pointeront vers ma machine, merveilleusement illustrée par
xxxx.ovh.com. Il reste maintenant à configurer le serveur Web
Configuration de Apache
Configuration du domaine dans le fichier de configuration de celui-ci :
DocumentRoot /var/www/xxx
ServerName jmm.net
ServerAlias www.jmm.net
Le domaine principal est jmm.net et que www.jmm.net est un alias de ce domaine.
Rediriger le domaine avec www vers le domaine sans
Les référenceurs sont très attachés à éviter au maximum ce qui s’appelle duplicate content
(page accessible à partir de plusieurs urls, ie http://jmm.net/page.html et
http://www.jmm.net/page.html); cet état de fait n’est donc pas satisfaisant sur certains
cahiers des charges. Nous pouvons résoudre ce problème grâce au mod_rewrite d’apache
en éditant le fichier .htaccess ou celui de configuration du site :
RewriteEngine On
RewriteCond %{HTTP_HOST} !^jmm\.net [NC]
RewriteRule (.*) http://jmm.net/$1 [QSA,R=301,L]
Tous les sous domaines seront donc redirigés vers le domaine jmm.net. Notez la présence des
flags en bout de ligne, pour en savoir plus là dessus vous pouvez consulter la documentation
officielle des flags du module rewrite. Vite fait pour les flags utilisés ici :
[L] : si la règle match, le serveur n’ira pas plus loin
[R=301] : effectue une redirection permanente
[QSA] : par défaut, RewriteRule supprime les variables GET, le flag QSA permet de les
conserver.
[NC] : nocase => la règle sera insensible à la casse
(n‟oubliez pas de redémarrer les services apache et bind ).
UNIX /Linux – Jean Michel Meulien
Page 34
XIV) Le démon inetd
On fait parfois référence à inetd comme étant le « super-serveur Internet » parce qu'il gère
les connexions pour plusieurs services. Quand une connexion est reçue par inetd, ce dernier
détermine à quel programme la connexion est destinée, invoque le processus en question et lui
délègue la « socket » (le programme est invoqué avec la « socket » service comme entrée
standard, sortie et descripteurs d'erreur). Exécuter inetd pour les serveurs qui ne sont pas
utilisés intensément peut réduire la charge système globale quand on compare avec
l'exécution de chaque « daemon » individuellement en mode autonome. inetd est utilisé pour
invoquer d'autres « daemon », mais plusieurs protocoles triviaux sont gérés directement,
comme chargen, auth, et daytime. Le fichier de configuration /etc/inetd.conf. inetd est
initialisé par l'intermédiaire du système rc(8). L'option inetd_enable est positionnée à la
valeur NO par défaut, mais peut être activée par sysinstall lors de l'installation en fonction de
la configuration choisie par l'utilisateur. Placer
inetd_enable="YES"
ou
inetd_enable="NO"
dans /etc/rc.conf activera ou désactivera le lancement d'inetd à la mise en route du système.
La commande:
# /etc/rc.d/inetd rcvar
Peut être lancée pour afficher le paramétrage en vigueur.
De plus, différentes options de ligne de commande peuvent être passées à inetd par
l'intermédiaire de l'option inetd_flags.
XV) NFS (Network File System)
Le processus démon
ps –ef | grep nfsd
Sinon, démarrer le service
/etc/init.d/nfsd start ou # service nfs start ou # service portmap start
Le service réseau
netstat –antp | grep portmap
Sur le serveur nfs : déclarer les répertoires dans le fichier exports
vi /etc/exports
/users/fichier (rw)
UNIX /Linux – Jean Michel Meulien
Page 35
Exécuter : exportfs –av
Sur le client nfs (réaliser un ordre de montage)
cd /home
mkdir rep
chmod 777 rep
mount –t nfs @ip:/users/fichier /home/rep
XVI) Le serveur Proxy
C’est un service réseau (processus + IP + n°port).
1) Il permet la sécurisation des accès (filtrages sur les adresses sources et les adresses
de destination)
2) Il optimise les flux réseaux en utilisant le stockage des pages statiques (pages,
images).C’est un mécanisme de cache.
Installer la plateforme d’administration webmin
Vérification de son exécution
/etc/rc.d/init.d/webmin start
N° processus
/var/run/squid.pid
Se connecter à l’adresse suivante:
http://localhost:10000/session_login.cgi
Le fichier de configuration
/etc/squid/squid.conf
Le cache
/var/spool/squid
Les journaux
/var/log/squid
access.log, error.log, cache.log
Les ACL (Access Control List) sont des règles qui permettent le filtrage par plages
d‟adresses IP ou de ports. On peut administrer ces règles avec webmin.
UNIX /Linux – Jean Michel Meulien
Page 36
XVII) Samba
Démarrer le service
/etc/init.d/smbd start
Le fichier de configuration
/etc/samba/smb.conf
XVIII) L‟optimisation du système
sar (system audit ou accounted report)
sar –a est utile pour le suivi des opérations d‟accès sur les fichiers
sar –b est utile pour le suivi activité-buffer
sar –c est utile pour le suivi des appels systèmes
sar –d pour le suivi de l’activité des périphériques
sar –m pour le suivi des communications interprocessus (semaphores)
sar –q pour le suivi des files d‟attente
sar –u utilisation du CPU
sar –v pour le suivi des entrées de tables allouées dans le noyau
sar –p pour le suivi de la pagination
sar –r pour le suivi du nombre de pages mémoire et fichiers swap
sar –y pour le suivi des terminaux
UNIX /Linux – Jean Michel Meulien
Page 37
XIX) Exemples de Shell :
Pour exécuter un Shell, il faut le taper dans un fichier et ensuite dans la console taper
./nom_du_fichier.sh
Paramétres du programme (./nom.sh var1 var2 var3 var4 var5)
# !/bin/bash
echo "Le nom du programme est $0"
echo "le nombre de paramètres est $#"
echo "la liste des paramètres est $*"
let som=$1+$2+$3+$4+$5
echo "La somme est égale à $som"
Sélection de boisssons
#!/bin/bash
echo "Entrer le numéro de votre commande"
echo "Que désirez-vous boire ?"
select boisson in "Non rien merci" "Gueuze" "MUTZIG" "1664" "Jus de fruit" "Eau
minérale" "Thé" "Café"
do
echo "Vous avez fait le choix numéro $REPLY"
if test "$REPLY" -eq 1
then
echo "Au revoir ! "
break
else
echo "Votre $boisson est servi(e)"
fi
done
Vérification de savoir si c‟est un fichier ou un répertoire ou autre
# !bin/bash
UNIX /Linux – Jean Michel Meulien
Page 38
echo "donner un nom de fichier"
read nom
if test -f $nom
then
echo "c'est un fichier ordinaire"
elif test -d $nom
then
echo "c'est un répertoire"
else
echo "c'est un autre type de fichier"
fi
Affichage de différentes informations machine
# !/bin/bash
while true
do
echo "entrer un chiffre de 1 à 5"
read a
case $a in
1)hostname;;
2)df;;
3)ifconfig eth0;;
4)echo "bonjour";;
5)exit;;
esac
done
Calcul avec boucle
#!/bin/bash
UNIX /Linux – Jean Michel Meulien
Page 39
i=0
while test $i -ne 100
do
let i=$i+1
echo $i
done
Calcul avec boucle
#!/bin/bash
i=1
while test $i -le 100
do
let i=$i*2
echo $i
done
Affichage de la date et de l‟heure (en français)
# !/bin/bash
#affichage de la date
jours=`date | cut -f1 -d" "`
jourm=`date | cut -f2 -d" "`
mois=`date | cut -f3 -d" "`
annee=`date | cut -f4 -d" "`
heures=`date | cut -f5 -d" "`
hh=`date |cut -f5 -d" " | cut -f1 -d":"`
mm=`date | cut -f5 -d" " | cut -f2 -d":"`
sec=`date | cut -f5 -d" " | cut -f3 -d":"`
echo " nous sommes le $jours $jourm du mois de $mois de l'année $annee "
echo "il est $heures"
UNIX /Linux – Jean Michel Meulien
Page 40
echo "Il est $hh heures, $mm minutes et $sec secondes"
Faire un menu avec boucle et afficher :
L‟adresse IP de la machine
Liste des fichiers de l'arborescence
Liste des utilisateurs connectés
L'état du spooler
Le nom de la machine
Réponse :
while true
do
cd
echo « L'adresse IP de la machine taper 1 »
echo « Liste des fichiers de l'arborescence taper 2 »
echo « Liste des utilisateurs connectés taper 3 »
echo « L‟état du spooler taper 4 »
echo « Le nom de la machine taper 5 »
echo « Quitter taper Fin »
read CHOIX
case $CHOIX in
1) /etc/ifconfig lan0;;
2) cd ; ls ;;
3)who ;;
4)lpstat –t ;;
5) hostname ;;
Fin) exit ;;
esac
done
Autre Shell :
Demande un nombre et affiche bonjour un (nombre-1) de fois
Réponse :
cd
clear
echo « saisissez un nombre »
read nombre
i=1
while [$i –le $nombre]
do
echo”bonjour”
i = `expr $i + 1`
UNIX /Linux – Jean Michel Meulien
Page 41
done
Autre Shell :
Afficher la date et l‟heure (version anglaise)
Réponse:
cd
clear
JJ=`date | cut –f3 –d “ “`
JOUR=`date |cut -f1 –d “ ” `
AAAA=`date | cut –f6 –d “ ”`
MM=`date | cut –f2 –d “ “ `
HH= `date | cut –f4 –d “ “ | cut -f1 –d “:”`
MIN= `date | cut –f4 -d “ “ | cut –f2 -d “ :“`
SEC= `date | cut –f4 –d “ “ | cut –f3 -d “:” `
echo “ Bonjour nous sommes le $JJ $JOUR du mois de $MM de l‟année $AAAA”
echo « et il est $HH heures $MIN minutes $SEC secondes »
Autre Shell :
Créer une archive :
Sauvegarde, interrogation et extraction de l‟archive.
Réponse :
cd
clear
while true
do
echo « sauvegarde taper 1 »
echo « interrogation taper 2 »
echo « restauration taper 3 »
echo « sortie taper 4 »
read CHOIX
case $CHOIX in
UNIX /Linux – Jean Michel Meulien
Page 42
1) tar –cvf /tmp/$LOGNAME.tar .
[ $ ? –ne 0] && echo « problème » && exit ;;
2) tar –tvf /tmp/$LOGNAME.tar
[ $ ? –ne 0] && echo « problème fichier » && exit ;;
3) tar –xvf /tmp/$LOGNAME.tar ;;
4) exit ;;
esac
done
Autre Shell :
Créer une archive (méthode différente):
Sauvegarde, interrogation et extraction de l‟archive.
Réponse :
cd
clear
while true
do
echo « sauvegarde de l‟arborescence : taper 1 »
echo « interrogation de l‟archive : taper 2 »
echo « restauration de l‟arborescence : taper 3 »
echo « sortie taper F »
echo “\t saisir votre choix : »
read CH
case $CH in
1) echo « création sauvegarde …………..»
find . –print | cpio –ocvB > /tmp/$LOGNAME.cpio
if [ $? –ne 0] then echo « échec sauvegarde …. EXIT !!! »
pause 3
exit
fi
;;
2) echo « interrogation fichier archive …. »
UNIX /Linux – Jean Michel Meulien
Page 43
cpio –icvBt < /tmp/$LOGNAME.cpio
if [ $? –ne 0] then echo « problème lecture sur fichier archive »
exit 2
pause 3
fi
pause 3
;;
3) echo « restauration de mon répertoire…………. »
cd
cpio –icvBd < /tmp/$LOGNAME.cpio
;;
F|f) break ;;
*) echo “ erreur de saisie”
;;
esac
done
Autre Shell :
Faire un menu avec boucle et afficher :
Afficher le fichier hosts
Afficher les utilisateurs
Afficher le nom de la machine
Afficher l‟adresse IP de la machine
Afficher le programme
Réponse :
while true
do
cd
echo « choix 1 : Affichage du fichier hosts »
echo « choix 2 : Affichage des utilisateurs »
echo « choix 3 : Affichage du nom de la machine»
echo « choix 4 : Affichage de l‟adresse IP de la machine»
echo « choix 5 : Affichage du programme»
echo « Quitter taper Fin »
read CHOIX
case $CHOIX in
UNIX /Linux – Jean Michel Meulien
Page 44
1) cat /etc/hosts ;;
2) who ;;
3) hostname;;
4) /etc/ifconfig lan0;;
5) break ;;
Fin) exit ;;
esac
done
Autre Shell :
Vérifier l‟existence du fichier « chiffre » :
Réponse :
if test –f chiffre
then
echo “le fichier chiffre existe – action de sauvegarde »
cp chiffre sauv.chiffre
fi
while true
do
echo “\t\t MENU”
echo « Veuillez indiquer un nombre compris entre 1 et 99 ou Fin pour sortir»
read NBRE
case $NBRE in
[1-9] | [1-9] [0-9] ) echo $NBRE >>chiffre ;;
Fin|fin) break ;;
*) echo “ erreur de choix”;;
esac
done
echo « affichage du fichier »
cat chiffre
Autre Shell :
Nombre total de fichiers et nombre de fichiers répertoire et ordinaires :
Réponse :
clear
cd
UNIX /Linux – Jean Michel Meulien
Page 45
ORD =0
TOT =0
REP =0
for NOM in `find . –print`
do
TOT=`expr $TOT + 1`
if test –f $NOM
then
ORD=`expr $ORD + 1`
echo “$NOM est un fichier ordinaire »
fi
if test –d $NOM
then
REP=`expr $REP + 1`
echo “$NOM est un fichier répertoire »
fi
done
echo « le nombre de fichiers total est $TOT »
echo « le nombre de fichiers répertoire est $REP»
echo « le nombre de fichiers ordinaires est $ORD »
Autre Shell :
Affichage Adresse IP et Arborescence
Réponse :
cd
clear
who > liste
cp /etc/hosts fichier1
UNIX /Linux – Jean Michel Meulien
Page 46
mkdir rep1 rep2
cd rep1
env > environnement
cd .. /rep2
cat /etc/passwd | grep « $LOGNAME » > extrait
ln extrait ../lien
cd
echo « Affichage de l‟adresse IP »
/etc/ifconfig lan0
echo « Affichage de l‟arborescence »
ll –R
Autre Shell :
Nom du programme, nombre et liste de paramètres :
(On lance le TP avec 4 paramètres par ex : tp3 10 100 15 15)
Réponse :
echo « le nom du programme est $0 »
echo « le nombre de paramètres est $# »
echo « la liste des paramètres est $* »
SOM= ` expr $1 + $2 + $3 + $4 `
echo « la somme est égale à $SOM »
NBRE =`expr $SOM : „.*‟ `
echo « le nombre de caractères de la somme est $NBRE »
Autre Shell :
Indiquer le type de fichiers parmi une liste:
Réponse :
cd
clear
echo « \t\t Indiquer un nom de fichier parmi la liste suivante »
ll
UNIX /Linux – Jean Michel Meulien
Page 47
read NOM
if test –f $NOM
then
echo « $NOM est un fichier ordinaire »
if test –r $NOM
then
echo « $NOM est un fichier ordinaire lisible »
cat $NOM
else
echo « $NOM est un fichier ordinaire non lisible »
fi
else
if test –d $NOM
then
echo « $NOM est un fichier répertoire »
cd $NOM
ll
else
echo “$NOM n‟est ni un fichier répertoire ni un fichier ordinaire »
fi
fi
UNIX /Linux – Jean Michel Meulien
Page 48
Autre Shell :
Création de routes réseaux:
Réponse :
case « $1 » in
start) route add default dev eth0 ;;
stop) route del default ;;
restart) $0 stop
$0 start ;;
*) gprintf “Usage : %s { start| stop| status| restart| condrestart } \n” “$0”
exit 1 ;;
esac
exit 0
XX) NetFilter et IPtables
Préambule
On peut parler à l'infini des avantages comparés de Linux face aux systèmes Microsoft et
réciproquement, il y a tout de même un domaine où la discussion est impossible, sauf peut
être avec une mauvaise foi extrême, c'est celui de la gestion des réseaux. Même si Windows
2000 est en très net progrès par rapport à Windows NT4 (nous parlons ici des versions
server), Les noyaux Linux 2.6.x avec IPTables et IPRoute2 disposent, à mon sens, d'une
très confortable avance. Ces versions 2.6 du noyau Linux sont particulièrement riches dans
ce domaine et il devient sans doute possible de réaliser avec ce système des passerelles et des
firewalls aussi performants sinon plus, que certains matériels spécialisés. Iproute2 constitue
une nouvelle approche de la gestion des routes inter réseaux. Iproute2 mériterait à lui seul un
chapitre complet. Nous ne ferons ici que l'évoquer.
Netfilter permet de faire beaucoup plus de choses en matière de filtrage de paquets et de
translation d'adresses que ses prédécesseurs, ce qui fait de Linux 2.6 un outil de choix pour la
réalisation de passerelles entre réseaux privés et l'Internet. Ce chapitre a pour but de
présenter succinctement l'architecture et les principales fonctionnalités de Netfilter, dans le
cadre d'un réseau domestique connecté au net par une ligne à haut débit type câble ou ADSL.
Architecture
Avant propos
Avertissement important à ceux qui maîtrisent IPchains
NetFilter avec IPtables n'a pas du tout la même architecture, le fonctionnement est différent,
même si la syntaxe d'IPtables peut paraître proche de celle d'IPchains.
En particulier, les chaînes INPUT et OUTPUT ne contrôlent pas tout ce qui entre et sort de
la passerelle, routage compris, mais uniquement ce qui entre en direction de la passerelle elle
même et sort de la passerelle elle même. Entendez par là que tout le trafic entre le réseau privé
UNIX /Linux – Jean Michel Meulien
Page 49
masqué par le NAT et l'Internet ne sera aucunement influencé par ces deux chaînes. Nous
verrons en détail plus loin pourquoi et comment.
Avertissement aux utilisateurs exclusifs des interfaces graphiques
Avec les versions 2.2.x, nous avions l'excellent outil gfcc qui permettait de faire à peu près
tout ce qu'il était possible de faire avec IPchains. Malheureusement, avec IPtables, je n'ai pas
encore trouvé d'outil équivalent à l'heure où j'écris ces lignes. Essayez de voir avec knetfilter,
mais ce n'est pas du tout la même chose.
Position du problème
Comme d'habitude sur ce site, l'exposé s'appuie sur une passerelle Linux mettant en relation
un réseau privé avec le net, au moyen d'une liaison haut débit et permanente de type câble ou
ADSL.
Topologie de la machine Linux
La machine Linux dispose de deux interfaces Ethernet. Ici:
Réseau Privé
Eth0
Internet
Eth1
Passerelle Linux 2.4.x


Eth0 sur le réseau local (privé)
Eth1 sur l'Internet via le modem câble du fournisseur d'accès. Cette interface, le plus
souvent, sert de support à PPPoE.
Il faut bien comprendre qu'à priori, il peut entrer et sortir des données de chaque interface.




Il peut entrer et sortir des données par Eth0, parce qu'un client du réseau local établit une
connexion avec un service installé sur la passerelle, Samba par exemple, pour le partage
de fichiers avec Windows.
Il peut entrer et sortir des données par Eth1 (ou la connexion ppp qui y est associée) parce
qu'un client situé sur le Net établit une connexion avec un service installé sur la passerelle,
une session ssh ou telnet par exemple (ssh, c'est mieux…). Il peut se faire aussi que cette
connexion s'établisse à votre insu, parce qu'un pirate est en train de prendre possession de
votre machine (mais ceci est une autre histoire, développée au chapitre de la sécurité).
Il peut se faire également qu'une connexion s'établisse entre un poste du réseau privé et un
serveur situé sur le net. Dans ce cas, les paquets entreront par une interface et sortiront par
l'autre.
En toute rigueur, il est également possible qu'une connexion s'établisse entre un client
situé sur le net et un serveur situé sur votre réseau privé (si si, c'est possible aussi, bien
que dans le cadre d'un réseau domestique, ce ne soit pas nécessaire, ni même souhaitable).
Là aussi, les paquets qui entrent par une interface sortiront par l'autre. Quel que soit le cas
de figure vu plus haut, dans ce qui suit, nous ne ferons pas de ségrégation sur l'interface
UNIX /Linux – Jean Michel Meulien
Page 50
par laquelle les paquets entrent ni l'interface par laquelle les paquets sortent. Cette
ségrégation interviendra éventuellement dans les règles que nous écrirons avec IPtables.
Netfilter dans la pile IP
En tout état de cause, dans l'explication qui suit, quelles que soient l'origine et la destination
des paquets, ils vont entrer dans la pile de protocoles IP par le même point et en sortir par le
même autre point. Netfilter se présente comme une série de 5 hooks (points d'accrochage),
sur lesquels des modules de traitement des paquets vont se greffer.
NF_IP_PRE_ROUTING
1
Décision de routage
2
NF_IP_LOCAL_IN
NF_IP_FORWARD
3
Process
Local
5
NF_IP_LOCAL_OUT
Routage
4
NF_IP_POST_ROUTING
Ces points sont:
 NF_IP_PRE_ROUTING
 NF_IP_LOCAL_IN
 NF_IP_FORWARD
 NF_IP_POSTROUTING
 NF_IP_LOCAL_OUT
La branche gauche représente le trajet des paquets qui entrent et qui sortent vers et depuis un
processus local (SMB, FTP, http, etc.) La branche de droite représente le trajet des paquets
qui traversent notre passerelle dans sa fonction de routeur.
Que l'on peut représenter autrement ainsi :
UNIX /Linux – Jean Michel Meulien
Page 51
Point d‟entrée
NF_IP_PREROUTING
Point de sortie
NF_IP_FORWARD
NF_IP_LOCAL_IN
NF_IP_POSTROUTING
NF_IP_LOCAL_OUT
PROCESSUS LOCAUX
Attention toutefois, ces diagrammes sont faux, dans la mesure où ils sont largement
simplifiés. Leur but est uniquement de montrer où Netfilter vient interagir avec la pile IP, en
En aucun cas, il ne représente l'architecture complète de la pile IP.
Ce que sait faire Netfilter
A travers ces cinq points d'insertion, Netfilter va être capable :

d'effectuer des filtrages de paquets, principalement pour assurer des fonctions de
Firewall. On pourra par exemple interdire à tous les paquets venant de l'Internet et
s'adressant au port 80 (HTTP) de passer. Notre serveur APACHE est un serveur Intranet
et ne doit pas être accessible depuis l'extérieur.
 d'effectuer des opérations de NAT (Network Address Translation). Ces fonctions sont
particulièrement utiles lorsque l'on veut faire communiquer tout ou partie d'un réseau
privé, monté avec des adresses IP privées (192.168.x.x par exemple) avec l'Internet.
 d'effectuer des opérations de marquage des paquets, pour leur appliquer un traitement
spécial. Ces fonctionnalités sont particulièrement intéressantes sur une passerelle de
réseau d'entreprise, un peu moins pour notre cas de réseau domestique.
Comment Netfilter sait le faire
Netfilter dispose d'une commande à tout faire : IPtables. Cette commande va permettre, entre
autres, d'écrire des chaînes de règles dans des tables. Il y a dans Netfilter trois tables qui
correspondent aux trois principales fonctions vues plus haut:
Les tables et leurs chaînes
Il existe trois tables qui vont servir à contenir des règles de filtrage
UNIX /Linux – Jean Michel Meulien
Page 52
IPTABLES
FILTER
NAT
MANGLE
INPUT
PREROUTING
OUTPUT
POSTROUTING
PREROUTING
FORWARD
OUTPUT
OUTPUT
La table « Filter »
Cette table va contenir toutes les règles qui permettront de filtrer les paquets. Cette table
contient trois chaînes :



la chaîne INPUT.
Cette chaîne décidera du sort des paquets entrant localement sur l'hôte.
la chaîne OUTPUT.
Ici, ce ne sont que les paquets émis par l'hôte local qui seront filtrés.
la chaîne FORWARD.
Enfin, les paquets qui traversent l'hôte, suivant les routes implantées, seront filtrés ici.
La table NAT
Cette table permet d'effectuer toutes les translations d'adresses nécessaires.

La chaîne PREROUTING.
Permet de faire de la translation d'adresse de destination. Cette méthode est intéressante si
l'on veut faire croire au monde extérieur, par exemple, qu'il y a un serveur WEB sur le
port 80 de la passerelle, alors que celui-ci est hébergé par un hôte du réseau privé, sur le
port 8080.
 La chaîne POSTROUTING.
Elle permet de faire de la translation d'adresse de la source, comme du masquage
d'adresse, la méthode classique pour connecter un réseau privé comme client de l'Internet,
avec une seule adresse IP publique.
 La chaîne OUTPUT.
Celle-ci va permettre de modifier la destination de paquets générés localement (par la
passerelle elle-même).
La table MANGLE
Cette table permet le marquage des paquets entrants (PREROUTING) et générés localement
(OUTPUT). Le marquage de paquets va permettre un traitement spécifique des paquets
marqués dans les tables de routage avec IPROUTE 2. Depuis la version 2.4.18 du noyau,
d'autres tables ont été rajoutées sur tous les hooks. Nous avons ainsi à notre disposition les
tables supplémentaires INPUT, POSTROUTING et FORWARD
Les chaînes
Les chaînes sont des ensembles de règles que nous allons écrire dans chaque table. Ces
chaînes vont permettre d'identifier des paquets qui correspondent à certains critères.
UNIX /Linux – Jean Michel Meulien
Page 53
Les cibles
Les cibles enfin sont des sortes d'aiguillage qui dirigeront les paquets satisfaisant aux critères.
Les cibles préconstruites sont :

ACCEPT
Les paquets qui satisfont aux critères sont acceptés, ils continuent leur chemin dans la
pile,
 DROP
Les paquets qui satisfont aux critères sont rejetés, on les oublie, on n'envoie même pas de
message ICMP. Un trou noir, quoi.
 LOG
C'est une cible particulière qui permet de tracer au moyen de syslog les paquets qui
satisfont aux critères.
Suivant les contextes, d'autres cibles deviennent accessibles, comme REJECT (similaire à
DROP, mais avec envoi d'un message d'erreur ICMP à la source du paquet rejeté),
RETURN, REDIRECT, SNAT, DNAT, MASQUERADE.
En français, nous pourrons faire des choses de ce genre :




par défaut, tous les paquets qui entrent sont rejetés (DROP)
les paquets qui entrent par le port 80 sur l'interface eth0 sont acceptés
les paquets qui sortent par le port 80 sur l'interface eth0 sont acceptés
etc.
Nous verrons cela plus en détail dans les divers exemples.
La commande « IPtables »
IPtables est en quelques sortes l'interface utilisateur de Netfilter. Dans sa partie visible, tout
ceci ressemble aux bonnes vieilles IPchains (noyaux 2.2), mais ici, ce n'est qu'une interface
de commande de Netfilter. La syntaxe est plus complète et plus rigoureuse.
Conntrack
Le suivi de connexion
Le suivi de connexion est un concept essentiel dans Netfilter. C'est une sorte d'intelligence
artificielle qui permet d'établir des liens de cause à effet entre les paquets qui passent dans la
pile. Il faut, à un moment donné, dire quelques mots à propos de ce suivi de connexion.
Comme c'est une notion qui va intervenir aussi bien dans le filtrage que dans la traduction
d'adresses, autant en parler tout de suite.
Expérience préliminaire
Le principe du suivi de connexion permet de réaliser un « firewall statefull », c'est à dire qu'il
va réagir intelligemment sur une connexion donnée, suivant son état. Voyez éventuellement à
ce propos le chapitre sur la sécurité. Comme ce n'est pas très simple d'expliquer cela, nous
allons observer un exemple sur le terrain. Nous allons établir une connexion TCP à partir du
protocole HTTP :
No. Time
Source
Destination Protocol Info
10 10.181832 192.168.0.10 212.27.35.1 TCP 4252 > http [SYN]
11 10.204707 212.27.35.1 192.168.0.10 TCP http > 4252 [SYN, ACK]
UNIX /Linux – Jean Michel Meulien
Page 54
12 10.204848 192.168.0.10 212.27.35.1 TCP 4252 > http [ACK]
13 10.205333 192.168.0.10 212.27.35.1 HTTP GET / HTTP/1.1
L'établissement d'une connexion TCP suit un protocole strict :



Une requête de synchronisation [SYN] de la part de l'initiateur du dialogue (le client),
une réponse d'accusé réception de la synchronisation [SYN, ACK] de la part du serveur,
un accusé réception du client [ACK]
Observons également les sockets.

Trame n°10:
Le client [192.168.0.10] s'adresse au serveur [212.27.35.1] sur le port http (80). Il attend
une réponse sur le port 4252. C'est un numéro pris plus ou moins au hasard. A priori,
personne ne peut le deviner à l'avance.
 Trame n°11:
Le serveur, bien élevé, répond au client sur le port demandé (4252)
La même chose, mais plus détaillée, ce qui donne l'occasion de voir l'ensemble des « flags »
exploitables au niveau TCP :
Frame 10 (62 bytes on wire, 62 bytes captured)
...
Transmission Control Protocol
Source port: 4252 (4252)
Destination port: http (80)
Sequence number: 3290220049
Header length: 28 bytes
Flags: 0x0002 (SYN)
0... .... = Congestion Window Reduced (CWR): Not set
.0.. .... = ECN-Echo: Not set
..0. .... = Urgent: Not set
...0 .... = Acknowledgment: Not set
.... 0... = Push: Not set
.... .0.. = Reset: Not set
.... ..1. = Syn: Set
.... ...0 = Fin: Not set
...
Frame 11 (62 bytes on wire, 62 bytes captured)
...
Transmission Control Protocol
Source port: http (80)
Destination port: 4252 (4252)
Sequence number: 1602605975
Acknowledgement number: 3290220050
Header length: 28 bytes
Flags: 0x0012 (SYN, ACK)
0... .... = Congestion Window Reduced (CWR): Not set
.0.. .... = ECN-Echo: Not set
..0. .... = Urgent: Not set
...1 .... = Acknowledgment: Set
UNIX /Linux – Jean Michel Meulien
Page 55
.... 0... = Push: Not set
.... .0.. = Reset: Not set
.... ..1. = Syn: Set
.... ...0 = Fin: Not set
...
Frame 12 (54 bytes on wire, 54 bytes captured)
...
Transmission Control Protocol
Source port: 4252 (4252)
Destination port: http (80)
Sequence number: 3290220050
Acknowledgement number: 1602605976
Header length: 20 bytes
Flags: 0x0010 (ACK)
0... .... = Congestion Window Reduced (CWR): Not set
.0.. .... = ECN-Echo: Not set
..0. .... = Urgent: Not set
...1 .... = Acknowledgment: Set
.... 0... = Push: Not set
.... .0.. = Reset: Not set
.... ..0. = Syn: Not set
.... ...0 = Fin: Not set
Window size: 16944
Checksum: 0xe79b (correct)
De ces premières observations, nous pouvons déduire quelques choses intéressantes. En
considérant des échanges TCP entre deux sockets toujours les mêmes :



lorsqu'un paquet TCP contient le flag SYN, c'est que c'est une nouvelle connexion qui
commence.
lorsqu'un paquet TCP contient les flags SYN et ACK, c'est que la connexion est acceptée,
elle est donc établie.
lorsqu'un paquet ne contient que le flag ACK, c'est que la connexion se continue. Mais
voyons un peu plus loin…
No. Time
Source
Destination Protocol Info
29 10.427697 192.168.0.10 212.27.35.1 TCP
4252 > http [ACK]
30 10.731147 192.168.0.10 212.27.35.1 TCP
span class="bhly">4253 > http span
class="bhly">[SYN]
31 10.752981 212.27.35.1 192.168.0.10 TCP http > 4253 [SYN, ACK]
32 10.753165 192.168.0.10 212.27.35.1 TCP
4253 > http [ACK]
33 10.753707 192.168.0.10 212.27.35.1 HTTP GET /images/titre.gif HTTP/1.1
34 10.780941 192.168.0.10 212.27.35.1 TCP 4252 > http [FIN, ACK]
Ce que nous observons ici, c'est l'établissement d'une nouvelle connexion TCP entre les
mêmes protagonistes. Bien entendu pour éviter les mélanges, le port du client n'est plus le
même. C'est cette fois-ci 4253.
UNIX /Linux – Jean Michel Meulien
Page 56
Autrement dit, le même client (192.168.0.10) ouvre une nouvelle connexion TCP sur le
même serveur (212.27.35.1), toujours sur le port 80, mais attend les réponses sur un nouveau
port, alors que la connexion précédente existe toujours.
Le client met fin à la précédente (trame 34) avec le flag [FIN] une fois seulement que la
seconde connexion est établie.
Dans ces conditions, il est pertinent de penser que cette nouvelle connexion est en relation
directe avec la première. Nous dirons que c'est une connexion en relation avec la première.
Premières déductions
Si l'on met en place un système capable de mémoriser ce qu'il se passe sur la couche TCP,
alors il va devenir possible de savoir si une connexion est dans l'un de ces états :

NEW
nouvelle connexion (elle contient le flag SYN)
 ESTABLISHED
connexion déjà établie, elle ne devrait pas contenir de SYN ni de FIN
 RELATED
la connexion présente une relation directe avec une connexion déjà établie
 INVALID
 la connexion n'est pas conforme, contient un jeu de flags anormal, n'est pas classable dans
l'une des trois catégories précédentes.
Ceci est intéressant, parce que l'on pourra interdire à priori à toute connexion NEW d'entrer
dans notre installation, il n'y a aucune raison qu'il en rentre si nous n'avons pas de serveur.
Eventuellement, nous pourrons par exemple créer des exceptions pour les ports ssh, si nous
souhaitons accéder à notre machine depuis le net.
En revanche, toute connexion ESTABLISHED ou RELATED devra pouvoir entrer depuis le
net.
Dans l'autre sens, du LAN vers le net, les paquets NEW doivent pouvoir passer, de même,
bien entendu que les ESTABLISHED et les RELATED.
Les paquets INVALID pourront éventuellement être tracés dans les logs.
UNIX /Linux – Jean Michel Meulien
Page 57
Décision de routage
INPUT
FORWARD
PROCESS
LOCAL
OUTPUT
Et pour l'UDP
Là, c'est plus délicat puisqu'il n'y a justement pas de connexion. Il sera donc impossible de
définir de façon précise l'état d'un échange UDP. Ce que l'on pourra faire, c'est mettre en
place un « timer » pour décider de l'état d'un paquet UDP. Nous pouvons prendre l'exemple
simple d'une requête DNS depuis notre réseau privé.
 le premier paquet UDP sort de notre réseau, sur un port connu et identifié (53) vers un
serveur DNS. Nous pouvons décider de le laisser passer et nous le qualifions de NEW. Il
déclenche un timer.
 si avant expiration du « timer », nous recevons un paquet UDP dudit serveur DNS, nous
considèrerons que c'est un paquet ESTABLISHED.
Dans la pratique
Un module principal de suivi de connexion est chargé dynamiquement en cas de besoin, il
s'agit du module ip_conntrack. Cependant tout n'est pas toujours si simple et ce module peut
montrer ses limites sur des protocoles particulièrement complexes, comme par exemple FTP.
ip_conntrack ne pourra assurer qu'une connexion FTP de type passive. Si l'on souhaite
assurer le suivi de connexion sur du FTP en mode actif, il faudra avoir recours au module
spécialisé ip_conntrack_ftp. Mais celui-ci ne se chargera pas dynamiquement, vous aurez à
le charger vous-même. Nous aurons aussi besoin dans ce cas de ip_nat_ftp; si notre
passerelle fait du NAT.
UNIX /Linux – Jean Michel Meulien
Page 58
Filter
La table de filtrage
C'est la table qui va permettre de filtrer tous les paquets qui entrent et sortent de notre
machine. Il n'y a ici aucune modification de ces paquets, ils seront comparés à des critères
définis dans la table Filter. Dans notre cas, il peut se passer deux choses différentes:


un paquet qui entre est destiné à un processus de l'hôte (serveur HTTP, FTP).
un paquet qui entre est destiné à un autre réseau, c'est alors une fonction de routage.
Un paquet entre dans notre machine. Peu importe par quelle interface il entre, il peut venir
aussi bien du réseau local que de l'Internet. Il passe d'abord par la fonction de décision de
routage. C'est elle qui va déterminer si le paquet est destiné à un processus local de l'hôte ou
à un hôte sur un autre réseau. Si le paquet est destiné à l'hôte local:
 il traverse la chaîne INPUT.
 s'il n'est pas rejeté, il est transmis au processus impliqué. Ce processus va donc le
traiter et éventuellement émettre un nouveau paquet en réponse ;
 ce nouveau paquet traverse la chaîne OUTPUT.
 s'il n'est pas rejeté, il va vers la sortie.
Si le paquet est destiné à un hôte d'un autre réseau:


il traverse la chaîne FORWARD.
s'il n'est pas rejeté, il poursuit alors sa route.
Une autre façon de représenter graphiquement tout ça serait la suivante :
Point d‟entrée
Point de sortie
NF_IP_FORWARD
NF_IP_PREROUTING
NF_IP_POSTROUTING
FORWARD



NF_IP_LOCAL_IN
NF_IP_LOCAL_OUT
INPUT
OUTPUT
PROCESSUS
LOCAUX
la chaîne INPUT sera raccrochée au hook
NF_IP_LOCAL_IN
la chaîne OUTPUT au hook NF_IP_LOCAL_OUT
la chaîne FORWARD à NF_IP_FORWARD.
Rappel d'avertissement important :
Pour ceux qui ont travaillé avec IPchains, notez que la démarche est ici différente et ça va
peut-être vous poser pas mal de problèmes.
Avec IPChains
Avec IPTables
Tous les paquets entrants passaient par les Seuls les paquets destinés à un process local
chaînes INPUT qu'ils soient destinés à un traversent la chaîne INPUT. Seuls les
UNIX /Linux – Jean Michel Meulien
Page 59
process local où au routage. Tous les paquets paquets issus d'un process local traversent la
sortants passaient par la chaîne OUTPUT, chaîne OUTPUT Seuls les paquets destinés
qu'ils soient issus d'un processus local ou au routage traversent la chaîne FORWARD
destinés au routage.
L'illustration ci-dessus le montre bien, et ceci va conduire à d'énormes erreurs, si l'on se
contente de traduire les anciennes règles IPChains en règles IPtables, sans précautions
particulières.
Faites la manipulation suivante. Sur votre passerelle Linux 2.6.x :
Initialisation de NetFilter
 taper successivement les commandes suivantes pour initialiser votre système:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
De cette manière, vous avez toutes vos chaînes vides, avec par défaut la règle ACCEPT
iptables -L
L'affichage va vous assurer que les trois chaînes INPUT, FORWARD et OUTPUT sont
vides et ont bien la règle par défaut ACCEPT
iptables -t nat -L
L'affichage va vous assurer que les trois chaînes PREROUTING, POSTROUTING et
OUTPUT sont vides et ont bien la règle par défaut ACCEPT.
Mise en place de Masquerade
Taper maintenant les commandes suivantes:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Où ppp0 représente l'interface connectée à l'Internet. Remplacez éventuellement, si votre
configuration est différente. Ceci signifie en gros: Tout ce qui sort du routage (-A
POSTROUTING) et qui doit passer vers l'Internet (-o ppp0) doit subir un masquage
d'adresse (-j MASQUERADE)
echo 1 > /proc/sys/net/ipv4/ip_forward
Ceci pour être certain que votre noyau autorise le routage. Vous n'en avez pas besoin, si votre
machine est configurée par défaut pour assurer le routage.
Voilà. Votre passerelle entre le réseau privé et Internet doit être opérationnelle.


vérifiez que, depuis votre passerelle Linux, vous avez bien accès au net.
vérifiez que, depuis un poste de votre réseau privé, vous avez bien accès au net.
Attention, dans cet état, vous n'avez rigoureusement aucune défense contre d'éventuelles
intrusions. Passez rapidement à la suite.
UNIX /Linux – Jean Michel Meulien
Page 60
Et maintenant, la manipulation décisive.
Pour bien montrer que les chaînes INPUT et OUTPUT n'interviennent pas dans le routage,
nous allons tout simplement leur mettre DROP comme règle par défaut. Attention, il faut que
vos clients utilisent un DNS situé ailleurs que sur votre passerelle Linux, sinon, ça ne
fonctionnera pas à cause du DNS.
Taper les commandes suivantes:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -L
(Pour vérifier qu’INPUT et OUTPUT « droppent » bien tout ce qui passe).

Vérifiez que, depuis votre passerelle Linux, vous n'avez plus accès au net (ni à votre
réseau privé d'ailleurs).
 Vérifiez que, depuis un poste de votre réseau privé, vous avez toujours l'accès au net.
INPUT et OUTPUT n'interviennent absolument pas dans le routage. Toutes les règles
que vous pourrez y mettre ne concerneront que la sécurité de la passerelle elle-même, mais
pas de votre réseau privé.
La table de translation d'adresses
Remarques importantes
La traduction d'adresse (NAT comme Network Address Translation) est à prendre ici au
sens le plus large, puisque cette table permet non seulement de faire de la translation stricte
d'adresses, mais également de la translation de ports et un mélange des deux, dont le
masquage d'adresse est une forme particulière.
Mais qu'est-ce que c'est exactement ?
Dans un datagramme, en plus des données, on trouve également quelques informations
concernant le protocole utilisé et des identificateurs de l'émetteur et du destinataire. Ce sont
ces identificateurs qui nous intéressent:


l'adresse IP du destinataire.
le port du service utilisé sur le destinataire.
Ces informations constituent un « socket », elles sont indispensables pour arriver à joindre le
bon service sur le bon serveur, par exemple le service HTTP du serveur grenouille.com.
 l'adresse IP de l'émetteur.
 le port de réponse.
Ces informations constituent un autre « socket », elles sont indispensables pour que l'émetteur
d'un paquet puisse espérer recevoir une réponse.
Avec les fonctions NAT de Netfilter, lorsqu'un paquet transite par notre passerelle, nous
allons pouvoir bricoler ces sockets absolument comme on le désire. Par exemple, nous
pourrons changer l'adresse de l'émetteur ou le port de l'émetteur ou les deux. Nous pouvons
aussi changer l'adresse du destinataire, ou le port du destinataire, ou les deux.
Cela sert à quoi.
Ca sert à une quasi infinité de choses. Parmi les plus intéressantes, citons:
UNIX /Linux – Jean Michel Meulien
Page 61
Le masquage d'adresse
C'est une fonction fondamentale lorsque l'on souhaite connecter un réseau privé à l'Internet
lorsque l'on ne dispose que d'une seule IP valide sur le net, même si celle-ci est dynamique,
ce qui est le cas qui nous intéresse le plus. Les clients sont sur le réseau privé et les serveurs
sont sur le net. C'est une forme particulière de SNAT (Source NAT).
C'est ce que sont capables de faire tous les routeurs SOHO (Small Office, Home Office) qui
permettent de relier un petit réseau local à l'Internet, lorsque l'on ne dispose que d'un accès
RTC, NUMERIS, Câble, ADSL. Un simple (très) vieux PC (un 486 suffit) équipé d'un
Linux 2.6.x permet de le faire aussi bien sinon mieux.
Le NAT de destination
Ici, c'est pour résoudre les problèmes qui apparaissent dans l'autre sens. Les clients sont sur le
net et les serveurs sont sur le réseau privé.
Réseau Privé
Serveur HTTP
192.168.0.1
Serveur FTP
192.168.0.2
Serveur SMTP/POP3
192.168.0.3
192.168.0.250
Vers Internet
Routeur NAT
62.161.96.47
Imaginons que nous n'ayons qu'une seule IP valide sur le net et que nous voulions tout de
même offrir des services tels que HTTP, FTP, SMTP, POP et peut-être d'autres encore. La
réponse triviale consiste à dire: J'ai droit à une seule IP, donc je place tous ces serveurs sur la
même machine, celle qui a la seule IP à laquelle j'ai droit.
Oui, mais la démarche est simpliste:
 comment assurer un minimum de sécurité sur une machine ouverte de tous les côtés ?
 comment faire pour assurer une disponibilité suffisante à chaque service dans les montées
en charge ?
Cette solution ne parait finalement pas très acceptable, mais comment faire autrement ? Tout
simplement avec NAT. La machine frontale sera un simple routeur NAT. Côté Internet, elle
possède la seule IP valide disponible, elle va faire croire que tous les services sont dessus,
mais en réalité, lorsqu'elle va recevoir un paquet dont le socket de destination est
62.161.96.47:80, elle va remplacer ça vite fait par 192.168.0.1:80 et router le paquet vers le
UNIX /Linux – Jean Michel Meulien
Page 62
serveur HTTP. Lorsque la réponse du serveur va lui parvenir, elle remplacera le socket de
l'émetteur (192.168.0.1:80) par 62.161.96.47:80 et enverra ça sur le net. Tout le monde n'y
verra que du feu. Bien entendu, le routeur NAT est capable de faire ça pour chacun des
autres serveurs:
 ce qui lui arrivera sur les ports 20 et 21 sera redirigé sur le serveur FTP (en réalité, le cas
du FTP est bien plus difficile à résoudre que ça.
 ce qui lui arrivera sur le port 25 sera redirigé sur le serveur SMTP/POP3 service SMTP
 ce qui lui arrivera sur le port 110 sera redirigé sur le serveur SMTP/POP3 service POP3
Le cas du proxy transparent
PREROUTING
Décision de routage
Process
Local
OUTPUT
POSTROUTING
Bien qu'à priori, cette possibilité soit sans intérêt sur un réseau domestique, je préfère en
parler parce que ce sujet peut revêtir une certaine gravité quant aux atteintes aux libertés
individuelles.
Tout le monde sait ce qu'est un proxy (serveur mandataire, en français). C'est un serveur
auquel on s'adresse pour qu'il nous fournisse des informations situées sur un autre serveur, sur
les protocoles HTTP et FTP essentiellement.. Le principal avantage d'un proxy est qu'il
garde en mémoire dans un cache toutes les informations qu'il est déjà allé chercher. Si, sur un
réseau privé, dix personnes cherchent la même information, elle ne sera téléchargée qu'une
fois sur le Net. L'avantage évident est l'optimisation de la bande passante sur le lien Internet,
lorsque le réseau privé est un peu conséquent. L'autre avantage, c'est que l'on peut réaliser un
« firewall applicatif » pour le protocole HTTP. Dans ce cas, on n'utilisera plus seulement un
filtrage de paquets, mais également un filtrage sur le protocole lui-même, ce qui permet, par
exemple, de faire du contrôle parental ou du contrôle de trafic web tout court. Face à cet
avantage, il y a pas mal d'inconvénients, dus à tous les effets pervers des fonctionnalités que
l'on peut ajouter à un proxy. Parmi les inconvénients les plus graves:
 la durée de vie du cache peut être mal paramétrée, la vérification de validité du contenu
également et le proxy peut fournir des informations qui ne sont plus à jour.
UNIX /Linux – Jean Michel Meulien
Page 63

les proxys ont souvent des fonctions de restriction d'accès qui peuvent aboutir à un régime
franchement totalitaire. (contrôle parental chez AOL, par exemple, mais ce n'est pas
forcément vous qui choisissez les filtrages).
 les fonctions de traçage ne manquent pas non plus, ce qui permet d'espionner de façon très
efficace ce que les utilisateurs de votre réseau font sur le net.
Normalement, le navigateur Internet doit être paramétré pour utiliser un serveur proxy
(outils/Options Internet/Connexions/Paramètres LAN dans Internet Explorer). Si
l'installation est faite proprement, l'utilisateur devrait pouvoir choisir d'utiliser le proxy ou
non. Souvent cependant, l'administrateur du réseau va bloquer le passage direct sur le port 80,
obligeant les utilisateurs à passer par le proxy. Là encore, au moins, les utilisateurs sont
avertis. Le proxy transparent est beaucoup plus pernicieux, parce qu'il ne nécessite aucun
paramétrage du navigateur et l'utilisateur ne sait pas qu'il passe par un proxy.
Le principe est simple, il suffit de rediriger tous les paquets dont le port de destination est 80
vers le proxy transparent, qui peut être placé sur la passerelle elle même. Ceux qui disposent
d'une passerelle Linux peuvent assez facilement monter la manip en installant le proxy
SQUID (configuré convenablement pour faire un proxy transparent) et en utilisant iptables
pour faire de la redirection sur le service squid local. Ce ne sont pas les seules manipulations
possibles, mais ce sont celles qui paraissent les plus souvent utilisées.
Comment çela marche
La table NAT est organisée comme ci-contre:
 Comme son nom l'indique, la chaîne PREROUTING va bricoler les sockets avant les
décisions de routage. Nous nous en servirons pour faire du DNAT (Destination NAT),
autrement dit, pour modifier la « socket » du destinataire.
 la chaîne POSTROUTING intervient à la sortie du routeur. Elle servira à faire du SNAT
(Source NAT) dont par exemple, le masquage d'adresse.
 la chaîne OUTPUT, quant-à elle, permet de modifier le socket de destination d'un paquet
issu d'un processus local. L'utilité de cette chaîne n'est pas évidente, dans la mesure où,
normalement, les paquets sortant d'un processus local devraient aussi passer par
POSTROUTING. La seule possibilité supplémentaire est de pouvoir rediriger les paquets
qui sortent d'un processus local à destination d'une cible extérieure, vers un autre
processus local (127.0.0.1).
Là encore, nous pouvons l'illustrer de façon différente :
Point d‟entrée
NF_IP_PREROUTING
Point de sortie
NF_IP_FORWARD
NF_IP_POSTROUTING
PREROUTING
POSTROUTING
NF_IP_LOCAL_IN
NF_IP_LOCAL_OUT
OUTPUT
PROCESSUS LOCAUX
UNIX /Linux – Jean Michel Meulien
Page 64
Les possibilités offertes par le NAT sont quasiment infinies. Nous avons vu les plus
fréquentes :

masquage d'adresse, pour permettre à tout un réseau privé d'accéder au net lorsque l'on
ne dispose que d'une seule adresse IP valide sur le net.
 redirection d'un service serveur adressé sur la passerelle vers un serveur situé dans le
réseau privé, ça peut être utile pour les joueurs en réseau, mais aussi pour des applications
plus professionnelles.
Pour que tout cela fonctionne correctement, le système s'appuie sur le suivi de connexion.
Nous pouvons donc nous attendre à trouver des modules spécialisés pour certains protocoles,
dont le FTP, toujours lui. Ainsi, le module ip_nat_ftp sera nécessaire si vous voulez
travailler proprement en FTP.
NetFilter permet encore d'autres choses, qui sortent plus ou moins du cadre de cet exposé.
Mangle
Nous n'avons pas parlé de la table Mangle. Cette table permet d'effectuer un marquage des
paquets.
Point d‟entrée
Point de sortie
NF_IP_FORWARD
NF_IP_PREROUTING
FORWARD
PREROUTING
NF_IP_LOCAL_IN
NF_IP_POSTROUTING
POSTROUTING
NF_IP_LOCAL_OUT
INPUT
OUTPUT
Nous pouvions, avec les premières versions de Netfilter, marquer les paquets en
PREROUTING ou en OUTPUT pour les sorties d'un processus local (en rouge sur
l'illustration). Notez que depuis la version
2.4.18 du noyau,
le système a été étendu à tous les
PROCESSUS
LOCAUX
hooks.
L'intérêt de ce marquage, qui n'est visible que dans la pile de la machine, est de pouvoir être
relu par d'autres fonctions comme iproute ou la gestion de la qualité de service (QoS).
Ainsi, nous pouvons disposer de toute la puissance de Netfilter pour la sélection de divers
types de paquets, et utiliser ensuite ce marquage pour le routage ou les priorités de passage.
Donner ici des exemples précis nous mènerait trop loin parce qu'il faudrait étudier en détail
IProute2 et les fonctions de QoS des noyaux 2.6.
Voici tout de même un cas de figure qui serait gérable par ce système :
Nous disposons de deux liens sur le net :



l'un, très rapide et très fiable, mais très cher et facturé au volume de données ;
l'autre, classique, comme une connexion ADSL, avec les limites que nous leurs
connaissons.
Nous souhaitons exploiter au mieux ces deux connexions, par exemple de la façon
suivante :
UNIX /Linux – Jean Michel Meulien
Page 65

nous devons mettre à jour le contenu d'un serveur distant. Il faut le faire de façon
rapide et sûre. Il n'y a pas forcément beaucoup de données à transmettre, mais il est
impératif que ce soit fait le plus rapidement et le plus sûrement possible.
 Nous devons assurer un accès au net pour les utilisateurs du réseau local, mais avec
une qualité de service plus faible.
Avec le marquage de paquets associé à IProute, nous pourrons arriver à faire passer les mises
à jour du serveur sur le lien rapide mais cher et tout le reste sur le lien ADSL.

Nous disposons d'une connexion ADSL et il arrive très souvent que certains utilisateurs
fassent du téléchargement FTP sur des serveurs rapides. Chaque fois qu'un
téléchargement est lancé, toute la bande passante download est utilisée et les autres
utilisateurs ne peuvent plus surfer dans de bonnes conditions.
 En exploitant le marquage de paquets associé aux fonctions de QoS, nous pourrons
restreindre la bande passante exploitée par le download FTP afin de laisser un peu
d'espace pour les autres activités.
 Ceci peut aussi être appliqué aux transferts peer-to-peer, qui ont l'inconvénient de
monopoliser le peu de bande passante upload dont on dispose sur des connexions
asymétriques comme ADSL ou câble.
Les logs
Netfilter propose un système de log puissant. Il ne s'agit pas ici d'une table, mais d'une cible.
Nous verrons plus en détail dans la suite ce que sont les cibles, disons pour le moment qu'il en
existe deux qui sont particulières.
La cible LOG
Elle permet de remonter vers le démon syslog, avec par défaut, le niveau warning, des
messages décrivant les paquets qui satisfont à la règle qui pointe vers LOG. Dans une
distribution Debian, nous retrouverons donc leur trace dans /var/log/syslog.
Juste un exemple trivial, pour voir ce que cela donne :
iptables -A INPUT -i eth0 -p icmp -j LOG
Ce qui veut dire en français :
Ajouter à la chaîne INPUT la règle suivante : envoyer vers la cible LOG tout paquet
ICMP qui entre par eth0
La machine dont l'IP d’eth0 est 192.168.0.253 envoie un ping sur la machine 192.168.0.251.
ping -n 1 192.168.0.251
Nous allons tracer la réponse au ping (INPUT). Nous récupérons cette trace dans
/var/log/syslog :
Dec 1 22:40:11 linux kernel:
IN=eth0
OUT= MAC=00:00:b4:bb:5d:ee:00:20:18:29:11:31:08:00
SRC=192.168.0.251
DST=192.168.0.253
LEN=84 TOS=0x00
PREC=0x00
UNIX /Linux – Jean Michel Meulien
Page 66
TTL=255 ID=4938
PROTO=ICMP TYPE=0
CODE=0
ID=53771
SEQ=256
Ce qui est surligné en jaune correspond à la machine qui trace, c'est à dire celle qui envoie le
ping et attend la réponse (qui est tracée). Ce qui est surligné en vert correspond à la cible du
ping qui répond.
C'est un bon moyen pour se faire de la lecture facile. Si la commande ping est écrite de la
façon suivante :
ping -n 100 192.168.0.251
Nous génèrerons 100 fois une trace similaire à celle que nous venons de voir. Pour éviter que
les logs n'arrivent à remplir votre disque dur, il existe la directive limit qui permet, comme
son nom l'indique, de limiter l'envoi vers la cible de paquets satisfaisant à la règle. Cette
directive à elle seule mériterait toute une page d'explications.
La cible ULOG
Plutôt que d'utiliser syslog, cette cible permet d'envoyer les paquets à un démon spécialisé
: ulogd. Ce démon permet d'obtenir des logs plus présentables, voire stockés dans une base
de données comme MySQL.
Iptables
Encore une fois, il n'est pas question de reprendre toute la documentation d'IPtables. Nous
allons simplement examiner quelques règles simples d'un usage courant. Pour étudier la
syntaxe, consulter:


les pages man (man iptables)
Rusty's Remarkably Unreliable Guides
Les pages de man, bien que pas toujours très agréables à lire, sont essentielles, pour la simple
raison que Netfilter/IPtables sont des outils en pleine évolution et que d'une version à l'autre,
de nouvelles fonctionnalités peuvent apparaître.
Manipulations diverses
Pour ce qui suit, nous allons faire de la pratique (Debian Etch montée en passerelle). Il
s'agit de masquer tous les clients d'un réseau privé (par exemple 192.168.0.0) derrière
l'unique adresse officielle attribuée par le fournisseur d'accès, et d'assurer un minimum de
sécurité sur la totalité de l'installation.
UNIX /Linux – Jean Michel Meulien
Page 67
Poste 1
192.168.0.1
eth0
Poste 2
192.168.0.2
Passerelle ppp0
192.168.0.253
Poste 3
192.168.0.3
Modem
Câble ou ADSL
Initialisation des tables
Pour commencer, nous allons tout fermer au niveau de la passerelle dans la table filter. Nous
vidons les chaînes :
iptables -F
Nous supprimons d'éventuelles chaînes personnelles :
iptables -X
Nous les faisons pointer par défaut sur DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Nous faisons de même avec toutes les autres tables, à savoir nat et mangle, mais en les
faisant pointer par défaut sur ACCEPT. Ca ne pose pas de problèmes puisque tout est bloqué
au niveau filter :
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
Notez que dans tout cela, on n'a pas changé grand chose par rapport à l'état de ces tables tel
qu'on le trouve après un boot de la machine, sans modifications particulières des scripts de
UNIX /Linux – Jean Michel Meulien
Page 68
démarrage, hormis la cible par défaut des règles de la table filter que l'on a passé à DROP.
Tout de même, cette manipulation préliminaire a eu pour conséquences :
 que l'on est parfaitement sûr de l'état de Netfilter.
 que l'on a commencé à se familiariser un peu avec le langage IPTables.
Où en sommes-nous ?
Normalement, plus rien ne doit passer nulle part. Essayez des pings dans tous les sens, entre
la passerelle et votre réseau privé ou vers le net, entre un poste de votre réseau privé et la
passerelle, rien ne devrait passer.
Ouvrons quelques portes
Nous considérons que la machine elle même est sûre et que les processus locaux peuvent
communiquer entre eux via l'interface locale :
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
Nous considérons que notre réseau local est également sûr (ce qui n'est pas forcément vrai,
d'ailleurs).
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
A ce stade, nous avons la situation suivante :



si, sur votre passerelle, vous faites ping 127.0.0.1, cela répond.
si, sur votre passerelle, vous faites un ping sur un hôte du réseau privé, cela répond.
si, sur un hôte du réseau privé, vous faites un ping sur la passerelle, cela répond aussi.
Mais :



si, depuis la passerelle, on fait des pings n'importe où sur le net, cela ne répondra pas, à
cause du DROP sur OUTPUT par défaut.
si, depuis n'importe où sur le net, on fait des pings sur votre passerelle, ça ne répondra pas
non plus, à cause du DROP sur INPUT par défaut.
si, depuis un hôte de votre réseau, on fait un ping n'importe où sur le net, ça ne répondra
encore pas, pour deux raisons :
 nous n'avons pas placé de règle de NAT entre le réseau local et le net.
 FORWARD fait DROP sur tout ce qui passe.
UNIX /Linux – Jean Michel Meulien
Page 69
Faisons maintenant du NAT :
Translation d'adresses pour tout ce qui traverse la passerelle en sortant par ppp0
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Nous pourrions ici restreindre le NAT à une plage d'IPs du réseau local :
iptables -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o ppp0 -j
MASQUERADE
Ou même à une liste d'IP bien définies :
iptables -t nat -A POSTROUTING -s 192.168.0.10 -o ppp0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.11 -o ppp0 -j MASQUERADE
Ceci peut être utile, surtout en sachant que vous pouvez détruire une règle et une seule :
iptables -t nat -D POSTROUTING -s 192.168.0.11 -o ppp0 -j MASQUERADE
Ainsi, si vous avez, par exemple, des enfants qui usent de votre connexion permanente de
façon un peu trop permanente, vous pourrez aisément, avec l'aide du démon cron n'accorder
l'accès au net que pour certaines plages horaires.
Mais ça ne suffit pas encore pour fonctionner, les ping depuis le réseau local vers le net ne
passent toujours pas. Normal, FORWARD fait toujours DROP sur tout ce qui passe. Nous
devons accorder des autorisations de passage sur FORWARD.
Utilisation de conntrack
Le suivi de connexion est intéressant, bien qu'il consomme un peu plus de ressources sur
votre passerelle. Nous l'avons vu, son avantage est qu'il permet d'obtenir des informations sur
toute connexion en cours. Ces informations sont principalement :
 NEW
Une nouvelle connexion est établie ;
 ESTABLISHED
La connexion analysée a déjà été établie ;
 RELATED
La connexion est en relation avec une autre connexion déjà établie (par exemple, dans
le FTP actif) ;
 INVALID
Le paquet n'appartient à aucune des trois catégories précédentes. Il est possible, par exemple,
de n'accepter dans les deux sens (vers et depuis l'Internet) que les connections déjà établies
ou en relation avec des connexions déjà établies et de n'accepter des nouvelles connexions que
depuis notre installation vers l'Internet. De cette manière, notre réseau local pourra se
connecter sur tout serveur Internet, mais aucune nouvelle connexion ne pourra être créée
depuis le net vers notre installation.
En français, nous allons faire :

Toutes les connexions : nouvelles, établies et associées à une connexion établie qui
entrent par eth0 (réseau local) et veulent sortir par ppp0 (le net), peuvent passer,
UNIX /Linux – Jean Michel Meulien
Page 70

Toutes les connexions : établies et associées à une connexion établie qui entrent par ppp0
et veulent aller vers eth0 pourront également passer.
En langage iptables : toutes les connexions qui sortent du LAN vers le net sont acceptées.
iptables
-A
FORWARD
-i
eth0
NEW,ESTABLISHED,RELATED -j ACCEPT
-o
ppp0
-m
state
--state
Nous aurions aussi bien pu écrire :
iptables -A FORWARD -i eth0 -o ppp0 -m state --state ! INVALID -j ACCEPT
Seules les connexions déjà établies ou en relation avec des connexions établies sont acceptées
venant du net vers le LAN
iptables -A FORWARD -i ppp0 -o eth0 -m state --state ESTABLISHED,RELATED -j
ACCEPT
ping ul.grenouille.com (par exemple) se met à fonctionner.
Le chapeau magique
Maintenant que nous avons mis conntrack en œuvre, nous aimerions bien voir un peu
comment il opère… Il se trouve qu'il est possible d'observer la table de suivi de connexions
qui se présente sous la forme d'un fichier virtuel en /proc/net/ip_conntrack.
Pour interpréter plus facilement ce qu'il suit, il faut savoir plusieurs choses :




un client du LAN dispose de l'IP 192.168.0.10
la passerelle dispose de l'IP 192.168.0.253 sur le LAN
la passerelle dispose de l'IP 80.8.130.97 sur le net
le client navigue sur le serveur HTTP d'IP 213.186.35.33
tcp 6 14 CLOSE_WAIT
src=192.168.0.10 dst=213.186.35.33 sport=1102 dport=80
src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1102 [ASSURED] use=1
tcp 6 431991 ESTABLISHED
src=192.168.0.10 dst=213.186.35.33 sport=1103 dport=80
src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1103 [ASSURED] use=1
tcp 6 73 TIME_WAIT
src=192.168.0.10 dst=213.186.35.33 sport=1104 dport=80
src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1104 [ASSURED] use=1
tcp 6 82 SYN_SENT
src=192.168.0.10 dst=213.186.35.33 sport=1105 dport=80 [UNREPLIED]
src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1105 use=1
UNIX /Linux – Jean Michel Meulien
Page 71
tcp 6 51 CLOSE_WAIT
src=192.168.0.10 dst=213.186.35.33 sport=1106 dport=80
src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1106 [ASSURED] use=1
Le troisième champ est un « timer », l'entrée est effacée de la table lorsque le timer tombe à
zéro. Bien entendu, cette table est en mémoire, ce n'est pas un vrai fichier, son contenu évolue
donc perpétuellement au cours du temps.


vous ne pourrez pas visualiser efficacement son contenu avec l'outil tail
cette table prend de la place en mémoire, d'autant plus que le nombre de clients sur le
LAN est important et leur activité grande. Sur un petit réseau domestique, ce sera
rarement un problème, mais sur un réseau d'entreprise, il faudra rester attentif à la
mémoire disponible.
Où en sommes-nous ?
 Depuis le réseau local, nous accédons à la passerelle
 depuis le réseau local, nous accédons au net
 depuis la passerelle, nous accédons au réseau local
 depuis la passerelle, nous n'accédons pas au net
 depuis le net, nous n'accédons pas à la passerelle (nous avons toujours un DROP en
INPUT sur ppp0)
 depuis le net, nous ne pouvons accéder aux hôtes du réseau local que sur des connexions
qu'ils ont établies et dont ils sont clients. Autrement dit, aucun serveur, éventuellement
placé sur le réseau local ne sera accessible depuis le net.
Amélioration possibles
Un DNS local
Si vous installez sur votre passerelle un serveur DNS, il faudra qu'il puisse envoyer ses
requêtes sur le net, ce qui n'est actuellement pas possible. Il faut ouvrir une voie en UDP
conforme aux besoins d'une requête DNS :
 votre serveur envoie une requête UDP à destination du port 53 d'un serveur DNS
 il attend une réponse sur un port supérieur ou égal à 1025, venant d'un port 53.
En langage IPtables :
Autorisation des requêtes DNS locales
iptables -A OUTPUT -o ppp0 -p udp --sport 1024: --dport 53 -m state --state ! INVALID
-j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport 53 --dport 1024: -m state --state
RELATED,ESTABLISHED -j ACCEPT
Voilà des syntaxes qui commencent à être intéressantes
Lorsque l'on veut définir, non pas un port mais une plage de ports, les écritures suivantes
sont autorisées :

–dport 1024:1999 autorisera la plage de ports [1024,1999] en destination (cela marche
aussi avec –sport) ;
UNIX /Linux – Jean Michel Meulien
Page 72
–dport 1024: veut dire que tous les ports supérieurs où égaux à 1024 seront acceptés en
destination.
Un SMTP local
Vous pouvez désirer implanter un SMTP sur votre passerelle, pour envoyer votre courrier
depuis le LAN sans vous préoccuper des disponibilités ou des lenteurs du SMTP de votre
FAI. Deux options sont possibles :
 votre SMTP enverra vos courriers directement aux destinataires,
 votre SMTP enverra tous vos courriers au SMTP de votre FAI qui effectuera lui-même
les livraisons.
La première option est la plus rapide. Malheureusement, à cause de nombreux débordements,
la tendance actuelle consiste à refuser les messages provenant de serveurs SMTP non
officiels, ce fut un temps par exemple le cas entre Wanadoo et AOL. AOL refusait tout
message en provenance d‟orange.fr autre que ceux qui lui arrivent des SMTP officiels
d’Orange. Comme il est clair que cette tendance n'ira qu'en s'accentuant, il demeure plus sage
d'utiliser la seconde méthode. Vous serez tributaire du bon fonctionnement du SMTP de votre
FAI, mais ça ne se verra pas au niveau de vos clients du LAN. Ce sera votre SMTP local qui
assurera les éventuelles attentes.
Sachant qu'un serveur SMTP écoute sur le port 25 et utilise tcp :
Autorisation des envois SMTP locaux

iptables -A OUTPUT -o ppp0 -p tcp --sport 1024: --dport 25 -m state --state ! INVALID
-j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 25 --dport 1024: -m state --state
RELATED,ESTABLISHED -j ACCEPT
Et vous pouvez même restreindre encore d'avantage, si vous avez adopté la seconde stratégie
d'envoi :
Autorisation des envois SMTP locaux vers le SMTP du FAI
iptables -A OUTPUT -o ppp0 -p tcp --sport 1024: -d smtp.wanadoo.fr --dport 25 -m
state --state ! INVALID -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp -s smtp.wanadoo.fr --sport 25 --dport 1024: -m state -state RELATED,ESTABLISHED -j ACCEPT
Si, si, ça fonctionne, à condition bien entendu que votre passerelle soit en mesure de résoudre
les noms au moment où vous écrivez la règle. Attention donc, si vous faites tout ça lors de
l'initialisation de la machine, il faudra que :



les services réseaux soient montés
la connexion PPPoE établie
le service DNS démarré
Vous pouvez, plus simplement, indiquer non pas le nom du serveur mais son IP.
Un accès SSH depuis le Net
Vous pouvez souhaiter pouvoir accéder à votre passerelle depuis le net, pour peu que vous
ayez un moyen de connaître à tout moment son adresse IP. Sachant que ssh utilise tcp sur le
port 22 :
iptables -A INPUT -p tcp --dport ssh -i ppp0 -j ACCEPT
UNIX /Linux – Jean Michel Meulien
Page 73
iptables -A OUTPUT -p tcp --sport ssh -o ppp0 -j ACCEPT
Nous pouvons effectivement définir un port par le service qui lui est normalement associé
(ici ssh).Si vous devez accéder à votre passerelle depuis une IP fixe sur le net, vous pouvez
largement restreindre cette règle en n'acceptant les connexions ssh que depuis et vers cette IP.
ICMP, c'est parfois utile
Le protocole ICMP, même s'il présente quelques dangers, rend tout de même quelques
services appréciables, dans le cas d'erreurs de transmission et aussi dans la découverte du
MTU. Il se trouve que, pour les messages d'erreur ICMP, l'en-tête du paquet qui a généré
l'erreur est reproduite dans le message. Le suivi de connexion ICMP s'en sert pour déclarer
ce paquet RELATED.
En ce qui concerne les clients du LAN, avec les règles que nous avons écrites, il ne devrait
pas y avoir de problèmes, puis qu'on laisse passer tout paquet RELATED sans distinction de
protocole. En revanche, pour la passerelle elle-même, si l'on a activé SMTP et DNS, il peut
s'avérer intéressant d'ajouter la ligne :
iptables -A INPUT -p icmp -m state --state RELATED -j ACCEPT
De cette manière, une erreur ICMP passera, mais votre passerelle ne répondra pas aux pings,
ni à aucune autre interrogation ICMP.
Encore une dernière recette
Vous pouvez faire quelque chose de très simple, mais qui reste tout de même moins sûr. Nous
sommes dans la table Filter (table par défaut).
Vidage des chaînes
iptables -F
Destruction des éventuelles chaînes personnelles :
iptables -X
Changement de stratégie par défaut: Nous n'acceptons plus rien


ni en entrée
ni en traversée de la passerelle
Mais nous acceptons tout ce qui sort (localement) de la passerelle :
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
Initialisation des tables NAT et MANGLE :
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
UNIX /Linux – Jean Michel Meulien
Page 74
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
Mise en place du NAT :
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE
Maintenant, nous allons créer une chaîne
appeler SuiviConnexions et qui va gérer ce suivi :
particulière,
que
nous
allons
iptables -N SuiviConnexions
Filtrage de suivi dans cette chaîne : Seules les nouvelles connexions qui ne viennent pas du
Net sont acceptées :
iptables -A SuiviConnexions -m state --state NEW -i ! ppp0 -j ACCEPT
Ceci veut dire plus clairement que toutes les connexions qui n'entrent pas par ppp0 c'est à dire
dans notre cas, qui entrent par eth0, mais aussi par l'interface locale (lo).
Toutes les connexions établies et relatives sont acceptées :
iptables -A SuiviConnexions -m state --state ESTABLISHED,RELATED -j ACCEPT
Cette chaîne va maintenant servir de cible commune pour les deux chaînes standard INPUT
et FORWARD, les deux chaînes INPUT et FORWARD vont pointer sur SuiviConnexions :
iptables -A INPUT -j SuiviConnexions
iptables -A FORWARD -j SuiviConnexions
Et le tour est joué, puisque OUTPUT accepte tout. Il faut faire beaucoup confiance au bon
fonctionnement de conntrack et ne pas trop se poser de questions sur les coups tordus qui
peuvent arriver à passer quand même là dedans, mais au premier coup d'œil, votre machine
paraîtra invisible sur le net.
Enfin, pour ssh :
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
Le FTP actif
Très souvent, les clients du LAN derrière un routeur NAT ne peuvent accéder à des
serveurs FTP sur le net qu'en mode passif. Sans précautions particulières, ce sera également
le cas ici. Cependant, Netfilter permet de s'affranchir de cette limitation, en exploitant les
modules spécialisés,ip_nat_ftp et ip_conntrack_ftp. Ceci nous amène à dire quelques mots
du chargement de ces modules. Netfilter est capable de charger dynamiquement la plupart
des modules qui lui sont nécessaires, en fonction des règles écrites. Faites un lsmod et voyez
les modules impliqués dans Netfilter (ils sont tous dans /lib/modules/<version du kernel
utilisé>/kernel/net/ipv4/netfilter).
UNIX /Linux – Jean Michel Meulien
Page 75
Cependant, les modules nécessaires au FTP actif ne se chargent pas automatiquement. Vous
pourrez les monter avec modprobe pour faire les tests. Si vous voulez les rendre
automatiquement disponibles à chaque démarrage, référencez-les par exemple dans le fichier
/etc/modules.
Pour conserver tout ce beau travail
C'est le moment d'utiliser un outil fourni avec iptables : le script iptables-save. Ce script
envoie sur le flux de sortie par défaut, normalement l'écran, le contenu des chaînes de toutes
les tables, dans un format relativement lisible pour l'être humain :
# iptables-save
# Generated by iptables-save v1.2.6a on Mon Dec 2 18:22:31 2002
*mangle
:PREROUTING ACCEPT [4110:906437]
:INPUT ACCEPT [113562:22595477]
:FORWARD ACCEPT [2160:709057]
:OUTPUT ACCEPT [2308:208513]
:POSTROUTING ACCEPT [68746:14733820]
COMMIT
# Completed on Mon Dec 2 18:22:31 2002
# Generated by iptables-save v1.2.6a on Mon Dec 2 18:22:31 2002
*filter
:INPUT DROP [392:38736]
:FORWARD DROP [20:944]
:OUTPUT DROP [616:25100]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A FORWARD -i eth0 -o ppp0 -m state --state NEW,RELATED,ESTABLISHED -j
ACCEPT
-A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o eth0 -j ACCEPT
COMMIT
# Completed on Mon Dec 2 18:22:31 2002
# Generated by iptables-save v1.2.6a on Mon Dec 2 18:22:31 2002
*nat
:PREROUTING ACCEPT [781:63004]
:POSTROUTING ACCEPT [331:18116]
:OUTPUT ACCEPT [1028:49802]
UNIX /Linux – Jean Michel Meulien
Page 76
-A POSTROUTING -o ppp0 -j MASQUERADE
COMMIT
# Completed on Mon Dec 2 18:22:31 2002
Nous retrouvons bien là dedans tout ce que nous avons défini plus haut. Mais cette commande
a un autre avantage. En dirigeant sa sortie vers un fichier, vous obtenez un fichier de
configuration qui sera exploitable par un autre script: iptables-restore
En d'autres termes, si vous faites :
iptables-save > /root/maconfig.iptables
Vous pourrez refaire ensuite :
iptable-restore < /root/maconfig.iptables
Pour restaurer intégralement votre configuration.
Sur Debian, il est possible d'invoquer des commandes lors de l'activation et de la
désactivation d'une interface réseau, dans le fichier /etc/network/interfaces.
Conclusion
Beaucoup de choses n'ont pas été dites, NetFilter nécessiterait un livre entier. Parmi ce dont
nous n'avons pas parlé et qui peut s'avérer utile, même pour un réseau domestique :



comment placer, par exemple, un serveur HTTP sur le LAN et s'arranger pour qu'il soit
visible depuis le net. C'est possible en utilisant du NAT de destination (PREROUTING).
nous n'avons que survolé l'utilisation de la cible LOG, pour tracer des paquets
indésirables, ou simplement pour déverminer des règles qui ne fonctionnent pas comme
on le souhaiterait. La cible LOG est un peu spéciale, dans la mesure où elle n'affecte pas
la destination du paquet tracé. Ainsi, vous devrez écrire des règles pour les logs en plus de
votre filtrage et de votre NAT.
l'utilisation de la table mangle conjointement avec le QoS pour exploiter au mieux votre
bande passante.
UNIX /Linux – Jean Michel Meulien
Page 77
Récapitulatif des règles
-A
Ajouter une nouvelle règle dans une chaîne
-D
Supprimer une règle d‟une certaine chaîne
-P
Modifier la politique par défaut
-I
Insérer une règle
-F
Effacer les règles d‟une certaine chaîne
-N
Créer une nouvelle chaîne
-X
Supprimer une chaîne créée par l‟utilisateur
-L
Afficher la liste des règles
Le firewall UFW (Uncomplicated FireWall)
/etc/ufw
Démarrage du firewall
Ufw enable
Syntaxe générale
ufw allow|deny [proto <protocole>] [from <adresse>[port <port>]] [to <adresse> [port
<port>]]
Exemples :
1) ufw allow proto tcp from 192.168.3.1 to 192.168.3.134 port 80
Ce qui se traduit par : accepter pour le protocole TCP les demandes faites par la machine
d’IP 192.168.3.1 pour 192.168.3.134 (IP du serveur Web) sur le port 80.
2) ufw allow ssh
Dans ce cas, la permission est donnée pour une connexion SSH à partir de n’importe quel
poste externe. On aurait pu remplacer la commande par :
ufw allow to any port 22 from any
ou ufw allow proto tcp to any port 22 from any ou encore
ufw allow proto udp to any port 22 from any
UNIX /Linux – Jean Michel Meulien
Page 78
XXI) Les permissions Unix
Les permissions UNIX constituent un système simple de définition des droits d'accès aux
ressources, représentées par des fichiers disponibles sur un système informatique. Elles restent
le moyen le plus utilisé pour définir les droits des utilisateurs sur les systèmes de type UNIX.





Introduction
 Notion d'utilisateur (user)
 Groupe
 Propriété
 Droits d'accès à un fichier
 Norme POSIX
Fonctionnement
 Les différents droits
 Représentation des droits
 Utilisation
Droits étendus
 Droit SUID
 Définition
 Notation
 Valeur
 Exemple d'utilisation
 Protection contre une attaque de type sushi
 Droit SGID
 Définition
 Notation
 Valeur

Sticky Bit
 Définition
 Notation
 Valeur
 Exemple d'utilisation
Ajout de la gestion des listes de contrôle d'accès
Comparaison avec le NTFS de Microsoft
Introduction
Notion d'utilisateur (user)
Toute entité (personne physique ou programme particulier) devant interagir avec un système
UNIX est authentifié sur cet ordinateur par un utilisateur ou user. Ceci permet d'identifier un
acteur sur un système UNIX. Un utilisateur est reconnu par un nom unique et un numéro
unique (la correspondance nom/numéro est stockée dans le fichier /etc/passwd).
UNIX /Linux – Jean Michel Meulien
Page 79
Tous les utilisateurs UNIX n'ont pas les mêmes droits d'accès à l'ordinateur (ils ne peuvent
pas tous faire la même chose), et ceci simplement pour des raisons de sécurité et
d'administration. Par exemple, pour éviter tout problème sur Internet, l'utilisateur qui gère le
serveur HTTP n'a pas le droit d'exécuter des commandes localement, pour éviter que le
serveur puisse le faire.
Certains utilisateurs ne peuvent en effet pas s'authentifier sur l'ordinateur et accéder à un
interpréteur de commandes. Cela ne veut toutefois pas dire qu'ils ne peuvent rien faire sur
l'ordinateur : il leur est possible de lire ou écrire des fichiers mais cela nécessite que le superutilisateur (voir plus bas) démarre un programme pour cet utilisateur. Ce mécanisme est
généralement utilisé pour les démons : le super utilisateur démarre le démon et pour éviter que
ce dernier puisse faire tout et n'importe quoi sur la machine, il est par exemple attribué à
l'utilisateur bin.
Sur tout système UNIX, il y a un super-utilisateur, généralement appelé root, qui a tous les
pouvoirs. Il peut accéder librement à toutes les ressources de l'ordinateur, y compris à la place
d'un autre utilisateur, c'est-à-dire sous son identité. En général, du moins sur les systèmes de
production, seul l'administrateur système possède le mot de passe root. L'utilisateur root
porte le numéro 0.
Groupe
Un utilisateur UNIX appartient à un ou plusieurs groupes. Les groupes servent à rassembler
des utilisateurs afin de leur attribuer des droits communs. Par exemple, sur un système doté
d'une carte son, il y a souvent un groupe audio qui regroupe les utilisateurs autorisés à en faire
usage.
Propriété
Tout fichier UNIX possède un propriétaire. Au départ, c'est l'utilisateur qui a créé le fichier
mais il possible de le « donner » à un autre utilisateur. Seul le propriétaire du fichier et le
super utilisateur (root) peuvent changer les droits et l'appartenance de ce fichier. Seul root
peut s'attribuer un fichier, mais un utilisateur ordinaire peut donner un de ses fichiers à un
autre utilisateur ordinaire.
Un fichier UNIX appartient aussi à un groupe. Ceci donne pleinement son sens à la notion de
groupe. On définit ainsi les actions du groupe sur ce fichier. Ce groupe est souvent le groupe
d'appartenance du propriétaire, mais ce n'est pas obligatoire. Tout dépend en fait de ce qu'on
veut faire. On peut imaginer un scénario de délégation d'administration : le super utilisateur
est propriétaire d'un fichier de configuration, mais autorise tous les utilisateurs du groupe
admin (les administrateurs) à modifier ce fichier. Le fichier en question aura donc root
comme propriétaire et appartiendra au groupe admin.
Rappelons que les répertoires sous UNIX sont aussi des fichiers. Les droits sur les répertoires
(mais aussi les périphériques, etc.) fonctionnent exactement de la même façon que sur des
fichiers ordinaires.
UNIX /Linux – Jean Michel Meulien
Page 80
Droits d'accès à un fichier
À chaque fichier est associée une liste de permissions, qui déterminent ce que chaque
utilisateur a le droit de faire du fichier.
Norme POSIX
Les permissions d'accès aux fichiers dans la norme POSIX sont inspirées des permissions
d'accès UNIX.
Fonctionnement
Les différents droits
Les droits sur un fichier UNIX s'attribuent sur trois « actions » différentes possibles :



la lecture (r) : on peut par exemple lire le fichier avec un logiciel. Lorsque ce droit est
alloué à un répertoire, il autorise l'affichage du contenu du répertoire (la liste des
fichiers présents à la racine de ce répertoire).
l'écriture (w) : on peut modifier ou supprimer le fichier. Lorsque ce droit est alloué à
un répertoire, il autorise la modification et la suppression des fichiers qu'il contient,
quelques soient les droits d'accès des fichiers de ce répertoire (mêmes s'ils ne
possèdent pas eux-mêmes le droit en écriture). Néanmoins le droit spécial sticky bit
(voir plus bas) permet de passer outre ce comportement.
l'exécution (x) : on peut exécuter le fichier s'il est prévu pour, c'est-à-dire si c'est un
fichier exécutable. Lorsque ce droit est attribué à un répertoire, il autorise l'accès (ou
ouverture) au répertoire.
On appelle parfois r, w et x des « flags » ou « drapeaux ». Sur un fichier donné, ces 3 flags
doivent être définis pour son propriétaire, son groupe, mais aussi les autres utilisateurs
(différents du propriétaire et n'appartenant pas au groupe).
Seuls root et le propriétaire d'un fichier peuvent changer ses permissions d'accès.
Représentation des droits
Cet ensemble de trois droits sur trois entités se représente généralement de la façon suivante :
on écrit côte à côte les droits r, w puis x respectivement pour le propriétaire (u), le groupe
(g) et les autres utilisateurs (o). Les codes u, g et o (u comme user, g comme group et o
comme others) sont utilisés par les commandes UNIX qui permettent d'attribuer les droits et
l'appartenance des fichiers. Lorsqu'un flag est attribué à une entité, on écrit ce flag (r, w ou x),
et lorsqu'il n'est pas attribué, on écrit un '-'. Par exemple :
rwxr-xr-\ /\ /\ /
v v v
| | droits des autres utilisateurs (o)
| |
| droits des utilisateurs appartenant au groupe (g)
|
UNIX /Linux – Jean Michel Meulien
Page 81
droits du propriétaire (u)
Signifie que le propriétaire peut lire, écrire et exécuter le fichier, mais que les utilisateurs du
groupe attribué au fichier ne peuvent que le lire et l'exécuter, et enfin que les autres
utilisateurs ne peuvent que lire le fichier. Une autre manière de représenter ces droits est sous
forme binaire grâce à une clef numérique fondée sur la correspondance entre un nombre
décimal et sont expression binaire :








0 = 000
1 = 001
2 = 010
3 = 011
4 = 100
5 = 101
6 = 110
7 = 111
A l'expression binaire en trois caractères sont associés les trois types de droits (r w x) ; il
suffit donc de déclarer pour chacune des catégories d'utilisateur (user, group, others) un
chiffre entre 0 et 7 auquel correspond une séquence de droits d'accès. Par exemple :




777 donne 111 111 111 soit r w x r w x r w x
605 donne 110 000 101 soit r w - - - - r - x
644 donne 110 100 100 soit r w - r - - r - 666 donne 110 110 110 soit r w - r w - r w -
Une astuce permet d'associer rapidement une valeur décimale à la séquence de droits
souhaitée. Il suffit d'attribuer les valeurs suivantes pour chaque type de droit :



lecture (r) correspond à 4
écriture (w) correspond à 2
exécution (x) correspond à 1
Puis on additionne ces valeurs selon qu'on veuille ou non attribuer le droit en correspondant.
Ainsi, rwx « vaut » 7 (4+2+1), r-x « vaut » 5 (4+1) et r-- « vaut » 4. Les droits complets
(rwxr-xr--) sont donc équivalents à 754. Une manière directe d'attribuer les droits est de les
écrire sous cette forme et d'utiliser le code à trois chiffres résultant avec chmod (voir ciaprès).
Utilisation
Pour voir quels droits sont attribués à un fichier, il suffit de taper la commande ls -l
nom_du_fichier :
# ls -l toto
-rwxr-xr-- 1 user
group
12345 Nov 15 09:19 toto
La sortie signifie que le fichier toto (de taille 12345) appartient à « user », qu'on lui a attribué
le groupe « group », et que les droits sont rwxr-xr--. On remarque qu'il y a en fait 10
UNIX /Linux – Jean Michel Meulien
Page 82
caractères sur la zone de droits. Le premier - n'est pas un droit, c'est un caractère réservé pour
indiquer le type de fichier. Il peut prendre les valeurs suivantes :







d : répertoire
l : lien symbolique
c : périphérique de type caractère
b : périphérique de type bloc
p : fifo
s : socket
- : fichier classique
Le changement de droits s'effectue avec la commande chmod ; le changement de propriétaire
ou de groupe, à l'aide de la commande chown.
Changer les droits peut s'effectuer également simplement à partir du nombre à trois chiffres
calculé comme précédemment. Ainsi, pour attribuer les droits r-xr-xr-x (i.e. 555), il suffit
d'exécuter :
chmod 555 nom_du_fichier
Droits étendus
Il existe d'autres droits spéciaux, rendant possible une gestion plus poussée des permissions.
Droit SUID
Définition
Ce droit s'applique aux fichiers exécutables, il permet d'allouer temporairement à un
utilisateur les droits du propriétaire du fichier, durant son exécution. En effet, lorsqu'un
programme est exécuté par un utilisateur, les tâches qu'il accomplira seront restreintes par ses
propres droits, qui s'appliquent donc au programme. Lorsque le droit SUID est appliqué à un
exécutable et qu'un utilisateur quelconque l'exécute, le programme détiendra alors les droits
du propriétaire du fichier durant son exécution. Bien sûr, un utilisateur ne peut jouir du droit
SUID que s'il détient par ailleurs les droits d'exécution du programme. Ce droit est utilisé
lorsqu'une tâche, bien que légitime pour un utilisateur classique, nécessite des droits
supplémentaires (généralement ceux de root). Il est donc à utiliser avec précaution.
Notation
Son flag est la lettre s ou S qui vient remplacer le x du propriétaire. La majuscule sur le flag
permet de voir le flag x (droit d'exécution du propriétaire) caché par le droit SUID. C'est un s
si le droit d'exécution du propriétaire est présent, ou un S sinon. Il se place donc comme ceci :
---s------ ou ---S-----Un fichier avec les droits
-rwxr-xr-x
UNIX /Linux – Jean Michel Meulien
Page 83
Auquel on ajoute le droit SUID aura donc la notation
-rwsr-xr-x
Valeur
Le droit SUID possède la valeur octale 4000.
Exemple : - r w s r - x r - x correspond à 4755.
Exemple d'utilisation
Le droit SUID est utilisé pour le programme mount (généralement localisé dans /bin) :
-rwsr-xr-x 1 root bin 68804 /bin/mount
Protection contre une attaque de type sushi
Sur linux, des restrictions de droit ont été faites sur le drapeau SUID :


pour un fichier de script, l'exécution se fera sans tenir compte du drapeau SUID.
il semble de plus que si un utilisateur autre que le propriétaire modifie le fichier, alors
le bit SUID est remis à 0.
Il n'est pas sûr que les versions d'Unix actuelles aient implémenté cette sécurité ; dans ce cas,
cela ouvre la porte à une attaque qui est appelée sushi (su Shell) : l'utilisateur root crée un
fichier de Shell avec le bit SUID en laissant les droits en écriture à d'autres utilisateurs ; l'un
d'eux pourra modifier le fichier et exécuter tout ce qu'il voudra avec les droits de root.
Droit SGID
Définition
Ce droit fonctionne comme le droit SUID, mais appliqué aux groupes. Il donne à un
utilisateur les droits du groupe auquel appartient le propriétaire de l'exécutable et non plus
les droits du propriétaire. De plus, ce droit à une tout autre utilisation s'il est appliqué à un
répertoire. Normalement, lorsqu'un fichier est créé par un utilisateur, il en est propriétaire, et
un groupe par défaut lui est appliqué (généralement users si le fichier a été créé par un
utilisateur, et root s'il a été créé par root). Cependant, lorsqu'un fichier est créé dans un
répertoire portant le droit SGID, alors ce fichier se verra attribuer par défaut le groupe du
répertoire. De plus, si c'est un autre répertoire qui est créé dans le répertoire portant le droit
SGID, ce sous-répertoire portera également ce droit.
Notation
Comme le droit SUID, il vient remplacer le flag x, mais celui des droits du groupe, et la
majuscule indique le droit d'exécution x caché, elle est présente s'il n'est pas alloué.
------s--- ou ------S--Un fichier avec les droits
UNIX /Linux – Jean Michel Meulien
Page 84
-rwxr--r-Auquel on ajoute le droit SGID aura donc la notation
-rwxr-Sr-Valeur
Le droit SGID possède la valeur octale 2000.
Exemple : - r w x r - S r - - correspond à 2711.
Sticky Bit
Ce droit (traduction bit collant) est utilisé pour manier de façon plus subtile les droits
d'écriture d'un fichier. En effet, un droit d'écriture signifie que l'on peut modifier et supprimer
le fichier. Le sticky bit permet de faire la différence entre les deux.
Définition
Lorsque ce droit est positionné sur un répertoire, il interdit la suppression des fichiers qu'il
contient à tout utilisateur autre que le propriétaire. Néanmoins, il est toujours possible pour un
utilisateur possédant les droits d'écriture sur ce fichier de le modifier (par exemple de le
transformer en un fichier vide). Remarquons que c'est le même principe que les pages de
wikipédia, elles sont modifiables mais on ne peut pas les supprimer.
Pour les fichiers l'utilisation est tout autre. Le bit collant (sticky bit) indique alors que ce
fichier doit encore rester en mémoire vive après son exécution. Le but était, à l'époque,
d'améliorer les performances en évitant de charger/décharger un fichier de la mémoire (par
exemple, un exécutable ou une bibliothèque logicielle). Le terme sticky (collant) voulait dire
que le fichier restait collé en mémoire.
Notation
Son flag est le t ou T, qui vient remplacer le droit d'exécution x des autres utilisateurs que le
propriétaire et ceux appartenant au groupe du fichier, de la même façon que les droits SUID et
SGID. La majuscule fonctionne aussi de la même façon, elle est présente si le droit
d'exécution x caché n'est pas présent.
---------t ou ---------T
Un fichier avec les droits
-rwxr-xr-x
Auquel on ajoute le droit sticky bit aura donc la notation
-rwxr-xr-t
UNIX /Linux – Jean Michel Meulien
Page 85
Valeur
Le droit sticky bit possède la valeur octale 1000.
Exemple : - r w x r - x r - t correspond à 1755.
Exemple d'utilisation
Sur certaines distribution linux, le sticky bit est utilisé pour le répertoire /tmp, qui doit être
accessible en écriture par tous les utilisateurs, sans que ceux-ci se suppriment leurs fichiers les
uns les autres :
drwxrwxrwt 86 root root 20480 tmp
Ajout de la gestion des listes de contrôle d'accès
Avec les permissions Unix, il n'est pas possible d'avoir une gestion des Listes de contrôle
d'accès très fine : on peut seulement donner des doits particuliers à



1 utilisateur
1 groupe
ceux qui ne sont ni l'un, ni l'autre.
Il est possible d'y remédier en rajoutant un logiciel supplémentaire, pour la gestion des
listes de contrôle d'accès. Dans le cas particulier d'une des distributions linux, cela s'obtient
en rajoutant le paquetage correspondant (exemple : paquetage acl, version 2.2.23-1 dans la
version sarge de debian).
Comparaison avec le NTFS de Microsoft
Les permissions NTFS de Microsoft et les permissions d'accès Unix sont conformes à la
norme POSIX, mais sont profondément différentes :
1) NTFS inclut la gestion des Listes de Contrôle d'accès, alors que par défaut, Unix
ne le permet pas.
2) Sur NTFS, il y a deux permissions qui n'existent pas explicitement sur Unix


le droit de s'approprier un fichier
le droit de changer les droits (voir chmod#Permission de changer les droits)
3) Le droit t (sticky bit) dans les versions d'Unix récentes correspond grossièrement
au droit de suppression sur NTFS
4) Sur Unix, il y a un seul bit par droit. Sur NTFS, les différents droits de base
(lecture, écriture, etc.) sont définis par de nombreux bits.
UNIX /Linux – Jean Michel Meulien
Page 86