4. Configuration commune au client et au serveur NFS

Plusieurs services communs doivent être actifs pour que les accès au système de fichiers réseau NFS soient utilisables. Le mécanisme de gestion des appels de procédures distants appelé RPC ou Remote Procedure Call constitue le point de départ dans la mise œuvre de ces services communs.

Le logiciel de gestion des appels de procédures distants a évolué avec les différentes versions du système de fichiers NFS et l'arrivée du protocole réseau IPv6. La configuration étudiée ici doit permettre de fonctionner de la façon la plus transparente possible avec les versions 3 et 4 du système de fichiers NFS.

[Note] Note

Les manipulations présentées ici ne traitent pas le volet authentification et chiffrement des échanges sur le réseau. On considère que les services Kerberos, SPKM-3 et LIPKEY ne sont pas actifs sur les systèmes étudiés.

4.1. Gestion des appels RPC

Q1.

Quels sont les deux logiciels disponibles chargés de la gestion des appels RPC ? Qu'est-ce qui les distinguent  ?

La présentation Systèmes de fichiers réseau introduit les principes de fonctionnement des appels de procédures distants.

Rechercher dans le support Linux NFS-HOWTO le service «historique» utilisé par NFS pour le multiplexage des appels de procédures distants.

Le support Linux NFS-HOWTO présente le service «historique» utilisé par NFS pour le multiplexage des appels de procédure distants : portmap. Ce service est fourni par le paquet du même nom et est limité au protocole réseau IPv4.

Le démon rpcbind actuel est aussi fourni par le paquet du même nom. C'est un logiciel de multiplexage des appels de procédure distants qui se veut plus évolutif que le précédent et qui supporte le protocole réseau IPv6.

Q2.

Quel est le paquet qui correspond à la gestion des appels de procédure distants ?.

Utiliser les outils de recherche dans les répertoires de noms de paquets et dans leurs descriptions : apt-cache, dpkg, aptitude.

Comme indiqué dans la documentation, on recherche un paquet portant le nom rpcbind.

$ apt search rpcbind
En train de trier... Fait
Recherche en texte intégral... Fait
rpcbind/testing,now 1.2.6-2 amd64
  converts RPC program numbers into universal addresses
$ sudo apt install rpcbind

Q3.

Quel est le numéro de port utilisé par le service ? Quel est le principe de fonctionnement du service pour le traitement des appels de procédures distants ?

Utiliser les commandes qui permettent d'obtenir les informations sur :

  • La liste des processus actifs sur le système,

  • Les numéros de ports en écoute sur les interfaces réseau,

  • Les pages de manuels des applications utilisées.

  • La liste des processus actifs sur le système,

    $ ps aux | grep rpc[b]ind
    root      2963  0.0  0.0  18956   724 ?        Ss   14:01   0:00 /sbin/rpcbind -w
  • Les numéros de ports en écoute sur les interfaces réseau,

    $ sudo lsof -i | grep rpc[b]ind
    rpcbind   2096        _rpc    4u  IPv4  18957      0t0  TCP *:sunrpc (LISTEN)
    rpcbind   2096        _rpc    5u  IPv4    713      0t0  UDP *:sunrpc
    rpcbind   2096        _rpc    6u  IPv6   1752      0t0  TCP *:sunrpc (LISTEN)
    rpcbind   2096        _rpc    7u  IPv6  20601      0t0  UDP *:sunrpc

    On obtient la correspondance entre numéro de port et nom de service en consultant le fichier /etc/services.

    $ grep sunrpc /etc/services
    sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper
    sunrpc          111/udp         portmapper

    Le principe de fonctionnement des appels de procédure distants veut que tous ces appels soient reçus sur un numéro de port unique : sunrpc/111. Ces appels, une fois identifiés, sont transmis aux programmes concernés pour être traités.

  • Les pages de manuels des applications utilisées.

    $ man rpcbind

Q4.

Quelle est a commande qui permet de lister les services accessibles via un appel RPC ? À quel paquet appartient cette commande ?

Rechercher dans le support Linux NFS-HOWTO et dans la liste des fichiers du paquet sélectionné pour la gestion des appels RPC.

La commande présentée dans le support Linux NFS-HOWTO est appelée rpcinfo. On vérifie sa présence sur le système étudié de la façon suivante.

$ dpkg -S $(which rpcinfo)
rpcbind: /usr/sbin/rpcinfo

C'est l'option -s qui permet d'obtenir la présentation la plus synthétique des services accessibles par appel RPC.

$ rpcinfo -s
   program version(s) netid(s)                         service     owner
    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser

La copie d'écran ci-dessus montre que le gestionnaire d'appel portmapper est le seul service ouvert. On relève l'ordre de priorité des différentes versions du service supportées par le système ainsi que les versions des protocoles de couche transport.

Q5.

Donner deux exemples d'exécution de la commande pour lister le(s) service(s) ouvert sur le système local puis sur le système voisin.

Reprendre la commande utilisée dans la question précédente en indiquant l'adresse IPv4 ou IPv6 du système voisin.

L'exemple d'exécution de la commande en local est donné dans la copie d'écran de la question précédente. Pour connaître les services accessibles sur un autre poste, on utilise la même commande suivie de l'adresse IP de cet hôte.

$ rpcinfo -s 192.168.51.194
   program version(s) netid(s)                         service     owner
    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser
$ rpcinfo -s fe80::baad:caff:fefe:2
   program version(s) netid(s)                         service     owner
    100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser

Ces copies d'écran montrent la même liste de paramètres que lors de l'exécution de la commande en local. Les configurations sur les deux hôtes sont donc identiques à ce stade de la configuration.

Q6.

Réaliser une capture à l'aide de l'analyseur réseau lors de l'exécution de la commande et relever : le protocole de transport utilisé, les numéros de ports caractéristiques de cette transaction ainsi que le nom de la procédure RPC utilisée.

système 1                                       système 2
----------------------------------------------------------
 <commande>       --- requête --->            <processus>

                  <-- réponse ----

Voici un exemple de capture en mode console qui donne les éléments demandés.

[Note] Note

Pour effectuer des captures de trafic réseau en mode console, on dispose de deux applications : tshark et termshark. Pour limiter les dimensions des copies d'écran, on privilégie l'utilisation de tshark.

Pour utiliser l'une ou l'autre des deux applications en tant qu'utilisateur normal, il est nécessaire d'appartenir au groupe wireshark. Pour ajouter le compte etu au groupe système, on exécute l'instruction $ sudo adduser etu wireshark. Il ne faut pas oublier de se déconnecter puis se reconnecter pour bénéficier de l'attribution au groupe.

Pour une requête IPv4, on obtient :

$ tshark -i enp0s6
Capturing on 'enp0s6'
192.168.51.195 → 192.168.51.194 TCP 74 53284 → 111 [SYN] Seq=0
192.168.51.194 → 192.168.51.195 TCP 74 111 → 53284 [SYN, ACK] Seq=0 Ack=1
192.168.51.195 → 192.168.51.194 TCP 66 53284 → 111 [ACK] Seq=1 Ack=1
192.168.51.195 → 192.168.51.194 Portmap 110 V3 DUMP Call
192.168.51.194 → 192.168.51.195 TCP 66 111 → 53284 [ACK] Seq=1 Ack=45
192.168.51.194 → 192.168.51.195 Portmap 754 V3 DUMP Reply (Call In 4)
192.168.51.195 → 192.168.51.194 TCP 66 53284 → 111 [ACK] Seq=45 Ack=689
192.168.51.195 → 192.168.51.194 TCP 66 53284 → 111 [FIN, ACK] Seq=45 Ack=689
192.168.51.194 → 192.168.51.195 TCP 66 111 → 53284 [FIN, ACK] Seq=689 Ack=46
192.168.51.195 → 192.168.51.194 TCP 66 53284 → 111 [ACK] Seq=46 Ack=690

Pour une requête IPv6 avec l'adresse unique, on obtient :

$ tshark -i enp0s6
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 TCP 94 51134 → 111 [SYN] Seq=0
2001:678:3fc:1f5:baad:caff:fefe:2 → 2001:678:3fc:1f5:baad:caff:fefe:3 TCP 94 111 → 51134 [SYN, ACK] Seq=0 Ack=1
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 TCP 86 51134 → 111 [ACK] Seq=1 Ack=1
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 Portmap 130 V3 DUMP Call
2001:678:3fc:1f5:baad:caff:fefe:2 → 2001:678:3fc:1f5:baad:caff:fefe:3 TCP 86 111 → 51134 [ACK] Seq=1 Ack=45
2001:678:3fc:1f5:baad:caff:fefe:2 → 2001:678:3fc:1f5:baad:caff:fefe:3 Portmap 774 V3 DUMP Reply (Call In 4)
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 TCP 86 51134 → 111 [ACK] Seq=45 Ack=689
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 TCP 86 51134 → 111 [FIN, ACK] Seq=45 Ack=689
2001:678:3fc:1f5:baad:caff:fefe:2 → 2001:678:3fc:1f5:baad:caff:fefe:3 TCP 86 111 → 51134 [FIN, ACK] Seq=689 Ack=46
2001:678:3fc:1f5:baad:caff:fefe:3 → 2001:678:3fc:1f5:baad:caff:fefe:2 TCP 86 51134 → 111 [ACK] Seq=46 Ack=690
  • Le protocole de couche transport utilisé est TCP.

  • Le numéro de port utilisé correspond bien au service enregistré sunrpc/111.

  • Le sous-programme distant appelé est : Portmap V3 DUMP Call.

Pour une requête IPv6 avec l'adresse de lien local, on obtient :

$ tshark -i enp0s6 -f "! port 22"
Capturing on 'enp0s6'
    1 0.000000000 fe80::baad:caff:fefe:3 → fe80::baad:caff:fefe:2 Portmap 102 V3 DUMP Call
    2 0.000265556 fe80::baad:caff:fefe:2 → fe80::baad:caff:fefe:3 Portmap 746 V3 DUMP Reply (Call In 1)
^C2 packets captured

Ici, le protocole de couche transport utilisé est UDP. Comme UDP est non orienté connexion, on ne relève aucune trace d'ouverture ou de fermeture de connexion.

On remarque que la copie d'écran ci-dessus utilise une syntaxe de capture qui permet de filtrer tous les segments qui font appel au port numéro 22 qui correspond au service SSH.

$ tshark -i enp0s6 -f "! port 22"

Pour exploiter toutes les informations du trafic capturé, il est conseillé de stocker les résultats dans un fichier à l'aide de la syntaxe suivante.

$ tshark -i enp0s6 -f "! port 22" -w /var/tmp/rpcbind.pcap
Capturing on 'enp0s6'
3 ^C

Dans ce dernier cas, seul le compte des trames capturées apparaît à la console.

On peut alors transférer le fichier de capture via la commande scp pour une exploitation via l'interface graphique de Wireshark ou afficher les détails directement à la console. Dans l'exemple ci-dessous, on affiche toutes les informations relatives à la première trame capturée.

$ tshark -r /var/tmp/rpcbind.pcap -V -Y "frame.number == 1"

4.2. Gestion des paquets NFS

Q7.

Quel est le paquet commun au client et au serveur ? Identifier le jeu de commandes fournies par ce paquet.

Rechercher dans la liste des paquets disponibles, ceux dont le nom débute par nfs.

$ aptitude search ?name"(^nfs)" | grep -v ganesha
v  nfs-client -
p  nfs-common - NFS support files common to client and server
p  nfs-kernel-server - support for NFS kernel server
v  nfs-server -
p  nfs4-acl-tools - Commandline and GUI ACL utilities for the NFSv4 client
p  nfstrace - NFS tracing/monitoring/capturing/analyzing tool
p  nfstrace-doc - NFS tracing/monitoring/capturing/analyzing tool (documentation)
p  nfswatch - Program to monitor NFS traffic for the console

Dans la liste ci-dessus, on identifie le paquet nfs-common qui correspond bien aux fonctions communes au client et au serveur NFS.

$ sudo apt install nfs-common

Une fois le paquet installé, la liste des programmes fournis par ce paquet est extraite de la liste de ses fichiers à l'aide de la commande suivante.

$ dpkg -L nfs-common | grep bin
/sbin
/sbin/mount.nfs
/sbin/osd_login
/sbin/rpc.statd
/sbin/showmount
/sbin/sm-notify
/usr/sbin
/usr/sbin/blkmapd
/usr/sbin/mountstats
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcdebug
/usr/sbin/start-statd
/sbin/mount.nfs4
/sbin/umount.nfs
/sbin/umount.nfs4

Dans cette liste, on trouve les commandes de montage, de démontage et de suivi d'état du système de fichiers réseau.