[RESOLU]VSFTPD:Problème de timeout pour LIST

Salut à tous,

Config:
Je suis sous Etch avec VSFTPD.
Mon serveur dispose d’une IP publique et héberge un serveur FTP grâce à VSFTPD.

Parefeu:
VOici les règles de parefeu en vigueur sur la machine:

iptables -P INPUT DROP iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Or, lorsque je tente d’accéder à mon serveur FTP depuis l’extérieur, le listage est impossible: le client prend un timeout est s’arrête.

Voici les logs du client FileZilla:

Status: Connecting to 82.***.***.***... Status: Connected with 82.***.***.***. Waiting for welcome message... Response: 220 (vsFTPd 2.0.5) Command: USER ftpced Response: 331 Please specify the password. Command: PASS ****** Response: 230 Login successful. Command: SYST Response: 215 UNIX Type: L8 Command: FEAT Response: 211-Features: Response: EPRT Response: EPSV Response: MDTM Response: PASV Response: REST STREAM Response: SIZE Response: TVFS Response: 211 End Status: Connected Status: Retrieving directory listing... Command: PWD Response: 257 "/" Command: TYPE A Response: 200 Switching to ASCII mode. Command: PASV Response: 227 Entering Passive Mode (82,***,***,***,21,28) Command: LIST Error: Transfer channel can't be opened. Reason: Une tentative de connexion a échoué car le parti connecté n'a pas répondu convenablement au-delà d'une certaine durée ou une connexion établie a échoué car l'hôte de connexion n'a pas répondu. Error: Could not retrieve directory listing Command: TYPE I Status: Disconnected from server

Une idée ?
Merci

Soit tu utilise le conntrack ftp, soit tu fais du ftp ACTIF et non PASSIF.

=> CF protocole FTP.

Y’a pas le conntrack_ftp par défaut ?

A vu de nez tu utilises le FTP en mode passif, donc pas besoin de mettre dans tes règles iptables le port 20.

Le FTP passif fonctionne de la façon suivante :
http://smhteam.info/wiki/index.linux.php5?wiki=DiagrammesFtp cf schéma.

Tu définis ensuite dans ton fichier de configuration vsftpd.conf les port passifs sur lesquels le client va tenter de se connecter.

pasv_max_port=2020
pasv_min_port=2000
#pasv_address=ton_ip_publique

En supposant que tu ais un routeur et que ta machine soit derrière, il te faut faire le forwarding pour les ports passifs vers ton serveur FTP car c’est le client qui initie les connexions sur le data channel. De ce fait, il te faut aussi charger le module conntrack pour ftp. Suivant la version de ton noyau, c’est nf_conntrack_ftp ou ip_conntrack_ftp. Puisque tu utilises le port 21 pour le control channel, pas besoin de le préciser lors du chargement du module car c’est la valeur par défaut. Le module conntrack va permettre d’associer l’état RELATED pour le data channel, autrement ce serait un état NEW, et par conséquent ton firewall les bloquerait car tu n’es pas supposer les ouvrir sur ta machine pour cet état NEW justement.

Si une machine linux doit faire du NAT, il faut charger nf_nat_ftp ou ip_nat_ftp selon le noyau aussi.

L’option pasv_address ne devait pas être nécessaire si ta machine est derrière un routeur ou directement sur le modem. Le routeur DOIT normalement modifié directement l’adresse de ton serveur dans la requete PASV, remplacant ainsi ton adresse local par ton ip publique. C’est sur cette même ip que le client va tenter de se connecter pour initier le data channel.

Je viens de rajouter les 3 directives :

pasv_max_port=40000 pasv_min_port=50000 pasv_address=<mon ip wan>

La connection via FileZilla ne fonctionne toujours pas: plus exactement, le client ne reçoit jamais la réponse à la commande LIST.

J’ai fait le test avec un autre client ftp (le client ftp d’un autre serveur Linux).
A ma grande surprise, la connection via ce client console (le client ftp par defaut) à fonctionné.

J’essaie de déméler.

Le problème viendrait-il du fait que le client FileZilla est placé derrière un routeur NAT(donc IP privé sur la machine), et pas le client Linux (qui est directement en IP publique)…

J’avoue que j’ai du mal à tout comprendre !

Cela ne change rien de plus qu’auparavant. Mais tu ne nous en donnes pas plus sur la configuration de ton serveur :confused: As tu chargé le module conntrack qu’il te fallait ?
As tu forwadé les connexions clientes sur les ports 40000-50000 vers ton serveur si tu as un routeur ? As tu un routeur devant le serveur ?

Coté client, il faut autoriser les connexions sortantes pour le routeur vers les destinations des ports passifs de ton serveur FTP en plus, autrement cela ne fonctionnera pas.

Il faudrait vérifier que ton client tente de créer les connexions sur le data channel.
Tu peux les matcher facilement avec iptables sur ton serveur.

Un petit exemple :

iptables -A INPUT -p tcp -m multiport --dports 40000:50000 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 40000:50000 -m state --state RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 40000:50000 -m state  --state ESTABLISHED -j ACCEPT

Toutes les connexions sur les ports 40000 à 50000 seront acceptées peu importe l’état NEW, ESTABLISHED, RELATED (cf le lien que j’avais posté)

Si tu arrives à te connecter avec ces règles c’est déja un plus.
Dans ce cas, tu peux regarder si ton module conntrack fonctionne puisque si c’est le cas, les paquets acceptés devraient être dans l’état RELATED et ESTABLISHED.

Avec la commande suivante tu peux le mettre facilement en évidence :

iptables -L -v

Si les connexions tombent dans l’état NEW cela veut dire qu’i y a un souci du côté du suivi de connexion ftp. Ce pourrait être le cas si tu mentionnes ton adresse passive avec ton ip publique dans le fichier de configuration vsftpd.conf alors que tu as un routeur. Le module conntrack attendrait des connexions sur le data channel avec comme destination ton adresse publique, hors ton routeur change la destination des paquets par ton ip locale.

en coup de vent … heu, c’est pas bon d’avoir un passv min port supérieur au passv max port à mon avis …

[quote]pasv_max_port=40000 pasv_min_port=50000[/quote]
:unamused:

Ok, en rajoutant le suivi de connexion ftp, cela marche ok maintenant:

[code]root@toto:/etc/modprobe.d#modprobe ip_conntrack_ftp

root@toto:/etc/modprobe.d# lsmod|grep ftp
ip_conntrack_ftp 7196 0
ip_conntrack 48792 5 ip_conntrack_ftp,ipt_MASQUERADE,xt_state,iptable_nat,ip_nat[/code]

Pour info, le serveur FTP est situé sur la passerelle, donc directement sur le net.

Merci pour les conseils
:wink: