Configure portas NFS em VMs cliente

Esta página mostra como definir as portas para os daemons statd e nlockmgr nas VMs de cliente para facilitar a configuração da firewall.

O Filestore usa os daemons nlockmgr e statd para ativar o bloqueio de ficheiros. As portas destes serviços têm de ser expostas corretamente nas VMs de cliente através de regras de firewall para que os clientes possam usar bloqueios corretamente. Recomendamos que defina as portas statd e nlockmgr para que sejam consistentes em todas as VMs cliente, o que facilita a configuração das regras de firewall de entrada.

Para mais informações sobre como determinar se precisa de configurar uma regra de firewall para a rede da VPC, consulte o artigo Configurar regras de firewall.

Verifique as definições de portas

Para verificar a que valores as portas statd e nlockmgr estão atualmente definidas, execute os seguintes comandos na instância de VM do cliente. Se os ficheiros não existirem ou se as opções não tiverem valores, as portas não são definidas. Nesse caso, os daemons são atribuídos dinamicamente a portas disponíveis arbitrárias.

Debian/Ubuntu

  1. Para determinar a porta statd, execute o seguinte comando e consulte o valor STATDOPTS:

    cat /etc/default/nfs-common
    
  2. Para determinar a porta nlockmgr, execute o seguinte comando e consulte os valores nlm_tcpport e nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

RHEL/CentOS

  1. Para determinar a porta statd, execute o seguinte comando e consulte o valor STATD_PORT:

    cat /etc/sysconfig/nfs
    
  2. Para determinar a porta nlockmgr, execute o seguinte comando e consulte os valores nlm_tcpport e nlm_udpport:

    cat /etc/modprobe.d/lock.conf
    

SUSE

Execute o seguinte comando:

cat /etc/sysconfig/nfs

A porta statd é apresentada em STATD_PORT e a porta nlockmgr é apresentada em LOCKD_TCPPORT e LOCKD_UDPPORT.

Windows

Não é necessário definir portas NFS no Windows.

Defina portas

Para definir as portas statd e nlockmgr, execute os seguintes comandos na instância de VM do cliente. Estes exemplos usam o editor de texto nano, mas pode usar qualquer editor de texto. Estes exemplos também usam 2046 como a porta para statd e 4045 como a porta para nlockmgr porque estes valores são escolhas comuns. Pode usar portas diferentes com base na configuração da sua rede. Neste caso, as regras de firewall de entrada têm de permitir o tráfego para as portas específicas que usa.

Debian/Ubuntu

  • Defina a porta statd:

    1. Abra o ficheiro /etc/default/nfs-common para edição:

      sudo nano /etc/default/nfs-common
      
    2. Defina a opção STATDOPTS:

      STATDOPTS="-p 2046"
      
    3. Guarde o ficheiro e saia.

  • Defina a porta nlockmgr:

    1. Crie o ficheiro /etc/modprobe.d/lock.conf:

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Defina as opções nlm_tcpport e nlm_udpport:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Guarde o ficheiro e saia.

RHEL/CentOS

  • Defina a porta statd:

    1. Abra o ficheiro /etc/sysconfig/nfs para edição:

      sudo nano /etc/sysconfig/nfs
      
    2. Defina a opção STATD_PORT:

      STATD_PORT=2046
      
    3. Guarde o ficheiro e saia.

  • Defina a porta nlockmgr:

    1. Crie o ficheiro /etc/modprobe.d/lock.conf:

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Defina as opções nlm_tcpport e nlm_udpport:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Guarde o ficheiro e saia.

SUSE

Defina as portas statd e nlockmgr:

  1. Abra o ficheiro /etc/sysconfig/nfs para edição:

    sudo nano /etc/sysconfig/nfs
    
  2. Defina as opções STATD_PORT, LOCKD_TCPPORT e LOCKD_UDPPORT:

    STATD_PORT=2046
    LOCKD_TCPPORT=4045
    LOCKD_UDPPORT=4045
    
  3. Guarde o ficheiro e saia.

Windows

Não é necessário definir portas NFS no Windows.

Verifique se as portas estão abertas

Para verificar se as portas NFS foram abertas corretamente, conclua os seguintes passos.

  1. Instale as seguintes dependências.

    Debian/Ubuntu

    Na linha de comandos, introduza o seguinte comando:

    sudo apt install nfs-common tcpdump tshark
    

    RHEL/CentOS

    Na linha de comandos, introduza o seguinte comando:

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    Na linha de comandos, introduza o seguinte comando:

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Este processo de validação não é suportado no Windows.

  2. Crie um ficheiro de script denominado verify-nfs-port-script.sh, copie e cole o script seguinte no ficheiro e guarde-o localmente no seu computador. Tome nota da localização do ficheiro e guarde-o para o passo seguinte.

    #!/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. Introduza o seguinte comando:

    chmod +x SCRIPT_PATH
    

    Substitua o seguinte:

    • SCRIPT_PATH: o caminho onde o ficheiro de script está localizado. Este comando deve ser executado como root. Caso contrário, adicione sudo ao início do comando.
  4. Introduza o seguinte comando:

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Substitua o seguinte:

    • SCRIPT_PATH: o caminho onde o ficheiro de script está localizado. Este comando deve ser executado como root. Caso contrário, adicione sudo ao início do comando.
    • INSTANCE_IP: o endereço IP da instância do Filestore
    • SHARE_NAME: o nome da partilha de ficheiros

    Se a porta estiver aberta, o script devolve a seguinte resposta:

    The NLM GRANT message is working properly!
    

    Se a porta não estiver aberta, o script devolve o seguinte erro:

    The NLM GRANT message is not working properly!
    

O que se segue?