[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: iptable redirection ftp



Salut,

Troumad a écrit :

Je teste un transfert de ftp du style suivant :
iptables -t nat -A PREROUTING -j DNAT -i $NET -p TCP --dport 2211 --to-destination 192.168.1.10:21

Tu risques d'avoir des ennuis si tu fais passer du FTP sur un port non standard.

Le problème est que les "ls", "get" ne passent pas :( Les pwd et cd passent.

La différence est que les deux première commandes provoquent un transfert de données sur une connexion ftp-data en mode actif ou passif selon la configuration courante.

Il me semble alors que je doit aussi faire quelque chose au niveau du port 20, mais quoi ?

Rien de spécial au niveau du port 20.

ftp> get bashrc
local: bashrc remote: bashrc
200 PORT command successful
425 Unable to build data connection: Connection timed out

Commande PORT donc mode actif.

Rappel des faits (long, désolé):

En mode actif, le client envoie au serveur par la connexion de contrôle (port standard 21) une commande PORT avec son adresse et un port qu'il ouvre en écoute. Le serveur se connecte au client en utilisant l'adresse et le port destination fournis par ce dernier pour transférer les données (get, put, ls). Normalement le serveur utilise le port source immédiatement inférieur au port de la connexion FTP de contrôle, donc le port 20 si la connexion de contrôle utilise le port FTP standard.

En mode passif, le client envoie au serveur une commande PASV, à laquelle le serveur répond en envoyant son adresse et un numéro de port qu'il ouvre en écoute. Ce numéro de port dynamique n'est pas le port (FTP - 1). Ensuite le client se connecte au serveur en utilisant l'adresse et le port destination fournis par le serveur.

On comprend pourquoi le NAT sans précaution peut faire foirer le protocole FTP. Les adresses publiques ne correspondent pas aux adresses échangées dans les commandes PORT ou PASV, et les ports ne sont pas redirigés par le NAT.

En pratique, sans dispositions particulières sur le routeur NAT ou le serveur :
- client derrière un routeur NAT -> le mode actif ne marche pas
- serveur derrière un routeur NAT -> le mode passif ne marche pas

Et quand les deux sont chacun derrière un routeur NAT, je vous laisse deviner le carnage.

Le problème est connu depuis à peu près aussi longtemps que le NAT existe. Certains programmes serveurs FTP ont été adaptés pour pouvoir fonctionner en mode passif derrière un routeur NAT : en mode passif, ils ne fournissent pas leur propre adresse IP dans la réponse à la commande PASV du client mais l'adresse publique du routeur (obtenir cette adresse publique quand elle est dynamique est un autre problème). Il faut aussi leur spécifier une plage de ports à utiliser pour les connexions de données, et configurer le routeur NAT pour rediriger ces ports vers l'adresse privée du serveur.

Une autre approche consiste pour le routeur NAT à surveiller le contenu de la connexion FTP de contrôle, intercepter les adresses et ports des commands PORT ou PASV, et remplacer l'adresse privée par l'adresse publique et créer dynamiquement une redirection du port de la connexion de données. Le programme qui réalise cette tâche pour un protocole donné (FTP n'est pas le seul à avoir des problèmes avec NAT) est appelé un "helper". Dans le noyau Linux 2.4 ou 2.6, le helper NAT FTP associé à iptables est le module ip_nat_ftp qui a lui-même besoin du module de suivi de connexion FTP ip_conntrack_ftp.

Pour revenir à ton cas : en mode actif sur un serveur FTP NATé ça aurait dû passer, sauf si les connexions sortantes sont bloquées par le routeur NAT devant le serveur FTP ou un firewall installé sur la machine qui héberge le serveur, ou si le client FTP est lui-même derrière un routeur NAT qui ne gère pas le protocole FTP sur le port 2211. La plupart des routeurs savent gérer le protocole FTP mais uniquement quand la connexion de contrôle utilise le port standard 21, et parfois aussi uniquement quand c'est le client qui est derrière le NAT.

Si le client est derrière un routeur NAT qui ne peut être configuré pour suivre le le protocole FTP sur le port 2211, il faut passer en mode passif. De plus, il faut configurer le routeur NAT du serveur FTP pour prendre en compte le procole FTP. Sous Linux, c'est faisable.

Comme je ne sais pas si le helper FTP intervient avant ou après le NAT pour identifier une connexion FTP de contrôle, il vaut mieux spécifier les deux ports 21 et 2211. Par défaut, si on ne spécifie pas de liste de ports, le helper surveille le port 21.

modprobe ip_conntrack_ftp ports=21,2211
modprobe ip_nat_ftp ports=21,2211

Le chargement des modules au démarrage peut être inscrit dans /etc/modules.conf au moyen de l'outil modconf.

Ensuite, il faut autoriser les connexions FTP de données entrantes qui sont identifiées par le suivi de connexion de Netfilter comme liées aux connexions établies. Soit dans une règle particulière :

iptables -A FORWARD -i $NET -m state --state RELATED -p tcp --syn \
   -j ACCEPT

On peut ajouter une restriction sur la plage de ports destination utilisée par le serveur si elle est connue.

Soit dans la règle plus générale bien connue :

iptables -A FORWARD -i $NET -m state --state ESTABLISHED,RELATED \
   -j ACCEPT



Reply to: