Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
090_applicatifs:205ftp:900pureftpd:50_ftp-dnat [le 16/02/2025 à 14:36] – supprimée - modification externe (Date inconnue) 127.0.0.1 | 090_applicatifs:205ftp:900pureftpd:50_ftp-dnat [le 02/04/2025 à 16:38] (Version actuelle) – ↷ Liens modifiés en raison d'un déplacement. prof | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ====== Derrière un routeur NAT ====== | ||
+ | ===== Architecture du montage ===== | ||
+ | Notre architecture devient un peu plus compliquée puisque : | ||
+ | * le client FTP est derrière un routeur NAT ; | ||
+ | * le serveur lui aussi se trouve derrière un routeur NAT. | ||
+ | Ce qui nous donne : | ||
+ | < | ||
+ | {{ 090_applicatifs: | ||
+ | ===== Côté client ===== | ||
+ | Sur la passerelle du client (GNU/Linux avec iptables), nous avons chargé les modules '' | ||
+ | Notons que dans un cas de figure comme celui-ci, si nous comptons sur le suivi de connexion pour résoudre nos problèmes de connexions '' | ||
+ | * pour le mode passif côté serveur ; | ||
+ | * pour le mode actif côté client. | ||
+ | En nous souvenant de ce qui a déjà été vu à propos du suivi de connexion en FTPES, nous pouvons prévoir une impasse... | ||
+ | ===== Côté serveur ===== | ||
+ | Dans cette configuration, | ||
+ | |||
+ | La première idée qui vient à l' | ||
+ | |||
+ | iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 21 -j DNAT --to-destination 192.168.10.76 | ||
+ | {{ 090_applicatifs: | ||
+ | Pouvons-nous prévoir le comportement ? Une requête arrivant sur xxx.yyy.zzz.ttt port 21 va être redirigée sur notre serveur. Il répondra à la requête. Côté canal de contrôle, il ne devrait pas y avoir de problèmes. | ||
+ | ===== Mode actif ===== | ||
+ | Dans ce mode, où le client FTP devient serveur pour les DATA, le serveur ne devrait pas poser de problèmes, s'il reçoit l' | ||
+ | ==== Essai en FTP ==== | ||
+ | Si nous utilisons le mode actif, le client enverra son adresse et un port pour que '' | ||
+ | |||
+ | < | ||
+ | Statut : Connexion à 82.243.80.13: | ||
+ | ... | ||
+ | Commande : OPTS UTF8 ON | ||
+ | Réponse : 200 OK, UTF-8 enabled | ||
+ | Statut : Connecté | ||
+ | Statut : | ||
+ | Commande : PWD | ||
+ | Réponse : 257 "/" | ||
+ | Commande : TYPE I | ||
+ | Réponse : 200 TYPE is now 8-bit binary | ||
+ | <span class=" | ||
+ | Réponse : 200 PORT command successful | ||
+ | Commande : MLSD | ||
+ | Réponse : 150 Connecting to port 52353 | ||
+ | Réponse : | ||
+ | Réponse : 226 7 matches total | ||
+ | <span class=" | ||
+ | </ | ||
+ | Le client, en mode actif envoie **son adresse IP privée** et pourtant, tout fonctionne. Miracle ? Comment la passerelle côté serveur peut-elle interpréter une adresse IP privée qu'il ne sait pas router ? | ||
+ | |||
+ | Sniffons sur la passerelle du serveur ('' | ||
+ | < | ||
+ | ... | ||
+ | 19 0.386311 | ||
+ | 20 0.386608 | ||
+ | <span class=" | ||
+ | 22 0.435765 | ||
+ | ... | ||
+ | 25 0.522738 | ||
+ | </ | ||
+ | Ce que l'on voit passer ici n'est plus l' | ||
+ | |||
+ | Il est fort ce '' | ||
+ | |||
+ | Il est fort, certes, mais i ne fait pas de miracles. Les modules '' | ||
+ | ==== Essai en FTPES ==== | ||
+ | Est-ce bien la peine ? '' | ||
+ | Commande : PORT 192, | ||
+ | Réponse : 500 I won't open a connection to 192.168.0.16 (only to 82.229.41.132) | ||
+ | '' | ||
+ | |||
+ | Même message que si les modules '' | ||
+ | |||
+ | Existe-t-il un contournement ? Rien de propre. Sauf si j'ai raté quelque chose, nous devrons nous passer du mode actif en FTPES dans cette topologie. | ||
+ | ===== Le mode passif ===== | ||
+ | Nous avons déjà vu ce qu'il se passe côté serveur. Sur le routeur NAT du serveur, il faudra donc aussi rediriger les ports que nous avons spécifié dans la configuration de '' | ||
+ | iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 65525:65535 -j DNAT --to-destination 192.168.10.76 | ||
+ | Cette solution sera acceptable dans la mesure où il n'y a qu'un seul serveur FTP derrière le NAT. | ||
+ | ==== Essai en FTP ==== | ||
+ | Ici, nous risquons de rencontrer un problème du fait que dans ce mode, le serveur va présenter son adresse IP qui est ici privée donc, non routée. '' | ||
+ | {{ 090_applicatifs: | ||
+ | Ce qui nous permettra de mettre en évidence cette erreur : | ||
+ | < | ||
+ | Commande : PASV | ||
+ | Réponse : 227 Entering Passive Mode (192, | ||
+ | <span class=" | ||
+ | Erreur : Échec lors de la récupération du contenu du dossier | ||
+ | </ | ||
+ | Comment corriger cette erreur ? | ||
+ | Il y a deux façons de faire, dont une que nous avons déjà rencontrée côté client pour le mode actif : | ||
+ | === Netfilter, au secours ! === | ||
+ | En chargeant les modules '' | ||
+ | < | ||
+ | Commande : PASV | ||
+ | <span class=" | ||
+ | Commande : MLSD | ||
+ | Réponse : 150 Accepted data connection | ||
+ | Réponse : | ||
+ | Réponse : 226 6 matches total | ||
+ | Statut : Succès de la lecture du contenu du dossier | ||
+ | </ | ||
+ | Et ça fonctionne. Le '' | ||
+ | === Dans pure-ftpd === | ||
+ | Il est parfaitement possible de demander à '' | ||
+ | |||
+ | Nous modifions la ligne de commande comme suit (elle commence à devenir vraiment longue) dans ''/ | ||
+ | ftp stream tcp4 nowait root / | ||
+ | | ||
+ | Cette opération va perturber le fonctionnement du suivi de connexions FTP de '' | ||
+ | | ||
+ | Sur le serveur lui-même, en revanche nous avons actuellement : | ||
+ | < | ||
+ | <span class=" | ||
+ | :FORWARD ACCEPT [0:0] | ||
+ | :OUTPUT ACCEPT [0:0] | ||
+ | -A INPUT -i eth1 -p tcp -m tcp --dport 22 -j ACCEPT | ||
+ | -A INPUT -i lo -j ACCEPT | ||
+ | -A INPUT -p tcp -m tcp --dport 21 -m state --state NEW, | ||
+ | <span class=" | ||
+ | </ | ||
+ | Il nous faut maintenant ouvrir explicitement les ports 65525 à 65535 à cause du suivi de connexion rendu inopérant : | ||
+ | iptables -A INPUT -i eth1 -p tcp --dport 65525:65535 -j ACCEPT | ||
+ | Nous rechargeons la configuration de '' | ||
+ | < | ||
+ | Commande : PASV | ||
+ | <span class=" | ||
+ | Commande : MLSD | ||
+ | Réponse : 150 Accepted data connection | ||
+ | Réponse : | ||
+ | Réponse : 226 6 matches total | ||
+ | <span class=" | ||
+ | </ | ||
+ | Tout va bien. | ||
+ | |||
+ | ==== Essai en FTPES ==== | ||
+ | Avec les modifications apportées aux règles '' | ||
+ | < | ||
+ | Commande : AUTH TLS | ||
+ | Réponse : 234 AUTH TLS OK. | ||
+ | ... | ||
+ | Commande : PASV | ||
+ | Réponse : 227 Entering Passive Mode (82, | ||
+ | Commande : MLSD | ||
+ | Réponse : 150 Accepted data connection | ||
+ | Réponse : | ||
+ | Réponse : 226 6 matches total | ||
+ | Statut : Succès de la lecture du contenu du dossier | ||
+ | </ | ||
+ | Pas de mauvaise surprise. | ||
+ | ===== Bilan ===== | ||
+ | Si nous donnons la priorité à l' | ||
+ | |||
+ | Bien entendu, en IPv6 tout devient plus simple puisqu' | ||
+ | |||
+ | En attendant résumons les configurations des divers protagonistes : | ||
+ | ==== Serveur FTP ==== | ||
+ | * Les lignes de commande dans '' | ||
+ | ftp stream tcp6 nowait root / | ||
+ | * les règles Iptables : < | ||
+ | |||
+ | # Generated by iptables-save v1.4.8 on Sun Jan 29 11:46:57 2012 | ||
+ | *nat | ||
+ | :PREROUTING ACCEPT [1255: | ||
+ | : | ||
+ | :OUTPUT ACCEPT [715:52251] | ||
+ | COMMIT | ||
+ | # Completed on Sun Jan 29 11:46:57 2012 | ||
+ | # Generated by iptables-save v1.4.8 on Sun Jan 29 11:46:57 2012 | ||
+ | *filter | ||
+ | :INPUT DROP [400:95800] | ||
+ | :FORWARD ACCEPT [0:0] | ||
+ | :OUTPUT ACCEPT [884:74191] | ||
+ | -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT | ||
+ | -A INPUT -i lo -j ACCEPT | ||
+ | -A INPUT -p tcp -m tcp --dport 21 -m state --state NEW, | ||
+ | -A INPUT -m conntrack --ctstate RELATED, | ||
+ | -A INPUT -i eth0 -p tcp -m tcp --dport 65525:65535 -j ACCEPT | ||
+ | COMMIT | ||
+ | </ | ||
+ | * les modules chargés pour le suivi de connexion FTP :< | ||
+ | |||
+ | nf_conntrack_ftp | ||
+ | nf_conntrack | ||
+ | </ | ||
+ | |||
+ | ==== Routeur NAT du FTP ==== | ||
+ | * les règles Iptables relatives au fonctionnement du FTP : < | ||
+ | |||
+ | # Generated by iptables-save v1.4.8 on Sun Jan 29 11:56:26 2012 | ||
+ | *nat | ||
+ | :PREROUTING ACCEPT [3838277: | ||
+ | : | ||
+ | :OUTPUT ACCEPT [47781: | ||
+ | ... | ||
+ | -A PREROUTING -i eth0 -p tcp -m tcp --dport 21 -j DNAT --to-destination 192.168.10.76 | ||
+ | -A PREROUTING -i eth0 -p tcp -m tcp --dport 65525:65535 -j DNAT --to-destination 192.168.10.76 | ||
+ | -A POSTROUTING -o eth0 -j MASQUERADE | ||
+ | COMMIT | ||
+ | ... | ||
+ | </ | ||
+ | * les modules de suivi de connexion ne sont pas nécessaires pour ce qui nous intéresse ici, compte tenu des règles Iptables mises en place. Il peut cependant être utile de les charger si par ailleurs des clients du même réseau souhaitent faire du FTP actif sur l' | ||
+ | |||
+ | nf_nat_ftp | ||
+ | nf_conntrack_ftp | ||
+ | nf_nat | ||
+ | nf_conntrack | ||
+ | </ | ||
+ | |||
+ | ==== Routeur NAT des clients ==== | ||
+ | Il n'y a rien de spécial, à part optionnellement charger les modules de suivi de connexion '' | ||
+ | |||
+ | Nous supposons que par ailleurs, Iptables configure correctement la passerelle pour autoriser les connexions '' | ||
+ | ==== Rappel important ==== | ||
+ | Souvenons-nous que les modules de suivi de connexion '' | ||
+ | ==== Une autre piste ==== | ||
+ | Une solution intéressante, | ||
+ | {{ 090_applicatifs: | ||
+ | Dans ce cas, le tunnel étant lui-même chiffré, rien n' |
Derrière un routeur NAT: Dernière modification le: 01/01/1970 à 00:00 par