Configurar portas NFS em VMs cliente

Veja nesta página como definir as portas para os daemons statd e nlockmgr nas VMs do cliente para facilitar a configuração do firewall.

O Filestore usa os daemons nlockmgr e statd para ativar o bloqueio de arquivos. As portas desses serviços precisam ser devidamente expostas nas VMs do cliente por meio das regras de firewall para que os clientes possam usar os bloqueios corretamente. Recomendamos definir as portas statd e nlockmgr para que sejam consistentes em todas as VMs do cliente, facilitando a configuração das regras de firewall de entrada.

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

Verificar as configurações da porta

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

Debian/Ubuntu

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

    cat /etc/default/nfs-common
    
  2. Para determinar a porta nlockmgr, execute o seguinte comando e observe 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 observe o valor STATD_PORT:

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

    cat /etc/modprobe.d/lock.conf
    

SUSE

Execute este comando:

cat /etc/sysconfig/nfs

A porta statd está listada em STATD_PORT, e a porta nlockmgr está listada em LOCKD_TCPPORT e LOCKD_UDPPORT.

Windows

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

Definir portas

Para definir as portas statd e nlockmgr, execute os seguintes comandos na instância de VM do cliente. Nestes exemplos, usamos o editor de texto nano mas é possível usar qualquer outro. Nos exemplos, também usamos 2046 como a porta para statd e 4045 como a porta para nlockmgr porque são as opções comuns. É possível usar portas diferentes com base na configuração de rede. Neste caso, as regras de firewall de entrada precisam permitir o tráfego para as portas específicas que você usa.

Debian/Ubuntu

  • Defina a porta statd:

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

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

      STATDOPTS="-p 2046"
      
    3. Salve o arquivo e saia.

  • Defina a porta nlockmgr:

    1. Crie o arquivo /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. Salve o arquivo e saia.

RHEL/CentOS

  • Defina a porta statd:

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

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

      STATD_PORT=2046
      
    3. Salve o arquivo e saia.

  • Defina a porta nlockmgr:

    1. Crie o arquivo /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. Salve o arquivo e saia.

SUSE

Defina as portas statd e nlockmgr:

  1. Abra o arquivo /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. Salve o arquivo e saia.

Windows

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

Verificar se as portas estão abertas

Para verificar se as portas NFS foram abertas corretamente, siga estas etapas.

  1. Instale as dependências a seguir.

    Debian/Ubuntu

    Na linha de comando, insira o seguinte comando:

    sudo apt install nfs-common tcpdump tshark
    

    RHEL/CentOS

    Na linha de comando, insira o seguinte comando:

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    Na linha de comando, insira o seguinte comando:

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Esse processo de verificação não é compatível com o Windows.

  2. Crie um arquivo de script chamado verify-nfs-port-script.sh, copie e cole o script a seguir nele e salve-o localmente na sua máquina. Anote o local do arquivo e salve-o para a próxima etapa.

    #!/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. Digite este comando:

    chmod +x SCRIPT_PATH
    

    Substitua:

    • SCRIPT_PATH: o caminho em que o arquivo de script está localizado. Ele precisa ser executado como raiz. Caso contrário, adicione sudo ao início do comando.
  4. Digite este comando:

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Substitua:

    • SCRIPT_PATH: o caminho em que o arquivo de script está localizado. Ele precisa ser executado como raiz. 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 do compartilhamento de arquivos

    Se a porta estiver aberta, o script vai retornar a seguinte resposta:

    The NLM GRANT message is working properly!
    

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

    The NLM GRANT message is not working properly!
    

A seguir