PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : FTP-Server, PASV-Modus und akt. IP hinter NAT



ChieFi
19.03.04, 20:21
Ich möchte gerne einen FTP-Server einrichten, der neben dem Active-Mode auch den Passive-Mode (PASV) wie gewollt umsetzt. Als Server kommt WSFTP zum Einsatz, welcher bereits witestgehend konfiguriert wurde, ausser einer gewissen Kleinigkeit, auf welche ich nachfolgend eingehen möchte.

Arbeitet ein FTP-Server PASV, so stellt nicht er die Verbindung zum Klienten her, sondern übermittelt dem Klienten einen Socket, also eine Kombination aus IP-Adresse und Server. Der Klient verwendet dann diese Daten, um seinerseits auf diese Daten zu connecten. Das würde auch bestens funktionieren, würde vor dem Server nicht ein Router hängen, der NAT aktiviert hat. Einen korrekten Port zu übermitteln ist das kleinste Problem. Dazu habe ich dem FTP-Server eine Port-Range (55000-55015) vergeben, aus der er sich bedienen kann. Diese Port-Range habe ich dann im Router als "VirtualServer" so gemappt, dass alle Anfragen auf diese Ports eben am FTP-Server (genauer dem Rechner im LAN) landen. Ich habe dies auch überprüft - die Vergabe läuft korrekt ab:

Klient sendet PASV-Kommando -> WSFTP reagiert mit einer Bestätigung in Form eines Sockets aus IP (4 Byte) und Port (2 Byte). Z.B.:

227 Entering Passive Mode (xxx,xxx,xxx,xxx,214,218)

wobei xxx die IP ersetzt, womit es zur Zeit eben noch Probleme gibt. Errechnet man den Port von diesem Beispiel, so kommt man auf einen Port aus der gewünschten Range (214*256+218 = 55002). Dies funktioniert also bestens.

ZUM PROBLEM:
----------------------------
Wie gezeigt muss auch die aktuelle WAN-IP übermittelt werden auf die sich der Klient dann connecten kann. WSFTP ist diese IP aber nun, aufgrund des Routers (genauer der NAT), unbekannt.
Zur Lösung des Problems gäbe es nun eine Möglichkeit. Die Adresse, welche per PASV übermittelt wird, lässt sich explizit in der wsftp.conf über die Variable "pasv_address" festlegen. Also würde es reichen, die WAN-IP hier in der Variablen einzutragen. Der FTP-Server wäre nun auch passive verfügbar, allerdings wohl nur max. 24h, denn dann steht der Disconnect an und damit verbunden ein IP-Wechsel (zumindest in 30% der Fälle). Wie kann ich nun also erreichen, dass in der Variablen pasv_address immer die aktuelle WAN-IP steht ?

Meine Idee in dieser Richtung war, das Ganze per "statischem Hostnamen" zu lösen. Ich besitze einen dyndns.org-Account, welcher die aktuelle WAN-IP immer dem festen Hostnamen angleicht. Das Ganze erledigt der Router beim Verbinden - man kann diesen Hostnamen also wirklich als festen Zeiger auf meinen Router deuten, der immer auf die korrekte WAN-IP verweist. Ich müsste nun irgendwie die IP des Hostnamens abfragen (z.B. per nslookup mit set type=A) und diese IP-Adresse in die wsftp.conf transferien. Und genau da weiß ich nicht, wo ich anfangen soll. Es stellen sich mir schon so einige Fragen (mal eine davon):

- Versteht die wsftp.conf Bash-Variablen der Form $VARABLE auszulesen ? (dann könnte man das Abfrage-Ergebnis einfach in einer Variable storen usw...
......

Leider bin ich noch nicht sehr bewandert im Skripten unter der Bash. Vielleicht hat ja schon jemand so ein Skript gebastelt und könnte mir damit aus der Patsche helfen. Ansonsten bin ich aber für jede Idee dankbar, die mich weiterbringt. Ich fasse nochmal zusammen:

- WSFTP braucht für den PASV-Modus die aktuelle WAN-IP
- NAT verhindert die Weitergabe der WAN-IP, da WAN-IP durch LAN-IP ersetzt wird
- WAN-IP soll also über Hostnamen (dyndns.org) erfolgen, der immer die korrekte WAN-IP vorhält (Router sorgt dafür)
- abgefragte WAN-IP muss irgendwie in die wsftpd.conf (in "pasv_address")