4. Configurer les fonctions communes 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 distantes, appelé RPC pour Remote Procedure Call, constitue le point de départ de la mise en œuvre de ces services.

4.1. Gérer des appels RPC

Q1.

Quel est le paquet qui fournit le service de gestion des appels de procédure distants RPC ?.

Recherchez les noms de paquets qui contiennent la chaîne 'rpc'. Installez le paquet identifié.

apt search --names-only ^rpc
rpcbind/testing,now 1.2.7-1 amd64 [installé, automatique]
  conversion de numéros de programmes RPC en adresses universelles

rpcsvc-proto/testing,now 1.4.3-1 amd64 [installé, automatique]
  RPC protocol compiler and definitions

À la lecture de la liste ci-dessus, c'est le paquet rpcbind qu'il faut installer.

sudo apt install rpcbind

Q2.

Quel est le numéro de port utilisé par le service ? Comment fonctionne le service en écoute sur ce numéro de port ?

  • Listez les processus actifs sur le système dont le nom contient la chaîne 'rpc'.

  • Affichez le numéro de port en écoute correspondant à ce service.

  • Consultez les pages de manuels de la commande rpcbind.

  • Listez des processus actifs en isolant la chaîne 'rpcbind'.

    pgrep -a rpcbind
    514 /usr/sbin/rpcbind -f -w
  • Identifiez le ou les numéros de ports en écoute en utilisant les commandes lsof et/ou ss.

    Commençons par la commande lsof :

    sudo apt install lsof
    sudo lsof -i | grep [rpc]bind
    rpcbind    514            _rpc   4u  IPv4   5424      0t0  TCP *:sunrpc (LISTEN)
    rpcbind    514            _rpc   5u  IPv4   7361      0t0  UDP *:sunrpc
    rpcbind    514            _rpc   6u  IPv6   4250      0t0  TCP *:sunrpc (LISTEN)
    rpcbind    514            _rpc   7u  IPv6   6274      0t0  UDP *:sunrpc

    Recherchez 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

    Passons à la commande ss pour effectuer la même recharche :

    sudo ss -lntup | grep rpcbind
    udp   UNCONN 0      0            0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=514,fd=5),("systemd",pid=1,fd=193))
    udp   UNCONN 0      0               [::]:111           [::]:*    users:(("rpcbind",pid=514,fd=7),("systemd",pid=1,fd=195))
    tcp   LISTEN 0      4096         0.0.0.0:111        0.0.0.0:*    users:(("rpcbind",pid=514,fd=4),("systemd",pid=1,fd=192))
    tcp   LISTEN 0      4096            [::]:111           [::]:*    users:(("rpcbind",pid=514,fd=6),("systemd",pid=1,fd=194))

    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.

  • Recherchez dans la section DESCRIPTION des pages de manuels du service rpcbind, les informations sur son fonctionnement.

    man rpcbind

Q3.

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

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

Recherchez dans les pages de manuels de la commande l'option d'affichage la plus synthétique.

La commande présentée dans le support Linux NFS-HOWTO est appelée rpcinfo. Vérifiez sa présence sur le système serveur et/ou client.

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

Ouvrez les pages de manuels de la commande rpcinfo et recherchez 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 en l'état actuel de la configuration.

Relevez la liste des versions du service supportées ainsi que l'ordre de priorité associé.

Les versions disponibles pour le protocole NFS sont : 2, 3 et 4.

Q4.

Donnez 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.

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

Testez différentes adresses IP pour intérroger les systèmes client et serveur.

  • Lancez une requête sur le système local.

    rpcinfo -s localhost
       program version(s) netid(s)                         service     owner
        100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser
  • Lancez une requête sur le système voisin.

    rpcinfo -s fe80::baad:caff:fefe:5
       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 services. Les configurations sur les deux hôtes sont donc identiques à ce stade de la configuration.

Q5.

Réalisez une capture à l'aide de l'analyseur réseau lors de l'exécution de la commande et relevez : 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 ----
[Note] Note

Pour effectuer des captures de trafic réseau en mode console, deux applications sont à notre disposition : tshark et termshark. Pour limiter la taille des captures d'écran, on privilégie l'utilisation de tshark.

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

Lancez une capture de trafic basée sur les adresses de lien local IPv6 pour obtenir l'affichage le plus simple.

  • Lancez la capture sur le premier système.

    tshark -i enp0s1 -f "host fe80::baad:caff:fefe:5"
  • Lancez la commande rpcinfo sur le second système.

    rpcinfo -s fe80::baad:caff:fefe:6
       program version(s) netid(s)                         service     owner
        100000  2,3,4     local,udp,tcp,udp6,tcp6          portmapper  superuser
  • Relevez les résultats de capture sur le premier système.

    Capturing on 'enp0s1'
        1 0.000000000 fe80::baad:caff:fefe:5 → fe80::baad:caff:fefe:6 Portmap 102 V3 DUMP Call
        2 0.000390802 fe80::baad:caff:fefe:6 → fe80::baad:caff:fefe:5 Portmap 746 V3 DUMP Reply (Call In 1)

Reprenez la même démarche en utilisant une adresse globale pour faire apparaître l'utilisation de la couche transport.

tshark -i enp0s1 -f "host 2001:678:3fc:65:baad:caff:fefe:5"
Capturing on 'enp0s1'
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 TCP 94 50522 → 111 [SYN] Seq=0 Win=64800 Len=0 MSS=1440 SACK_PERM TSval=2127598301 TSecr=0 WS=128
2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 TCP 94 111 → 50522 [SYN, ACK] Seq=0 Ack=1 Win=64260 Len=0 MSS=1440 SACK_PERM TSval=4291415952 TSecr=2127598301 WS=128
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 TCP 86 50522 → 111 [ACK] Seq=1 Ack=1 Win=64896 Len=0 TSval=2127598302 TSecr=4291415952
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 Portmap 130 V3 DUMP Call
2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 TCP 86 111 → 50522 [ACK] Seq=1 Ack=45 Win=64256 Len=0 TSval=4291415953 TSecr=2127598302
2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 Portmap 774 V3 DUMP Reply (Call In 4)
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 TCP 86 50522 → 111 [ACK] Seq=45 Ack=689 Win=64256 Len=0 TSval=2127598303 TSecr=4291415954
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 TCP 86 50522 → 111 [FIN, ACK] Seq=45 Ack=689 Win=64256 Len=0 TSval=2127598303 TSecr=4291415954
2001:678:3fc:65:baad:caff:fefe:6 → 2001:678:3fc:65:baad:caff:fefe:5 TCP 86 111 → 50522 [FIN, ACK] Seq=689 Ack=46 Win=64256 Len=0 TSval=4291415954 TSecr=2127598303
2001:678:3fc:65:baad:caff:fefe:5 → 2001:678:3fc:65:baad:caff:fefe:6 TCP 86 50522 → 111 [ACK] Seq=46 Ack=690 Win=64256 Len=0 TSval=2127598303 TSecr=4291415954

Cette copie d'écran montre que :

  • 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.

Affichez les détails de la transaction RPC en enregistrant la capture de trafic dans un fichier.

  • Utilisez l'option -w pour l'enregistrement.

    tshark -i enp0s1 -f "host fe80::baad:caff:fefe:5" -w rpcinfo.pcap
  • Affichez les détails en précisant le le numéro de trame capturée.

    tshark -r /var/tmp/rpcinfo.pcap -V -Y "frame.number == 1"
    tshark -r /var/tmp/rpcinfo.pcap -V -Y "frame.number == 2"

4.2. Installer le paquet NFS commun au client et au serveur

Q6.

Quel est le paquet commun au client et au serveur NFS ? Installez ce paquet et listez les commandes fournies par ce paquet.

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

apt search --names-only ^nfs
nfs-common/testing,now 1:2.8.3-1+b1 amd64 [installé]
  fichiers de prise en charge NFS communs au client et au serveur

Le résultat de la commande de recherche propose une longue liste de paquets. Retenez le paquet nfs-common qui utilise les fonctions du noyau. Il correspond à l'architecture présentée à la Section 3, « Protocole NFSv4 ».

sudo apt install nfs-common

Listez les programmes fournis par ce paquet.

dpkg -L nfs-common | grep bin
/usr/sbin
/usr/sbin/blkmapd
/usr/sbin/mount.nfs
/usr/sbin/mountstats
/usr/sbin/nfsconf
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.statd
/usr/sbin/rpc.svcgssd
/usr/sbin/rpcctl
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
/usr/sbin/mount.nfs4
/usr/sbin/umount.nfs
/usr/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.