Client FTP en ssl et iptables

Bonjour à tous,

voilà, je dispose d’un serveur dédié sur lequel j’ai un script qui crée chaque jour un fichier de sauvegarde et l’envoie par ftp sur une seedbox.

L’envoie du fichier sur la seedbox se fait avec le client lftp avec ssl.

Tout marchait très bien jusqu’à ce que je configure iptables.
Depuis, depuis le serveur je peux me connecter avec lftp à la seedbox et me déplacer dans l’arborescence mais pas moyen de lister un répertoire.

Quand je supprime toutes les règles iptables ça marche à nouveau donc ça vient bien de là.
Je ne suis pas un pro d’iptables ni du ftp (j’ai bien ouvert les ports 20, 21 (j’ai aussi essayé en ouvrant le 443)).

Je ne sais plus quoi ouvrir d’autre …
Voici mon fichier de config iptables :

[code]#!/bin/sh

BEGIN INIT INFO

Provides: firewall

Required-Start: $remote_fs $syslog

Required-Stop: $remote_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: OpenBSD Secure Shell server

END INIT INFO

iptables -t filter -F
iptables -t filter -X

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

#autorisations

#serveur web port 80
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT

#ssh port 22
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

#ftp port 20 et 21
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT

#ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

#ntp 123
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

#smtp 25
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT

#dns
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT[/code]

Bonjour,

En fait, un client FTP en mode passif/PASV est autorisé à passer iptables parce-que le helper [mono]nf_nat_ftp[/mono] est chargée par le noyau, comme module ou en dur.
lftp utilise par défaut le mode PASV.

Ce helper espionne les connexions pour pouvoir marquer les connexions “de données” qui seront ouvertes par le serveur vers le client (en mode PASV) comme liées / RELATED.
Quand on utilise du FTPS, c’est comme du FTP sauf que les connexions de contrôle et de données sont chiffrées par TLS/SSL. Et quand on chiffre une connexion, le helper ne sait plus faire son boulot.

Dans ce cas, il faut que le serveur ouvre les connexions de données depuis une plage de ports bien définie et que dans ton script sur le client, tu autorises les connexions sortantes vers l’IP du serveur sur cette même plage de ports.

Une bonne explication (en anglais) de ces histoires de modes actif/passif : active VS passive FTP


AnonymousCoward

En fait c’est nf_conntrack_ftp qui gère le suivi des connexions FTP (en clair seulement, comme signalé à juste titre), et il s’applique aussi bien au mode actif que passif. nf_nat_ftp ne sert que si la machine fait du NAT (translation d’adresse ou de port) sur les connexions FTP. Pour le reste, rien à ajouter à la réponse, à part que SCP ou SFTP, utilisant une simple connexion SSH, seraient plus faciles à filtrer si la seedbox le supporte.

Quelques commentaires sur le script néanmoins.

  1. Le champ Short-Description du script est erroné.

  2. Si la configuration du réseau se fait par le fichier /etc/network/interfaces, qui a lieu au runlevel S, alors le démarrage du script en runlevel 2 à 5 ne protège pas la machine dans l’intervalle.

  3. Les règles concernant le port 20 ne servent à rien.

  4. ICMP, c’est bien plus que le ping. Pour n’autoriser que le ping, il faut ajouter [mono]–icmp-type echo-request[/mono].

  5. Je déduis des règles INPUT que la machine héberge des serveurs HTTP, SSH, FTP et SMTP. Si ce n’est pas le cas, il y a des règles en trop.

  6. Le port 443 est utilisé par HTTPS, pas par FTP.

Bonjour et merci pour vos réponses.

Je comprends mieux le système ! Je n’ai pas encore eu le temps de me pencher à nouveau sur la config de la plage de ports du serveur. Je le ferai très prochainement et en attendant je me connecte sans ssl (du coup je garde le port 20 ouvert).

Merci PascalHambourg pour tes commentaires. Corrections effectuées !

Alors ton mot de passe voyage en clair sur le réseau.
Et je répète : “ouvrir” le port 20 ne sert à rien, avec ou sans SSL.