Configura puertos NFS en las VMs del cliente

En esta página, se muestra cómo configurar los puertos para los daemons statd y nlockmgr en las VM de cliente a fin de facilitar la configuración de firewall.

Filestore usa los daemons nlockmgr y statd para habilitar el bloqueo de archivos. Los puertos de estos servicios deben estar expuestos de forma correcta en las VM de cliente a través de reglas de firewall para que los clientes puedan usar los bloqueos de forma adecuada. Recomendamos configurar los puertos statd y nlockmgr para que sean coherentes en todas las VM cliente, lo que facilita la configuración de las reglas de firewall de entrada.

Para obtener más información sobre si se necesita configurar reglas de firewall en la red de VPC, consulta Configura reglas de firewall.

Verifica la configuración de los puertos

Para verificar qué valores están configurados los puertos statd y nlockmgr, ejecuta los siguientes comandos en la instancia de VM del cliente. Si los archivos no existen, o si las opciones no tienen valores, entonces los puertos no están configurados. En ese caso, los daemons se asignan de forma dinámica a puertos arbitrarios disponibles.

Debian/Ubuntu

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

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

    cat /etc/modprobe.d/lock.conf
    

RHEL y CentOS

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

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

    cat /etc/modprobe.d/lock.conf
    

SUSE

Ejecuta el siguiente comando:

cat /etc/sysconfig/nfs

El puerto statd aparece en STATD_PORT y el puerto nlockmgr aparece en LOCKD_TCPPORT y LOCKD_UDPPORT.

Windows

No es necesario configurar puertos NFS en Windows.

Configura los puertos

Para configurar los puertos statd y nlockmgr, ejecuta los siguientes comandos en la instancia de VM del cliente. En estos ejemplos se usan el editor de texto nano, pero puedes usar el que desees. En estos ejemplos, también se usa 2046 como el puerto para statd y 4045 como el puerto para nlockmgr, ya que estos valores son opciones comunes. Puedes usar diferentes puertos según la configuración de tu red. En este caso, las reglas de firewall de entrada deben permitir el tráfico a los puertos específicos que uses.

Debian/Ubuntu

  • Configure el puerto statd:

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

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

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

  • Configure el puerto nlockmgr:

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

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

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

RHEL y CentOS

  • Configure el puerto statd:

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

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

      STATD_PORT=2046
      
    3. Guarda el archivo y cierra.

  • Configure el puerto nlockmgr:

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

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

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

SUSE

Configura los puertos statd y nlockmgr:

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

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

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

Windows

No es necesario configurar puertos NFS en Windows.

Verifica que los puertos estén abiertos

Para verificar que los puertos NFS se hayan abierto correctamente, completa los siguientes pasos.

  1. Instala las siguientes dependencias.

    Debian/Ubuntu

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

    sudo apt install nfs-common tcpdump tshark
    

    RHEL y CentOS

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

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

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

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Este proceso de verificación no se admite 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árdala de forma local en tu máquina. Anota la ubicación del archivo y guárdalo para el siguiente paso.

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

    chmod +x SCRIPT_PATH
    

    Reemplaza lo siguiente:

    • SCRIPT_PATH: Es la ruta de acceso donde se encuentra el archivo de secuencia de comandos. ubicado. Se debe ejecutar como raíz. De lo contrario, agrega sudo al comienzo del comando.
  4. Ingresa el siguiente comando:

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Reemplaza lo siguiente:

    • SCRIPT_PATH: Es la ruta de acceso en la que se encuentra el archivo de secuencia de comandos. Esto se debe ejecutar como raíz; de lo contrario, agrega sudo al principio del comando.
    • INSTANCE_IP: La dirección IP de la instancia de Filestore
    • SHARE_NAME: Es el nombre del archivo compartido.

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

    The NLM GRANT message is working properly!
    

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

    The NLM GRANT message is not working properly!
    

¿Qué sigue?