NFS-Ports auf Client-VMs konfigurieren

Auf dieser Seite wird gezeigt, wie Sie die Ports der statd- und nlockmgr-Daemons auf Ihren Client-VMs festlegen, um die Firewallkonfiguration zu vereinfachen.

Filestore verwendet die Daemons nlockmgr und statd, um die Dateisperre zu aktivieren. Die Ports für diese Dienste müssen in den Client-VMs ordnungsgemäß über die Firewallregeln freigegeben sein, damit Clients ordnungsgemäß Sperren verwenden können. Wir empfehlen, die Ports statd und nlockmgr so festzulegen, dass sie auf allen Client-VMs konsistent sind, um das Konfigurieren von Firewallregeln für eingehenden Traffic zu vereinfachen.

Weitere Informationen dazu, wie Sie ermitteln, ob Sie eine Firewallregel für das VPC-Netzwerk konfigurieren müssen, finden Sie unter Firewallregeln konfigurieren.

Porteinstellungen prüfen

Führen Sie die folgenden Befehle auf der Client-VM-Instanz aus, um zu prüfen, auf welche Werte die Ports statd und nlockmgr derzeit gesetzt sind. Wenn die Dateien nicht vorhanden sind oder die Optionen keine Werte haben, sind die Ports nicht festgelegt. In diesem Fall werden die Daemons beliebigen verfügbaren Ports dynamisch zugewiesen.

Debian/Ubuntu

  1. Um den statd-Port zu ermitteln, führen Sie den folgenden Befehl aus und sehen Sie sich den Wert STATDOPTS an:

    cat /etc/default/nfs-common
    
  2. Um den nlockmgr-Port zu ermitteln, führen Sie den folgenden Befehl aus und sehen Sie sich die Werte nlm_tcpport und nlm_udpport an:

    cat /etc/modprobe.d/lock.conf
    

RHEL/CentOS

  1. Um den statd-Port zu ermitteln, führen Sie den folgenden Befehl aus und sehen Sie sich den Wert STATD_PORT an:

    cat /etc/sysconfig/nfs
    
  2. Um den nlockmgr-Port zu ermitteln, führen Sie den folgenden Befehl aus und sehen Sie sich die Werte nlm_tcpport und nlm_udpport an:

    cat /etc/modprobe.d/lock.conf
    

SUSE

Führen Sie diesen Befehl aus:

cat /etc/sysconfig/nfs

Der Port statd wird unter STATD_PORT und der Port nlockmgr unter LOCKD_TCPPORT und LOCKD_UDPPORT aufgelistet.

Windows

Das Festlegen von NFS-Ports ist unter Windows nicht erforderlich.

Ports festlegen

Führen Sie die folgenden Befehle auf der Client-VM-Instanz aus, um die Ports statd und nlockmgr festzulegen. In diesen Beispielen wird der Texteditor nano verwendet. Sie können aber auch einen beliebigen anderen Texteditor nutzen. In diesen Beispielen wird 2046 als Port für statd und 4045 als Port für nlockmgr verwendet, da dies gängige Optionen sind. Sie können je nach Netzwerkkonfiguration andere Ports verwenden. In diesem Fall müssen die Firewallregeln für eingehenden Traffic zu den von Ihnen verwendeten Ports zulassen.

Debian/Ubuntu

  • Stellen Sie den statd-Port ein:

    1. Öffnen Sie die Datei /etc/default/nfs-common zur Bearbeitung.

      sudo nano /etc/default/nfs-common
      
    2. Legen Sie die Option STATDOPTS fest:

      STATDOPTS="-p 2046"
      
    3. Speichern Sie die Datei und schließen Sie sie.

  • Stellen Sie den nlockmgr-Port ein:

    1. Erstellen Sie die Datei /etc/modprobe.d/lock.conf.

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Legen Sie die Optionen nlm_tcpport und nlm_udpport fest:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Speichern Sie die Datei und schließen Sie sie.

RHEL/CentOS

  • Stellen Sie den statd-Port ein:

    1. Öffnen Sie die Datei /etc/sysconfig/nfs zur Bearbeitung.

      sudo nano /etc/sysconfig/nfs
      
    2. Legen Sie die Option STATD_PORT fest:

      STATD_PORT=2046
      
    3. Speichern Sie die Datei und schließen Sie sie.

  • Stellen Sie den nlockmgr-Port ein:

    1. Erstellen Sie die Datei /etc/modprobe.d/lock.conf.

      sudo nano /etc/modprobe.d/lock.conf
      
    2. Legen Sie die Optionen nlm_tcpport und nlm_udpport fest:

      options lockd nlm_tcpport=4045
      options lockd nlm_udpport=4045
      
    3. Speichern Sie die Datei und schließen Sie sie.

SUSE

Stellen Sie die Ports statd und nlockmgr ein:

  1. Öffnen Sie die Datei /etc/sysconfig/nfs zur Bearbeitung.

    sudo nano /etc/sysconfig/nfs
    
  2. Legen Sie die Optionen STATD_PORT, LOCKD_TCPPORT und LOCKD_UDPPORT fest:

    STATD_PORT=2046
    LOCKD_TCPPORT=4045
    LOCKD_UDPPORT=4045
    
  3. Speichern Sie die Datei und schließen Sie sie.

Windows

Das Festlegen von NFS-Ports ist unter Windows nicht erforderlich.

Prüfen, ob Ports geöffnet sind

Führen Sie die folgenden Schritte aus, um zu prüfen, ob NFS-Ports ordnungsgemäß geöffnet wurden.

  1. Installieren Sie die folgenden Abhängigkeiten.

    Debian/Ubuntu

    Geben Sie in der Befehlszeile den folgenden Befehl ein:

    sudo apt install nfs-common tcpdump tshark
    

    RHEL/CentOS

    Geben Sie in der Befehlszeile den folgenden Befehl ein:

    sudo yum install nfs-utils tcpdump wireshark
    

    SUSE

    Geben Sie in der Befehlszeile den folgenden Befehl ein:

    sudo zypper install nfs-client tcpdump wireshark
    

    Windows

    Dieser Bestätigungsvorgang wird unter Windows nicht unterstützt.

  2. Erstellen Sie eine Skriptdatei mit dem Namen verify-nfs-port-script.sh, kopieren Sie das folgende Skript, fügen Sie es darin ein und speichern Sie die Datei lokal auf Ihrem Computer. Notieren Sie sich den Speicherort der Datei und speichern Sie sie für den nächsten Schritt.

    #!/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. Geben Sie den folgenden Befehl ein:

    chmod +x SCRIPT_PATH
    

    Ersetzen Sie Folgendes:

    • SCRIPT_PATH ist der Pfad, in dem sich die Skriptdatei befindet. Dies sollte als Root ausgeführt werden. Andernfalls fügen Sie sudo am Anfang des Befehls hinzu.
  4. Geben Sie den folgenden Befehl ein:

    SCRIPT_PATH INSTANCE_IP SHARE_NAME
    

    Ersetzen Sie Folgendes:

    • SCRIPT_PATH ist der Pfad, in dem sich die Skriptdatei befindet. Dies sollte als Root ausgeführt werden. Andernfalls fügen Sie sudo am Anfang des Befehls hinzu.
    • INSTANCE_IP: die IP-Adresse der Filestore-Instanz
    • SHARE_NAME: der Name der Dateifreigabe

    Wenn der Port offen ist, gibt das Skript die folgende Antwort zurück:

    The NLM GRANT message is working properly!
    

    Wenn der Port nicht geöffnet ist, gibt das Skript den folgenden Fehler zurück:

    The NLM GRANT message is not working properly!
    

Nächste Schritte