Configurer les ports NFS sur les VM clientes

Cette page explique comment définir les ports des daemons statd et nlockmgr sur vos VM clientes pour simplifier la configuration du pare-feu.

Filestore utilise les daemons nlockmgr et statd pour activer le verrouillage de fichiers. Les ports de ces services doivent être correctement exposés sur vos VM clientes via des règles de pare-feu afin que les clients puissent utiliser correctement les verrous. Nous vous recommandons de définir les ports statd et nlockmgr de manière cohérente sur toutes les VM clientes, ce qui facilite la configuration des règles de pare-feu d'entrée.

Pour plus d'informations sur la nécessité ou non de configurer une règle de pare-feu pour le réseau VPC, consultez la page Configurer des règles de pare-feu.

Vérifier les paramètres des ports

Pour vérifier les valeurs auxquelles les ports statd et nlockmgr sont actuellement définis, exécutez les commandes suivantes sur l'instance de VM cliente. Si les fichiers n'existent pas ou si les options n'ont pas de valeur, les ports ne sont pas définis. Dans ce cas, les daemons sont affectés de façon dynamique à des ports arbitraires disponibles.

Debian/Ubuntu

  1. Pour déterminer le port statd, exécutez la commande suivante et examinez la valeur STATDOPTS:

    cat /etc/default/nfs-common
    
  2. Pour déterminer le port nlockmgr, exécutez la commande suivante et examinez les valeurs nlm_tcpport et nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

RHEL/CentOS

  1. Pour déterminer le port statd, exécutez la commande suivante et examinez la valeur STATD_PORT:

    cat /etc/sysconfig/nfs
    
  2. Pour déterminer le port nlockmgr, exécutez la commande suivante et examinez les valeurs nlm_tcpport et nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

SUSE

Exécutez la commande suivante :

cat /etc/sysconfig/nfs

Le port statd est répertorié sous STATD_PORT et le port nlockmgr est répertorié sous LOCKD_TCPPORT et LOCKD_UDPPORT.

Windows

Il n'est pas nécessaire de définir des ports NFS sous Windows.

Définir les ports

Pour définir les ports statd et nlockmgr, exécutez les commandes suivantes sur l'instance de VM cliente. Ces exemples utilisent l'éditeur de texte nano, mais vous pouvez opter pour n'importe quel éditeur. Ces exemples utilisent également 2046 comme port pour statd et 4045 comme port pour nlockmgr, car ces valeurs sont des choix courants. Vous pouvez utiliser différents ports en fonction de la configuration de votre réseau. Dans ce cas, les règles de pare-feu d'entrée doivent autoriser le trafic vers les ports spécifiques que vous utilisez.

Debian/Ubuntu

  • Définissez le port statd :

    1. Ouvrez le fichier /etc/default/nfs-common pour le modifier :

      sudo nano /etc/default/nfs-common
      
    2. Définissez l'option STATDOPTS :

      STATDOPTS="-p 2046"
      
    3. Enregistrez et fermez le fichier.

  • Définissez le port nlockmgr :

    1. Créez le fichier /etc/modprobe.d/lock.conf :

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Définissez les options nlm_tcpport et nlm_udpport :

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Enregistrez et fermez le fichier.

RHEL/CentOS

  • Définissez le port statd :

    1. Ouvrez le fichier /etc/sysconfig/nfs pour le modifier :

      sudo nano /etc/sysconfig/nfs
      
    2. Définissez l'option STATD_PORT :

      STATD_PORT=2046
      
    3. Enregistrez et fermez le fichier.

  • Définissez le port nlockmgr :

    1. Créez le fichier /etc/modprobe.d/lock.conf :

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Définissez les options nlm_tcpport et nlm_udpport :

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Enregistrez et fermez le fichier.

SUSE

Définissez les ports statd et nlockmgr :

  1. Ouvrez le fichier /etc/sysconfig/nfs pour le modifier :

    sudo nano /etc/sysconfig/nfs
    
  2. Définissez les options STATD_PORT, LOCKD_TCPPORT et LOCKD_UDPPORT :

    STATD_PORT=2046
    LOCKD_TCPPORT=4045
    LOCKD_UDPPORT=4045
    
  3. Enregistrez et fermez le fichier.

Windows

Il n'est pas nécessaire de définir des ports NFS sous Windows.

Vérifier que les ports sont ouverts

Pour vérifier que les ports NFS ont bien été ouverts, procédez comme suit.

  1. Installez les dépendances suivantes.

    Debian/Ubuntu

    Dans la ligne de commande, saisissez la commande suivante:

    sudo apt install nfs-common tcpdump tshark
    

    RHEL/CentOS

    Dans la ligne de commande, saisissez la commande suivante:

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    Dans la ligne de commande, saisissez la commande suivante:

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Ce processus de validation n'est pas compatible avec Windows.

  2. Créez un fichier de script appelé verify-nfs-port-script.sh, copiez-y et collez-y le script suivant, puis enregistrez-le localement sur votre machine. Notez l'emplacement du fichier et enregistrez-le pour l'étape suivante.

    #!/bin/bash
    
    # This script is intended to run on client machines to verify that the ports
    # are properly open to allow the reception of NLM GRANT messages from the server.
    
    set -eu
    
    function kill_descendants() {
       for pid in $(ps -o pid= --ppid "$1")
       do
       kill_descendants "$pid"
       done
       if [[ $1 -ne $$ ]]; then
       kill "$1" 2>/dev/null | true
       fi
    }
    
    function cleanup {
       set +eu
    
       # Kill all background jobs and wait for it to end, makes sure locks are released
       kill_descendants $$
    
       # Wait for jobs to die and locks to be released, so mount is not busy
       sleep 2
    
       umount -f "$MNT1"
       umount -f "$MNT2"
    
       rmdir "$MNT1" 2&> /dev/null || true
       rmdir "$MNT2" 2&> /dev/null || true
    }
    
    function print_help {
       echo "$0 [server_ip] [mount_path]"
       echo -e "\t For example, if you mount a server using:"
       echo -e "\t\t \"mount 10.0.0.1:share /mnt/mount_point\""
       echo -e "\t Run the script: "
       echo -e "\t\t \"$0 10.0.0.1 share\""
    }
    
    if [ $# -ne 2 ]; then
       print_help
       exit 1
    fi
    
    if [ $(id -u) -ne 0 ]; then
       echo "Failure! This script needs to run as root, use \"sudo $@\""
       exit 1
    fi
    
    if ! [ -x "$(command -v tshark)" ]; then
       echo "The 'tshark' command does not exist and is needed for the script. Please install it"
       exit 1
    fi
    
    if ! [ -x "$(command -v tcpdump)" ]; then
       echo "The 'tcpdump' command does not exist and is needed for the script. Please install it"
       exit 1
    fi
    
    SERVER_IP=$1
    MOUNT_PATH=$2
    
    MNT1=$(mktemp -d)
    MNT2=$(mktemp -d)
    
    trap cleanup EXIT
    
    echo "Mounting..."
    mount -o nosharecache "$SERVER_IP":"$MOUNT_PATH" "$MNT1"
    mount -o nosharecache "$SERVER_IP":"$MOUNT_PATH" "$MNT2"
    
    REC_FILE=$(mktemp /tmp/nlm_recording_XXXXXXXX.pcap)
    tcpdump -i any -s0 -w "$REC_FILE" "host $SERVER_IP" &
    TCPDUMP_PID=$!
    echo "Recording TCP dump to $REC_FILE"
    
    sleep 5 # wait for tcpdump to start running
    
    echo "Running test..."
    flock "$MNT1"/lock_file -c "echo -n \"Got first lock: \" && date && sleep 5 && echo -n \"Releasing first lock: \" && date" &
    sleep 2 # Wait for the first lock to actually be taken
    
    echo "Waiting for second lock: $(date)"
    flock "$MNT2"/lock_file -c "echo -n \"Got second lock: \" && date"
    
    sleep 2 # Wait for tcpdump to record everything
    kill $TCPDUMP_PID
    
    # For quick analysis inspect recording with tshark, if you don't have it just inspect with Wireshark
    echo "Inspecting results in $REC_FILE with TShark"
    tshark -r "$REC_FILE" -Y nlm # First, print the output
    
    tshark -r "$REC_FILE" -Y nlm 2>/dev/null | grep -q GRANTED
    EXIT_CODE=0
    if [ $? -eq 0 ]; then
       echo "The NLM GRANT message is working properly!"
       EXIT_CODE=0
    else
    echo "The NLM GRANT message is not working properly!"
    EXIT_CODE=1
    fi
    echo "For debugging, please provide the printed output of the script, and $REC_FILE"
    exit ${EXIT_CODE}
    
  3. Saisissez la commande suivante :

    chmod +x SCRIPT_PATH
    

    Remplacez les éléments suivants :

    • SCRIPT_PATH: chemin d'accès au fichier de script. Cette commande doit être exécutée en tant qu'utilisateur racine. Sinon, ajoutez sudo au début de la commande.
  4. Saisissez la commande suivante :

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Remplacez les éléments suivants :

    • SCRIPT_PATH: chemin d'accès au fichier de script. Cette commande doit être exécutée en tant qu'utilisateur racine. Sinon, ajoutez sudo au début de la commande.
    • INSTANCE_IP: adresse IP de l'instance Filestore
    • SHARE_NAME: nom du partage de fichiers

    Si le port est ouvert, le script renvoie la réponse suivante:

    The NLM GRANT message is working properly!
    

    Si le port n'est pas ouvert, le script renvoie l'erreur suivante:

    The NLM GRANT message is not working properly!
    

Étape suivante