FTP

Aus Freifunk Leipzig
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Installation FTP-Server (und Portforwarding vom Router zum FTP-Server)

Download FTP-Server: http://www.guildftpd.com/

Installieren auf Windows-PC (z.Bsp.192.168.1.11) und Verzeichnis für FTP-Freigabe einrichten.

FTP-Server starten

ftp://192.168.1.11 sollte lokal jetzt klappen

In GuildFTPd noch Port angegeben unter Admin/Options/Advanced settings:

passiv Mode =enable
real IP Adress=104.61.114.1
Port range= 20000 bis 20010
(Bsp: FTP-Server auf PC 192.168.1.11 der am WRT 104.61.114.1 am LAN angeschlossen ist)

Internet Explorer evtl. erweiterte Einstellung ändern (aktivieren):

Ordneransicht für FTP-Sites aktivieren
Passives FTP verwenden (geht erst ab Version 6.0, läßt sich bei Netscape nicht einstellen!)

Portforwarding vom Router auf den Server

iptables -t nat -A PREROUTING -d 104.61.114.1 -p tcp --dport 21 -j DNAT --to-destination 192.168.1.11:21
iptables -t nat -A PREROUTING -d 104.61.114.1 -p tcp --dport 20000:20020 -j DNAT --to-destination 192.168.1.11

Damit funktioniert auf alle Fälle im FF der InternetExplorer und Windows-Commander und auch auf dem WRT z.Bsp: ipkg install ftp://104.61.114.1/Daten/Freifunk/probe-response-fix_0.1_mipsel.ipk sauber. Im LAN nur mit ftp://192.168.1.11 aufrufbar!

Im Internetexplorer funktioniert FTP immer, wenn passiv FTP aktiviert ist (geht erst ab Version 6.0). Getestet ist dies mit ausgeschalteter Firewall und NAT an auf dem WRT und aktivierter Firewall (Zonealarm) auf dem Windows-PC!

Löcher für die FTP-Ports in die Firewall bohren

wenn Firewall auf Node am LAN aktiviert ist fehlt dann noch:

iptables -I FORWARD -p tcp -d 192.168.1.11 --dport 21 -j ACCEPT
iptables -I FORWARD -p tcp -d 192.168.1.11 --dport 20000:20020 -j ACCEPT

automatisierte Variante

jede FTP-Session braucht mindestens 2 Ports - einen für die Kommandos und einen für die Datenübertragung

eine schöne animierte Grafik zum Unterschied in der Funktionsweise zwischen aktivem und passivem FTP gibt es hier

  • die einfachste Variante: (hab ich aber nicht probiert)
    • ipkg install freifunk-portfw-de
    • und dann die Ports 21 und - beispielsweise - die Ports 20000-20200 per Webinterface freigeben

wichtig ist nur: es sollten mehrere Ports sein (200 hier im Beispiel)

diese müssen oberhalb von 1023 liegen

Ich hab hier pure-ftpd auf dem Laptop installiert, um das zu probieren.
Die vom Router weitergeleiteten Daten-Ports (20000-20500) sollen genau so in der Server-Konfiguration eingetragen werden, sonst kann es passieren, daß der Server einen Port anfordert, der vom Router gar nicht weitergeleitet wird - und dann gehts natürlich nicht.
Die Konfiguration geht bei jedem Server etwas anders, deshalb erstmal nichts konkretes. (wenn jemand pure-ftpd installieren will und nicht klarkommt, kann ich das noch detailliert beschreiben)

pure-ftpd antwortet auf das PASV Kommando mit seiner wirklichen IP (d.h. der IP des Servers), was zur Folge hat, daß man im FTP-Client die Option "PASV Antwort ignorieren" aktivieren muß, damit eine Verbindung zustande kommt. Man kann also z.B. nicht den Webbrowser verwenden kann um den Inhalt des Servers anzusehen, da man dem Browser dieses Verhalten nicht beibringen kann. Per Browser bekommt man entweder gar keine Verbindung oder Fehlermeldungen beim navigieren im Server :( Es gibt aber Server, die die PASV Antwort faken können - mit denen mag es leichter sein.

Mit einem ordentlichen FTP-Client ist es aber kein Problem.


nun meine Variante:

Ich hab ein Script geschrieben, welches bei jedem Start des Routers dafür sorgt, daß die Portweiterleitung eingerichtet wird.

Der Name des Scripts ist nicht wichtig. Wichtig ist aber:

  • daß er mit Sxx... (xx beliebige Nummer) beginnt,
  • daß sich das Script in /etc/init.d/ befindet und
  • daß es ausführbar ist,

denn nur solche Scripte werden vom init-Programm automatisch und der Reihe nach (von niedrigen zu hohen Nummern) abgearbeitet.

Ich hab es aus offensichtlichen Gründen S98portforward genannt, die 98 wählte ich, weil das Script erst nach allen anderen ausgeführt werden sollte.

  • Vorgehensweise:
    • Script anpassen - Nodeadresse, Serveradresse, Ports
    • Script auf den Router ins Verzeichnis /etc/init.d/ kopieren:
      • für Linux mit dem Kommando: scp S98portforward root@192.168.1.1:/etc/init.d/S98portforward
      • für Windows z.B. mittels WinSCP - mit dem scp, was bei PuTTY mit dabei ist, gehts auch
    • ausführbar machen, wenn es nicht schon ausführbar war: chmod +x /etc/init.d/S98portforward
      • dafür muß man natürlich auf dem Router eingeloggt sein
      • WinSCP ermöglicht das auch - über: Kontextmenü --> Properties oder F9 (X steht für eXecute...)
    • starten des Scripts: /etc/init.d/S98portforward start
      • per WinSCP kann man zwar was ausführen, doch das Script braucht einen Startparameter und einen Pfad, damit ist WinSCP dann doch überfordert und man wird sich doch auf dem Node einloggen müssen, um das zu tun...

oder Neustart des Nodes - ist aber unnötig

#!/bin/sh

# Variable fuer die Adresse des Nodes
node_adresse="104.61.112.2"

# Variable fuer IP-Adresse des FTP-Servers
server_adresse="192.168.1.13"

# Variable fuer FTP-Control-Port
ftp_port="21"

# Variable fuer FTP-Data-Ports
ftp_data_ports="20000:20500"

# Variable fuer VNC-Port
vnc_port="5900"

werte_einsetzen () {
	iptables -t nat $append PREROUTING -d $node_adresse -p tcp --dport $ftp_port -j DNAT --to-destination $server_adresse
	iptables -t nat $append PREROUTING -d $node_adresse -p tcp --dport $ftp_data_ports -j DNAT --to-destination $server_adresse
#	iptables -t nat $append PREROUTING -d $node_adresse -p tcp --dport $vnc_port -j DNAT --to-destination $server_adresse

	iptables $insert FORWARD -d $server_adresse -p tcp --dport $ftp_port -j ACCEPT
	iptables $insert FORWARD -d $server_adresse -p tcp --dport $ftp_data_ports -j ACCEPT
#	iptables $insert FORWARD -d $server_adresse -p tcp --dport $vnc_port -j ACCEPT
}

# hier werden die Parameter -A und -I fuer "start" oder -D fuer "stop"gesetzt
# eine Statusmeldung ausgegeben
# und dann entsprechend in die Funktion eingesetzt und ausgeführt

case $1 in
	start)
		append="-A"
		insert="-I"
		echo "richte Portweiterleitung fuer $vnc_port $ftp_port und $ftp_data_ports von $node_adresse an $server_adresse ein"
		werte_einsetzen
	;;
	stop)
		append="-D"
		insert="-D"
		echo "Portweiterleitung fuer $vnc_port $ftp_port und $ftp_data_ports von $node_adresse an $server_adresse wird deaktiviert"
		werte_einsetzen
	;;
	*)
		echo "Benutzung: $0 start|stop"
	;;
esac

Im Script ist auch noch der Port 5900 für VNC enthalten, aber auskommentiert.
Wers braucht kann das # in den entsprechenden zwei Zeilen entfernen, dann ist auch das weitergeleitet.

Kontrolle, ob es korrekt funktioniert:

  • iptables -L FORWARD
  • iptables -t nat -L PREROUTING

damit bekommt man dann die im Script freigegebenen Ports und IP-Adressen aufgelistet.