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: