Configurar puertos NFS en máquinas virtuales cliente

En esta página se explica cómo definir los puertos de los daemons statd y nlockmgr en tus VMs de cliente para facilitar la configuración del firewall.

Filestore usa los daemons nlockmgr y statd para habilitar el bloqueo de archivos. Los puertos de estos servicios deben exponerse correctamente en tus VMs de cliente mediante reglas de cortafuegos para que los clientes puedan usar los bloqueos correctamente. Te recomendamos que definas los puertos statd y nlockmgr para que sean coherentes en todas las VMs cliente, lo que facilitará la configuración de las reglas de firewall de entrada.

Para obtener más información sobre cómo determinar si necesitas configurar una regla de cortafuegos para la red de VPC, consulta Configurar reglas de cortafuegos.

Comprobar la configuración de los puertos

Para comprobar los valores que tienen asignados los puertos statd y nlockmgr, ejecuta los siguientes comandos en la instancia de VM cliente. Si los archivos no existen o si las opciones no tienen valores, los puertos no se definen. En ese caso, los daemons se asignan dinámicamente a puertos disponibles arbitrarios.

Debian o Ubuntu

  1. Para determinar el puerto statd, ejecuta el siguiente comando y consulta el valor STATDOPTS:

    cat /etc/default/nfs-common
    
  2. Para determinar el puerto de nlockmgr, ejecuta el siguiente comando y consulta los valores de nlm_tcpport y nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

RHEL/CentOS

  1. Para determinar el puerto statd, ejecuta el siguiente comando y consulta el valor STATD_PORT:

    cat /etc/sysconfig/nfs
    
  2. Para determinar el puerto de nlockmgr, ejecuta el siguiente comando y consulta los valores de nlm_tcpport y nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

SUSE

Ejecuta el siguiente comando:

cat /etc/sysconfig/nfs

El puerto statd se indica en STATD_PORT y el puerto nlockmgr en LOCKD_TCPPORT y LOCKD_UDPPORT.

Windows

No es necesario configurar los puertos de NFS en Windows.

Definir puertos

Para definir los puertos statd y nlockmgr, ejecuta los siguientes comandos en la instancia de VM cliente. En estos ejemplos se usa el editor de texto nano, pero puedes usar cualquier otro. En estos ejemplos también se usa 2046 como puerto de statd y 4045 como puerto de nlockmgr, ya que son valores habituales. Puedes usar diferentes puertos en función de la configuración de tu red. En este caso, las reglas de cortafuegos de entrada deben permitir el tráfico a los puertos específicos que utilices.

Debian o Ubuntu

  • Define el puerto statd:

    1. Abre el archivo /etc/default/nfs-common para editarlo:

      sudo nano /etc/default/nfs-common
      
    2. Selecciona la opción STATDOPTS:

      STATDOPTS="-p 2046"
      
    3. Guarda el archivo y sal.

  • Define el puerto nlockmgr:

    1. Crea el archivo /etc/modprobe.d/lock.conf:

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Configura las opciones nlm_tcpport y nlm_udpport:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Guarda el archivo y sal.

RHEL/CentOS

  • Define el puerto statd:

    1. Abre el archivo /etc/sysconfig/nfs para editarlo:

      sudo nano /etc/sysconfig/nfs
      
    2. Selecciona la opción STATD_PORT:

      STATD_PORT=2046
      
    3. Guarda el archivo y sal.

  • Define el puerto nlockmgr:

    1. Crea el archivo /etc/modprobe.d/lock.conf:

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Configura las opciones nlm_tcpport y nlm_udpport:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Guarda el archivo y sal.

SUSE

Define los puertos statd y nlockmgr:

  1. Abre el archivo /etc/sysconfig/nfs para editarlo:

    sudo nano /etc/sysconfig/nfs
    
  2. Configura las opciones STATD_PORT, LOCKD_TCPPORT y LOCKD_UDPPORT:

    STATD_PORT=2046
    LOCKD_TCPPORT=4045
    LOCKD_UDPPORT=4045
    
  3. Guarda el archivo y sal.

Windows

No es necesario configurar los puertos de NFS en Windows.

Verificar que los puertos estén abiertos

Para comprobar que los puertos NFS se han abierto correctamente, sigue estos pasos.

  1. Instala las siguientes dependencias.

    Debian o Ubuntu

    En la línea de comandos, introduce el siguiente comando:

    sudo apt install nfs-common tcpdump tshark
    

    RHEL/CentOS

    En la línea de comandos, introduce el siguiente comando:

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    En la línea de comandos, introduce el siguiente comando:

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Este proceso de verificación no está disponible en Windows.

  2. Crea un archivo de secuencia de comandos llamado verify-nfs-port-script.sh, copia y pega la siguiente secuencia de comandos en él y guárdalo localmente en tu máquina. Anota la ubicación del archivo y guárdala para el paso siguiente.

    #!/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. Introduce el siguiente comando:

    chmod +x SCRIPT_PATH
    

    Haz los cambios siguientes:

    • SCRIPT_PATH: la ruta donde se encuentra el archivo de secuencia de comandos. Debe ejecutarse como root. De lo contrario, añade sudo al principio del comando.
  4. Introduce el siguiente comando:

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Haz los cambios siguientes:

    • SCRIPT_PATH: la ruta donde se encuentra el archivo de secuencia de comandos. Debe ejecutarse como root. De lo contrario, añade sudo al principio del comando.
    • INSTANCE_IP: la dirección IP de la instancia de Filestore
    • SHARE_NAME: el nombre del recurso compartido de archivos

    Si el puerto está abierto, la secuencia de comandos devuelve la siguiente respuesta:

    The NLM GRANT message is working properly!
    

    Si el puerto no está abierto, la secuencia de comandos devuelve el siguiente error:

    The NLM GRANT message is not working properly!
    

Siguientes pasos