Forum Linux.noyau accéder à un serveur ftp depuis une passerelle

Posté par (page perso) . Licence CC by-sa
1
13
mai
2017

Bonjour,

Avec un noyau récent (4.10), je n'arrive plus à réaliser l'opération suivante qui fonctionnait parfaitement avec un noyau plus ancien (4.1 , ok il était vraiment plus ancien).
Il s'agit d'accéder à un serveur ftp qui se trouve dans mon lan, depuis une passerelle, par le port 1999.

Gateway : 192.168.4.254
FTP : 192.168.1.1

Le problème ne se produit que pour le FTP. J'ai testé avec un accès telnet sur 192.168.1.1 depuis l'extérieur, avec de la redirection de port, et ça fonctionne.

Les problèmes semblent venir du "ftp conntracking" présent dans le kernel depuis la version 4.9.

ip forwarding et nf conntracking sont activés:

net.ipv4.ip_forward = 1
net.netfilter.nf_conntrack_helper = 1

les modules chargés:

nf_nat_ftp 16384 0
nf_conntrack_ftp 20480 3 nf_nat_ftp
nf_nat 24576 5 xt_nat,nf_nat_redirect,nf_nat_ftp,nf_nat_masquerade_ipv4,nf_nat_ipv4
nf_conntrack 94208 9 nf_conntrack_ftp,nf_conntrack_ipv4,xt_helper,nf_nat_ftp,xt_CT,nf_nat_masquerade_ipv4,xt_conntrack,nf_nat_ipv4,nf_nat
iptable_raw 16384 1
iptable_nat 16384 1
nf_nat_ipv4 16384 1 iptable_nat
iptable_filter 16384 1
ip_tables 28672 3 iptable_filter,iptable_raw,iptable_nat

Côté iptables, je pense avoir fait ce qu'il faut également.

INPUT

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m helper --helper ftp -j ACCEPT
iptables -A INPUT -p tcp --dport 1999 -j ACCEPT

FORWARD

iptables -A FORWARD -i $ifint -o $ifext -mstate --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $ifext -o $ifint -mstate --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --sport ftp-data --dport 1999 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $ifext -p tcp --dport 21 -d 192.168.1.1 -j ACCEPT
# everybody else on the lan can access ftp
iptables -A FORWARD -p tcp -m tcp --dport ftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -m tcp --sport ftp-data -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

PREROUTING

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A PREROUTING -t raw -p tcp --dport 1999 -j CT --helper ftp
iptables -t nat -I PREROUTING -j DNAT -i $ifext -p TCP --dport 1999 --to-destination 192.168.1.1:21

POSTROUTING

iptables -t nat -A POSTROUTING -o $ifext -j MASQUERADE -s 192.168.0.0/16
iptables -t nat -A POSTROUTING -d 192.168.1.1 -j SNAT --to 192.168.1.254

Si vous avez une idée de ce qui pourrait manquer, je vous en serait très reconnaissant.

Merci d'avoir lu.

  • # il sert à quoi ton prerouting sur -t raw

    Posté par . Évalué à 2.

    iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
    iptables -A PREROUTING -t raw -p tcp --dport 1999 -j CT --helper ftp

    sur ces meme regles tu dis de passer le paquet à une table CT
    mais elle n'est pas definie dans l'iptables que tu nous sors ?

    sinon on est bien d'accord que tu as le reseau suivant ?

    Internet <-> 192.168.4.254 [192.168.1.254] <-> LAN <-> [192.168.1.1] serveur FTP

    • [^] # Re: il sert à quoi ton prerouting sur -t raw

      Posté par (page perso) . Évalué à 2. Dernière modification le 13/05/17 à 18:07.

      Vu que tout fonctionnait en kernel 4.1, j'ai tenté de trouver ce qui pouvait changer maintenant, et je suis tombé là dessus:

      https://unix.stackexchange.com/questions/93554/iptables-to-allow-incoming-ftp

      Et en particulier sur cette partie:

      FWIW, it seems that there was a change in kernel 4.7, so that you either need to set net.netfilter.nf_conntrack_helper=1 via sysctl (e.g. put it in /etc/sysctl.d/conntrack.conf) or use iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

      J'avoue avoir recopié assez servilement, je pensais que cette rêgle se suffisait à elle même.

      Il y a bien du passage dedans.

      Chain PREROUTING (policy ACCEPT 715002 packets, 596593580 bytes)                                                                                                                                                                 
          pkts      bytes target     prot opt in     out     source               destination                                                                                                                                          
            21     1052 CT         tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:21 CT helper ftp                                                                                                          
            23     1272 CT         tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1999 CT helper ftp
      

      Sinon oui, le réseau suit bien ce schéma:

      Internet <-> [192.168.1.254] Gateway <-> LAN <-> [192.168.1.1] serveur FTP

      (il y a également un serveur ftp sur la gateway, mais il fonctionne correctement depuis l'extérieur).

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.