ftplib: Portnummer zur Kommunikation?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Hallo zusammen,

EDIT: die Problemstellung hat sich etwas geändert, deshalb neuer/anderer Beitrag...

Ich versuche mich mit der ftplib. Leider klappt aber die Kommunikation mit dem FTP-Server nicht so richtig. Ich kann mich zwar erfolgreich einloggen, kann dann aber keine Daten zum Server senden bzw. von ihm entfangen.

Ich habe das Problem inzwischen auf meine Firewall eingegrenzt. Bei dieser ist konfiguriert, dass Daten über die Ports 20/21 laufen dürfen. Mein FTP-Programm (FileZilla) funktioniert auch, aber die Python ftplib mag nicht so recht. Bei folgendem Code erhalte ich NACH der Willkommensmeldung (diese wird angezeigt!) die Fehlermeldung "timed out":

Code: Alles auswählen

import ftplib

ftp = ftplib.FTP()
ftp.connect("host.de")
ftp.login("username", "passwd")

print ftp.getwelcome()
print ftp.retrlines('LIST')

ftp.quit()
Daher meine Frage: Welche Ports verwendet denn die ftplib zum Datenaustausch? Habe im Internet da nichts passendes gefunden...

Schon mal danke für eure Hilfe... :roll:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Normalerweise ist der FTP-Port 21. Ob die Verbindung funktioniert kannst du aber ganz einfach mit netcat prüfen, indem du dich "per Hand" zum Server verbindest - im Falle von FTP ist das ziemlich einfach. Ich habe erst heute wieder damit eine POP3-Verbindung debuggt, das Tool ist für solche Sachen sehr brauchbar.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

to.ni hat geschrieben:Ich habe das Problem inzwischen auf meine Firewall eingegrenzt. Bei dieser ist konfiguriert, dass Daten über die Ports 20/21 laufen dürfen. Mein FTP-Programm (FileZilla) funktioniert auch, aber die Python ftplib mag nicht so recht.
Hi to.ni!

Code: Alles auswählen

gps ~ # grep ftp /etc/services
ftp-data        20/tcp
ftp             21/tcp
tftp            69/udp
sftp            115/tcp
ftps-data       989/tcp                         # FTP over SSL (data)
ftps            990/tcp
venus-se        2431/udp                        # udp sftp side effect
codasrv-se      2433/udp                        # udp sftp side effect
frox            2121/tcp                        # frox: caching ftp proxy
zope-ftp        8021/tcp                        # zope management by ftp
gps ~ #
Port 21 wird auf jeden Fall gebraucht. Port 20 ist auch keine schlechte Idee, allerdings ist es so, dass sich FTP den Datenkanal auch dynamisch ausmachen kann. FileZilla ist normalerweise so eingestellt, dass es den "Passiven Modus" für den Datentransfer verwendet. Was eigentlich solchen Verbindungsschwierigkeiten entgegen wirken sollte.
In der Hilfe steht, dass Python seit Version 2.1 ebenfalls den "Passiven Modus" verwendet. ???
Probier doch mal aus, diesen Modus umzuschalten.

Code: Alles auswählen

ftp.set_debuglevel(2)
ftp.set_pasv(<True oder False>)
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Hi Gerold,

an der Firewall (respektive dem Router) sind die Ports 20/21 geöffnet.
Dass FTP auch über andere Ports kommuniziert ist mir auch noch irgendwie bekannt... wie gesagt, der Login funktioniert, aber Daten kommen halt keine durch.

Habe den passiv-Mode jetzt ohne erfolg getestet:

Code: Alles auswählen

ftp = ftplib.FTP()
ftp.connect("host", 21)
ftp.login("user", "passwd")

ftp.set_debuglevel(1)
ftp.set_pasv(True)
print ftp.getwelcome()

print ftp.retrlines('LIST')
ftp.quit()
Ergebnis:

Code: Alles auswählen

*welcome* '220 (vsFTPd 1.2.0)'
220 (vsFTPd 1.2.0)
*cmd* 'TYPE A'
*resp* '200 Switching to ASCII mode.'
*cmd* 'PASV'
*resp* '227 Entering Passive Mode (80,190,253,157,170,232)'

Traceback (most recent call last):
  File "D:\Eigene Dokumente\Projekte\Python\Tests\ftp.py", line 14, in -toplevel-
    print ftp.retrlines('LIST')
  File "C:\Programme\Python24\Lib\ftplib.py", line 396, in retrlines
    conn = self.transfercmd(cmd)
  File "C:\Programme\Python24\Lib\ftplib.py", line 345, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Programme\Python24\Lib\ftplib.py", line 324, in ntransfercmd
    conn.connect(sa)
  File "<string>", line 1, in connect
error: (10060, 'Operation timed out')
Werde jetzt mal an den FileZilla-Einstellungen rumprobieren... kann doch nicht sein! :wink:
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Ich nehme alles zurück, und behaupte das Gegenteil.

Habe in obigen Code einfach ein "False" für den passiv-Modus eingegeben. und alles funktioniert. Aber warum?

Also nochmal, Lösung:

Code: Alles auswählen

ftp.set_pasv(False)
und es gibt keine Probleme mit der Firewall...

Link zur erwähnten Dokumentation:
http://docs.python.org/lib/ftp-objects.html

thx tobi
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

to.ni hat geschrieben:Habe in obigen Code einfach ein "False" für den passiv-Modus eingegeben. und alles funktioniert. Aber warum?
Hi to.ni!

Wahrscheinlich hast du deine Firewall so konfiguriert, dass sie die Ports 20 und 21 in beide Richtungen durch lässt. Beim "Aktiven Modus" baut der FTP-Server eine Datenverbindung von Port 20 ausgehend zum Client auf.

Im "Passiven Modus" gibt der Server dem Client den Port an, zu dem sich der Client verbinden soll. Dabei ändert sich der Port, von dem aus sich der Client verbindet, ständig. Da dieser Port der Firewall nicht bekannt ist, lässt sie nichts durch.

Oft sind Firewalls so eingestellt, dass sie alle Verbindungen, die von "Innen" aufgebaut werden, nach "Außen" durchlassen. Diese Firewalls sind dann meist so eingestellt, dass sie keine Verbindungen von "Außen" nach "Innen" akzeptieren. In solchen Fällen ist der "Passive Modus" der Richtige. Wenn du aber Verbindungen "von Außen" zulässt (Port 20), aber dafür auch Verbindungen, "nach Außen" einschränkst, dann ist der "Aktive Modus" der Richtige für dich.

Bessere Infos darüber findest du z.B. hier:
- http://www.iss.net/security_center/advi ... efault.htm
- http://slacksite.com/other/ftp.html
- http://www.elektronik-kompendium.de/sit ... 902241.htm

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
to.ni
User
Beiträge: 24
Registriert: Dienstag 6. Januar 2004, 15:52

Hi Gerold,

merci für deine Antworten und die Links! Werde mir das nochmal zu Gemüte führen... :D

tobi
Antworten