[resolu] ftp + iptables

Bonjour,

J’ai un pb pour configurer Iptables pour faire du FTP :

Le serveur FTP est sous linux qui accede a internet via LiveBox sur eth0.

Coté liveBox, je pense qu’elle est bien configurée. Je reroute les ports 20 et 21.

Par contre, je n’arrive pas à touver les règles à mettre en plus sur mon firewall sous linux.

en théorie, j’ai juste à faire ca :

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

merci pour le coup de main
kenavo !
Seb

hello,

Penche sur le ip_conntrack_ftp.

ok…vais faire mes recherches la dessus…je suppose que c’est un module du noyau à lancer…

Sinon, pour compléter mon premier post, voici l’erreur que j’obtiens via filezilla que je lance depuis mon reseau local :

500 Illegal PORT command.
Error: Could not retrieve directory listing

kenavo,
Seb

[quote=“stanguy”]

500 Illegal PORT command.[/quote]

La commande PORT est envoyé par le client vers le port 21 du serveur.

PORT 192,168,150,80,14,178

Ou 192.168.150.80 est l’adresse IP du client (enfin l’adresse IP interne du client, la seule que filezilla client connait) qui ouvre le port 14,178 (14256+178) local pour que le serveur s’y connecte (ftp actif). Le serveur, ex 192.168.150.90, se connecte alors de son port local 20 vers 192.168.150.80, port 14256+178.

serveur:20 —> client: 14*256+178

Ce qui peut déconner chez toi c’est que le client envoie son adresse IP interne (NATé ou masquaradé, depend de la terminlogie) au serveur. Or ce serveur est incapable de joindre cette adresse interne.

J’ai pas tres bien compris l’architecture reseau entre ton client ftp et servuer ftp mais pour remedier à ca, il faut que la commande PORT soit transformée pour que l’adresse IP interne du client se transforme en son adresse IP externe pour que le serveur FTP puisse la joindre.
En gros
soit dans filezilla client, tu fixe dans les preferences l’adresse a mettre dans la commande PORT en dur.
soit apres ton client filezilla, tu as un firewall linux et il faut en plus du module donné par stonfi, rajouter le module ip_nat_ftp

Des petits organigrammes en prime:
slacksite.com/other/ftp.html

edit: j’utilise pas iptables mais y a un truc qui m’etonne la:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

Le port 20 est le PORT SOURCE du serveur ftp en mode FTP actif pour le canal DATA
Le port 21 est le PORT DESTINATION du serveur ftp dans tous les modes, pour le canal COMMAND.
Bonne chance…

merci Boristhebutcher,
même en anglais, y déchire ce lien :wink:… ya juste un truc pas bien clair (pour l’intant dans mon esprit … humm), c’est : que signifie :

[quote]FTP server’s port 20 to ports > 1023[/quote]je veux dire qu’il faut ouvrir combien de ports à partir du port 1023 (exclu ?) ?

[quote=“usinagaz”]merci Boristhebutcher,
même en anglais, y déchire ce lien :wink:… ya juste un truc pas bien clair (pour l’intant dans mon esprit … humm), c’est : que signifie :

De rien!!
Ce lient est tres bien oui. Ca + la rfc 959 et tu connais le ftp sur le bout des doigts.
Mon explication par contre je sais pas si c’est tres clair :blush:

Après avoir compris le protocole ftp, je n’ai plu eu envie de l’utiliser, trop compliqué et son implémentation en suivant les standards est dangereuse.

Tu parles du ca:

Je reformule:
Au début il yavait le bigbang… Euh… nan

Le ftp marche avec 2 canaux :
->COMMANDE : Toujours (cad en mode actif ou passif) d’un port non privilégié (> 1023 pour qu’un user simple puisse ouvrir le port local) vers le port 21 sur le serveur.
Sur ce canal peut passer les commandes ftp client:
*LOGIN/PASS et son acceptation;
*PORT IP_LOCALE,PORT_LOCAL et son acceptation;
*PASV et réponse de PASV
*LIST,PUT,GET,BIN,ASCII
etc…
->DONNEES : Permet l’echange de données entre le port sur le serveur et le port sur le client. Ces ports doivent avoir été définis sur le canal COMMANDE par la commande PORT et “retour de PASV”. C’est pour ca que le FTP COMMANDE est TOUJOURS sur le port 21 sinon on ne saurait pas , a priori comment débuter cette négociation (il faut bien definir une convention qqpart)
Sur ce canal:
*Put vers le serveur.
*Get vers le client … ca parait logique hein :slightly_smiling:

J’en etais ou…

Initiation du canal commande du client vers le serveur:
* FTP server’s port 21 from anywhere (Client initiates connection)

Là c’est du tcp/ip normal, le serveur fait des acquitements TCP:
* FTP server’s port 21 to ports > 1023 (Server responds to client’s control port)

Là le client a envoyé au serveur:
* PORT 192,168,1,1,4,0
qui se traduit par:
* Eh mec, j’ouvre mon port 4*256+0=1024 (le port minimal que le client peut ouvrir, non priviligié), balourde la marchandise sur ce port. Si c’est pour un PUT alors c’est le client qui balourde (TCP est bi-directionnel)

Là le serveur peut etablir le canal data sur LE PORT DETERMINé par le client (*)
* FTP server’s port 20 to ports > 1023 (Server initiates data connection to client’s data port)

Là tcp/ip normal, acquitements:
* FTP server’s port 20 from ports > 1023 (Client sends ACKs to server’s data port)

(*) Donc en ftp actif, il faut ouvrir 1 seul port sur le client.
Pour cela,

  1. methode pas sécure: j’ai un firewall en carton qui ne sait pas lire la tramme applicative “PORT ip,port” alors je suis obligé d’ouvrir tous les ports sur le client > 1023.
  2. methode plus sécure: j’ai un firewall de l’espace (conntrack_ftp) et là, la marmotte elle lit la trame et elle voit qu’il faut ouvrir 4*256+0 donc elle ouvre momentannément ce port.

=> Problème additionnel qui peut arriver:
Si on fait du masquerade (NAT d’adresses,…) alors ca se complique:

Je décrit le cas du client derriere un firewall qui NAT, c’est symetrique pour un serveur derriere un NAT.

Le client ne connait que son adresse locale, cad privée.
Il va envoyer : PORT 192,168,1,1,port,port
Le seveur (qui est sur internet, pas sur le LAN privé) quand il recoit ca, est incapable d’acceder à 192.168.1.1.
Il faut dc que le firewall ai un conntrack_nat_ftp: la marmotte voit l’IP privée et la transforme en son equivalent publique. Elle doit donc ouvrir la partie data de la tramme tcp, c’est pas courant, il ya que le NAT qui fait faire ca. Elle doit aussi garder une association (port local+adresse global ; adresse privée) pour faire la translation inverse lors du retour de la part du serveur.

=> Problème additionnel si on fait du NAT de port (PAT):
Il faut une bonne coordination entre firewall et helper, j’ai la flemme d’expliquer mais ca marche tres bien.

Problème Sécurité:
1)
telnet serveur_ftp 21
->USER/PASS
<-accepté
->PORT IP_victime,0,22
<-accepté :ca fait partie du standard ftp, on peut discuter à trois. (*)
->LIST
<-can’t open connection ===> le port 22 de la victime est fermé
<- autre ==> le port 22 de la victime est ouvert

(*)
C’est pour ca aussi que le port source doti etre > 1023, comme ca c’est pas possible de scanner un service (d’habitude sur un port priviégié démarré par root).
On peut aussi interdire le triolisme :slightly_smiling: : N’autoriser que les commandes PORT contenant une IP egale à l’IP source réelle. (IP contenue dans la data du paquet == IP contenue dans l’entete du paquet).
C’est peut-etre le cas de stanguy.

Si on a pas de conntrack_ftp_nat et qu’on fait du NAT, alors ca marchera pas mais pire, le serveur voit vos adresse IP internes :slightly_smiling:
C’est peut-etre le cas de stanguy

Voilà un petit résumé pratique.

Houla … :smt117 mais tu m’as pondu un roman sur le ftp ou quoi lol ?

[quote=« BorisTheButcher »]Je reformule:
Au début il yavait le bigbang… Euh… nan [/quote]
nan … :smt069 … nan mais presque !!! mdr …
super, je te demandais juste ce qu’ils entendent par le signe >
je voulais lire ça pendant la cuisson des pates, mais là non, al dente, faut que ce soient, la pasta … :laughing:
[size=150]Merci super[/size] … je lis tout ça aprés …
ps: tu utilises quoi alors maintenant pour les transferts de fichiers ?

[quote=« usinagaz »]Houla … :smt117 mais tu m’as pondu un roman sur le ftp ou quoi lol ?

[quote=« BorisTheButcher »]Je reformule:
Au début il yavait le bigbang… Euh… nan [/quote]
nan … :smt069 … nan mais presque !!! mdr …
super, je te demandais juste ce qu’ils entendent par le signe >
[/quote]
Et t’as trouvé ta réponse dans mon roman? J’espere…

C’est plus à lire après les pasta, pour aider à la sieste… :smt015

[quote]
[size=150]Merci super[/size] … je lis tout ça aprés …
ps: tu utilises quoi alors maintenant pour les transferts de fichiers ?[/quote]

Pas de quoi, je l’ai fait en réponse au nombre de questions qui concernent le ftp. C’est un protocole compliqué mais en surface « seulement ».

Pr le transfert de fichier, dans le LAN dans lequel je suis c’est scp ou rsync ou webdav ou sftp ou ftp. En général, un truc avec 1 seul canal.
Enfin, il faut pas cracher sur ftp, il ya des extensions (propres au firewall ou au serveur ftp) qui empechent son utilisation à des fins malicieuses et c’est tjrs très répandu.

[quote=“BorisTheButcher”]C’est plus à lire après les pasta, pour aider à la sieste[/quote] :blush: j’osais pas le dire, mais j’y ai pensé …
sérieusement, objectif rempli, :smt038
En tout cas moi, ça va me permettre de me recoller sur mon proftpd que j’ai laissé en friche faute de pas tout capter … et quand il marchera bien, il se peut que je le vire, pour un truc plus sécurisé … c’est la contradiction de l’être …

OK, merci les gars…je prends le temps de tout lire un peu plus tard…et vous rends compte de ce que j’ai reussi a faire !

@+
Seb

salut !

c’est résolu…

au niveau /etc/modules, j’ai effectivement ajouté les lignes pour le chargement des modules :

ip_nat_ftp et ip_conntrack_ftp

maintenant, faut que je revois mon script du firewall car étant pérsuadé que ca venait de la j’ai certainement ajouté des regles pour rien… :confused:

merci en tout cas pour vos réponses qui m’ont bien aidé !!
@+ et kenavo !
Seb

Cool. Dire que j’ai jamais installé iptables :slightly_smiling:

ca s’appelle la classe ! :wink: