Règles NAT Iptables FTP

Bonjour,

Je loue actuellement une machine chez Online où j’ai installé dessus un ESXi.
J’ai donc mon IP publique rattachée à l’ESXi et une IP Failover que j’ai mise sur une des pattes de mon routeur Debian, l’autre patte réseaude ce routeur étant en 192.168.0.254.
Je virtualise mes machines et j’ai besoin de créer une règle iptable pour mon serveur FTP.

Je précise que mon Routeur ainsi que mon serveur FTP sont sous Debian Jessie 8.6

Voici ma configuration:
image

IP Failover = eth0
IP publique = eth1

Voici mon script sur le ROUTEUR (prit exemple sur Internet, je sais pas s’il est bon…):

#!/bin/sh
#Vider tables actuelles
iptables -t filter -F
# Vider règles persos
iptables -t filter -X
# Interdire toute connexion in et out
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# Activer NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# ICMP
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

###OUVERTURE PORTS####
# SSH IN
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# DNS Out_ 
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
# NTP Out
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
# HTTP+HTTPS out
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# FTP Out
iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT

### Serveur FTP ####_  
 iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
# Autoriser NAT
iptables -t nat -I PREROUTING -p tcp -d 60.xx.xxx.xxx "IP FAILOVER" --dport 21 -j DNAT --to 192.168.0.21
iptables -I FORWARD -p tcp -d 192.168.0.21 --dport 21

Et lorsque j’essaye de me connecter à mon FTP via Filezilla, je rentre mon IP failover, user + mdp, port 21 (que j’ai laissé de base sur le serveur FTP bien sur):
Connection interrompue après 20 secondes d’inactivité
Voilà, je pense que le problème vient de au moment de l’avant dernière ligne, à #AUTORISER NAT… Mais je suis pas sur, je suis débutant. J’ai déjà pas mal galéré pour en arriver jusque là. Merci de votre aide précieuse.

Bonne journée à tous/toutes

C’est le ftp actif qui ne passe pas, normalement, si tu te met niveau client en mode passif, ça doit fonctionner.
Pas le temps (ni la tête) pour éplucher ton script iptables, mais je crois que c’est juste un pb entre le nat et l’ouverture des ports >1024.
Regardes par là cette configuration, ça devrait t’aider à trouver les bons réglages, si personne n’a plus précis à te proposer: http://www.devops-blog.net/iptables/iptables-rules-for-nat-with-ftp-active-passive

Est-ce le script entier ? Sans parler de FTP, il est incomplet : il contient des règles qui acceptent, mais rien qui bloque par défaut, donc tout est accepté par défaut et les règles ACCEPT sont superflues. Heureusement pour toi car la seule règle FORWARD en place ne suffirait pas à autoriser la connexion de commande sur le port 21, sans parler des connexions de données.

Concernant FTP, il n’y pas de règle SNAT ou MASQUERADING donc le mode actif ne passera pas mieux.

Si le FTP est en clair, (pas de TLS) il faut charger le module nf_nat_ftp pour la prise en charge spécifique du protocole FTP par le NAT. Selon la version du noyau, cela ne suffit pas forcément : avec les noyaux récents la prise en charge automatique des connexions est désactivée, il faut soit la réactiver avec un paramètre du module nf_conntrack dont j’ai oublié le nom, ou associer le helper ftp aux connexions de commande FTP explicitement avec une règle iptables ayant la cible CT.

Si le FTP est chiffré, le module nf_nat_ftp ne sert à rien et il faut traiter les connexions de données FTP comme des flux indépendants à DNATer (mode passif) ou SNATer (mode actif). En mode passif, il faut aussi configurer le serveur FTP pour annoncer l’adresse IP publique du routeur.

Je vais aller voir ça merci @mattotop :slight_smile:

Merci pour la réponse @PascalHambourg je me penche sur le module nf_nat_ftp et sur le manque de règles dès maintenant !

Pour faire suite au message de PascalHambourg :

Le helper FTP s’active sur un routeur sous Debian en chargeant le module nf_nat_ftp puis, au choix, en :

  • Ajoutant une règle iptables avec, par exemple, sudo iptables -t raw -A PREROUTING --protocol tcp --dport 21 -j CT --helper ftp
  • Utilisant sudo sysctl -w net.netfilter.nf_conntrack_helper=1 (ou en modifiant le fichier /etc/sysctl.conf) mais c’est assez dangereux car cela impacte tous les helpers et pas seulement celui pour le FTP.

En admettant un client et un serveur FTP (cli et srv) chacun situés derrière un routeur sous Debian faisant du SNAT (cli_gw et srv_gw) , après avoir utilisé sur srv_gw la commande sudo iptables -t nat -A PREROUTING --dst ip_publique --protocol tcp --dport ftp -j DNAT --to-destination ip_srv et sans autre modification, on peut :

  • Faire fonctionner le FTP mode passif en activant le helper FTP sur srv_gw, rien d’autre n’étant obligatoire.
  • Faire fonctionner le FTP en mode actif/normal en activant le helper FTP sur cli_gw, rien d’autre n’étant obligatoire.
  • Faire fonctionner les deux modes en activant le helper FTP sur les deux routeurs. Cela ne crée pas de conflit.

Vérifié avec Debian 9.4, des kernels 4.9.0-6 officiels et le paquet proftpd-basic en version 1.3.5b-4 sans aucune modification de sa configuration par défaut.


AnonymousCoward

2 J'aime