Thecus FTP und DynDNS

Ich habe mir nun für private Zwecke eine NAS von Thecus zugelegt. Es handelt sich um die N2520. Vorinstalliert ist dort Thecus OS 6.
Damit ich im Notfall auch "von außen" auf meine Daten zugreifen kann, habe ich den FTP-Server aktiviert. Soweit so ungut, denn funktionieren tut es nur in meinem eigenen Netzwerk.
Ein Zugriff von meinem Smartphone war zum Beispiel nicht mehr möglich.

Wie man das ändern kann, möchte ich hier erklären.

Das Problem

Der Hintergrund ist, dass der FTP-Server die interne IP-Adresse weiterreicht und nicht die externe, die vom Internet auch wirklich erreichbar ist.

Dafür bietet Thecus die Möglichkeit an, auch eine externe IP-Adresse anzugeben. Funktioniert auch, wenn da nicht die 24 Stunden Zwangstrennung mit samt neuer IP-Adressvergabe seitens des Providers wäre.

Leider ist es nicht möglich einen DNS Namen statt einer IP-Adresse in dieses Feld einzugeben. Das liegt nicht zwangsläufig an Thecus, sondern an "pure ftpd". Also der Dienst, der hinter der Weboberfläche für den FTP-Zugriff sorgt.
Es ist schlichtweg nicht möglich einen DNS-Namen dort anzugeben. Es werden nur reine IP-Adressen akzeptiert.

Das soll uns aber nicht weiter stören, denn wir können ja über SSH direkt in das Geschehen eingreifen.

 

Die Lösung ins ganz einfach. Ich habe ein Script gebastelt, welches überprüft, ob sich die IP-Adresse hinter dem DNS-Namen verändert hat.
Sollte sich diese IP-Adresse geändert haben, so wird dies in der Datenbank der NAS entsprechend geändert und der FTP-Server neugestartet.

Die Lösung

Erstellt eine neue Freigabe mit dem Namen "NAS".

Dort erstellt Ihr einen Ordner mit dem Namen "scripte" und in diesem den Ordner "dynDNS_FTP".

Hier erstellt Ihr nun folgende drei Dateien

  • dyndns_ftp.sh
  • dyndns_ftp.log
  • start_dyndns_ftp.sh
Getestet habe ich dieses Script auf meiner N2520 mit der Firmware OS6.build_205. Ich nehme an, dass sich beim FTP-Server, und an der Datenbank selbst, nichts ändern wird. Daher sollte es auch auf zukünftigen Versionen laufen.

Datei "dyndns_ftp.sh"

#!/bin/sh
#Version: 1.2
#Date: 2013/08/31

#With logging
LOGFILE="/raid0/data/NAS/scripte/dynDNS_FTP/dyndns_ftp.log"
#Without logging
#LOGFILE="/dev/null 2>&1"

#Time in seconds until the script recheck your ip-address
SLEEPCYCLE="1800"

#Your dynamic DNS name
DYNDNS="your.dns.com"


#DO NOT CHANGE ANYTHING BELOW THIS LINE#
#--------------------------------------#


LAST_KNOWN_IP="0.0.0.0"

DATABASE="/usr/bin/sqlite /etc/cfg/conf.db"



echo "$(date +%H:%M:%S' '%d.%m.%Y) STARTING SCRIPT" >> $LOGFILE
echo "------------------"  >> $LOGFILE


while ((1>=0))
    do
        CURRENT_IP=$(host $DYNDNS | awk '/^[[:alnum:].-]+ has address/ { print $4 }')
        while [ -z "$CURRENT_IP" ] ; do
            echo "$(date +%H:%M:%S' '%d.%m.%Y) invalid ip-address! retry..." >> $LOGFILE
            sleep 3
            CURRENT_IP=$(host $DYNDNS | awk '/^[[:alnum:].-]+ has address/ { print $4 }')
        done

        if [ "$LAST_KNOWN_IP" != "$CURRENT_IP" ] ; then
            echo "$(date +%H:%M:%S' '%d.%m.%Y) ip-address changed! stopping service..."  >> $LOGFILE
            /img/bin/rc/rc.ftpd stop > /dev/null 2>&1
            echo "$(date +%H:%M:%S' '%d.%m.%Y) modify database..."  >> $LOGFILE
            $DATABASE "update conf set v='"$CURRENT_IP"' where k='ftpd_passive_ip'"
            echo "$(date +%H:%M:%S' '%d.%m.%Y) restarting service..."  >> $LOGFILE
            /img/bin/rc/rc.ftpd start > /dev/null 2>&1
            echo "$(date +%H:%M:%S' '%d.%m.%Y) done!"  >> $LOGFILE
            echo "------------------"  >> $LOGFILE
            LAST_KNOWN_IP=$CURRENT_IP
        fi

        sleep $SLEEPCYCLE
       
    done

 

Das Script kann natürlich nach Euren Bedüfnissen angepasst werden. Was und wie erkläre ich in den nächsten Zeilen

 

LOGFILE="/raid0/data/NAS/scripte/dynDNS_FTP/dyndns_ftp.log"

Die Variable LOGFILE gibt den Pfad für das Logfile an. Solltet Ihr also einen anderen Pfad für das Script benutzt haben, solltet Ihr das hier entsprechend ändern.

Wichtig ist, dass der Pfad in den meisten Fällen mit "/raid0/data/" beginnt. Je nachdem ob Ihr mehrere RAIDs erstellt habt oder nicht. "NAS/scripte/dynDNS_FTP/" entspricht dann Eurer Freigabe sowie den darauf folgenden Ordnern.

Wenn Ihr kein Logfile wünscht, dann kommentiert Ihr die Zeile mit einem "#" am Anfang aus und entfernt das "#" vom zweiten Eintrag.

LOGFILE="/dev/null 2>&1"

 

Den Wert von SLEEPCYCLE könnt Ihr ebenfalls nach persönlichen Vorlieben anpassen. Der Wert gibt an, wie viel Zeit (in Sekunden) vergeht, bis erneut die IP-Adresse überprüft wird. Mir persönlich genügt jede Stunde.

SLEEPCYCLE="1800"

 

Bei DYNDNS muss natürlich Euer DNS-Name stehen, sonst macht das hier natürlich keinen Sinn.

DYNDNS="your.dns.com"

 

Automatisch starten

Das Script würde jetzt schon funktionieren, wenn Ihr Euch über SSH auf das Gerät einloggt und folgendes ausführt

/raid0/data/NAS/scripte/dynDNS_FTP/dyndns_ftp.sh&

 

Für einen automatischen Start beim Einschalten der Box muss aber noch einiges getan werden.

Zum aktuellen Zeitpunkt wurde die bekannte Mod "META" noch nicht für OS6 auf der N2520 angepasst. Ich habe diese modifiziert, damit sie lauffähig ist. Ich gebe dafür keine Garantie, aber bei mir funktioniert es.

 

 

Für dieses Modul benötigt Ihr ein kleines Startscript.

Startscript start_dyndns_ftp.sh

#!/bin/sh
#Version: 1.0
#Date: 2013/08/31

if [[ $1 == '' ]]; then
    echo 'use "'$0' start" to start this script'
            
elif [ $1 = 'start' ]; then
    /raid0/data/NAS/scripte/dynDNS_FTP/dyndns_ftp.sh&
fi

Achtet darauf, dass der Pfad, falls nötig, wieder angepasst werden muss und entfernt keinesfalls das "&" am Ende der Zeile.

Loggt Euch über SSH ein und führt folgenden Befehl aus

ln -s /raid0/data/NAS/scripte/dynDNS_FTP/start_dyndns_ftp.sh /raid0/data/module/META/system/etc/startup/start_dyndns_ftp.sh

Startet nun die Box neu oder führt folgenden Befehl aus

/raid0/data/module/META/system/etc/startup/start_dyndns_ftp.sh start

 

Wenn alles geklappt hat, sollte in etwa folgendes in der Datei dyndns_ftp.log stehen

17:38:17 01.09.2013 STARTING SCRIPT
------------------
17:38:18 01.09.2013 ip-address changed! stopping service...
17:38:18 01.09.2013 modify database...
17:38:18 01.09.2013 restarting service...
17:38:18 01.09.2013 done!
------------------

 

Leave a comment

You are commenting as guest.