Transférer FTP avec IPTables

9

J'essaie de transférer un serveur FTP avec IPTables. Le serveur FTP fonctionne sur une boîte Windows 2008 (Cerberus).

Image

Détails Win Box:

  • IP: 192.168.220.51
  • Port FTP: 21
  • Ports PASV: 11000-13000

Le serveur FTP fonctionne très bien en LAN.

Le routeur fonctionne bien pour les autres clients (Servant NAT, DHCP, Pare-feu, ...). J'ai besoin de transmettre le service FTP au monde extérieur, mais je ne peux pas utiliser les ports 20-21 (déjà pris).

J'ai essayé, mais cela n'a pas fonctionné:

iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Configuration actuelle d'IPTables:

[root@router ~]# service iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination         
1    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           
2    MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Table: filter
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  127.0.0.1            0.0.0.0/0           
2    DROP       all  --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
8    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
10   ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
11   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53 
12   ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
13   ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
14   DROP       udp  --  0.0.0.0/0            0.0.0.0/0           
15   DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         

Toute aide est la bienvenue :-).

Bounty-Edit : Je n'ai pas pu comprendre cela, toute aide serait grandement appréciée.

EDIT2

Je peux maintenant telnet sur mon serveur FTP, après y avoir exécuté les commandes:

modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 2121 -j DNAT --to 192.168.220.51:21

Je commence à y arriver ... Je pense que j'ai juste besoin de faire fonctionner mes ports PASV maintenant ...

EDIT3: Informations supplémentaires

[root@router ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 3251 packets, 154K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  540 48534 ACCEPT     all  --  *      *       127.0.0.1            0.0.0.0/0           
4270K 5625M ACCEPT     all  --  *      *       192.168.220.0/24     0.0.0.0/0           
    0     0 DROP       all  --  eth1   *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2222 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:68 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:1194 
   65  8487 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443 
    8   404 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:3128 
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:53 
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:1194 
63870   81M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 
  974  224K DROP       udp  --  *      *       0.0.0.0/0            0.0.0.0/0           
  638 34956 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp flags:0x17/0x02 

Chain FORWARD (policy ACCEPT 3578K packets, 3355M bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 2275K packets, 703M bytes)
 pkts bytes target     prot opt in     out     source               destination  



[root@router ~]# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 33954 packets, 2595K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:2121 to:192.168.220.51:21 

Chain POSTROUTING (policy ACCEPT 5925 packets, 699K bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      eth1    0.0.0.0/0            0.0.0.0/0           
27170 1785K MASQUERADE  all  --  *      eth0    0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 5777 packets, 457K bytes)
 pkts bytes target     prot opt in     out     source               destination  

Solution

C'est comme ça que je l'ai fait, peut-être pas très joli, mais ça marche.

[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
[root@router ~]# iptables -t nat -I PREROUTING -p tcp --dport 11000:13000 -j DNAT --to 192.168.220.51:11000-13000
[root@router ~]# iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 11000:13000 -j ACCEPT

Quelques notes supplémentaires: le serveur FTP écoute sur les bots 21 et 2121 et la plage PASV est réglée de 11000 à 13000

Bart De Vos
la source
Les modules du noyau ftp conntrack & nat sont-ils chargés? Quelle est la sortie de lsmod | grep -i ftp?
Steven lundi
Vide, je n'ai chargé aucun module de noyau supplémentaire. En ai-je besoin?
Bart De Vos
1
@TiZon: Oui. Iptables a besoin des modules conntrack pour suivre les numéros de port et les adresses que FTP utilise dans les commandes PASV et PORT. De plus, lorsque vous faites du NAT, les modules NAT sont nécessaires pour réécrire les numéros de port et les adresses afin que le protocole FTP puisse fonctionner correctement.
Steven lundi
2
+1 pour une explication correcte et complète.
Gopoi
3
@TiZon: comme Steven Monai déjà mentionné, pour que FTP fonctionne correctement derrière une passerelle NAT, vous aurez besoin ip_conntrack_ftpet les ip_nat_ftpmodules du noyau chargé. FTP est un protocole intéressant à gérer derrière un pare-feu / passerelle NAT. Vous pouvez trouver plus facile d'utiliser simplement sftp (SSH FTP) qui n'utilise que le port 22 et est crypté (beaucoup plus sécurisé). FileZilla est un excellent client FTP gratuit qui prend en charge SFTP.
Sean C.

Réponses:

7

Pour que la prise en charge passive fonctionne, vous devrez transférer les ports passifs au serveur ftp interne avec les mêmes numéros de port .

Solution simple: transférez-les tous à tout moment

InternetIP: 11000-13000 -> 192.168.220.51:11000-13000

Solution plus difficile:

Vous aurez besoin d'un agent de suivi de connexion à usage spécial qui lit le protocole FTP et fait les bons mappages NAT juste à temps. Il semble que ip_conntrack_ftp pourrait faire cela.

e_tothe_ipi
la source
Je l'ai fait comme ça. J'ai transmis en permanence tous les ports. Ce n'est peut-être pas la meilleure solution, mais cela fonctionne. Premier post édité avec howto.
Bart De Vos
0
iptables -t nat -I PREROUTING -p tcp --dport 2121 -j DNAT --to 192.168.220.51:2121
iptables -I FORWARD -p tcp -d 192.168.220.51 --dport 2121 -j ACCEPT
modprobe nf_conntrack_ftp 
modprobe nf_nat_ftp

devrait suffire

Yalok Iy
la source
Le numéro de port ne doit-il pas 2121être remplacé par 21? Comment les modules ftp reconnaissent-ils une connexion comme contrôle ftp? Sera-t-il appliqué à chaque connexion utilisant le port 21 avant ou après NAT?
kasperd
Une explication serait bien, alors nous savons que vous n'êtes pas seulement en train de cultiver la cargaison
Tom O'Connor
Vous choisissez le port source vers le port de destination à transférer. Il peut vous convenir. Il sera appliqué à chaque connexion au port que vous spécifiez, dans notre cas 2121, dans la table nat "PREROUTING". Comment fonctionne le module ftp de netfilter, vous pouvez lire ici en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy