Reenviar FTP con IPTables

9

Estoy tratando de reenviar un servidor FTP con IPTables. El servidor FTP se ejecuta en un cuadro de Windows 2008 (Cerberus).

Imagen

Detalles Win Box:

  • IP: 192.168.220.51
  • Puerto FTP: 21
  • Puertos PASV: 11000-13000

El servidor FTP funciona muy bien en LAN.

El enrutador funciona bien para otros clientes (Sirviendo NAT, DHCP, Firewall, ...). Necesito reenviar el servicio FTP al mundo exterior, pero no puedo usar los puertos 20-21 (ya tomados).

Intenté esto, pero no funcionó:

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

Configuración actual de 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         

Cualquier ayuda sería genial :-).

Bounty-Edit : no he podido resolver esto, cualquier ayuda sería muy apreciada.

EDIT2

Ahora puedo hacer telnet en mi servidor FTP, después de ejecutar los comandos:

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

Estoy empezando a llegar allí ... Creo que solo necesito que mis puertos PASV funcionen ahora ...

EDITAR3: Información adicional

[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  

Solución

Así es como lo hice, puede que no sea muy bonito, pero funciona.

[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

Algunas notas adicionales: el servidor FTP está escuchando en bot 21 y 2121 y el rango PASV está configurado de 11000 a 13000

Bart De Vos
fuente
¿Están cargados los módulos de kernel ftp conntrack y nat? ¿Cuál es la salida de lsmod | grep -i ftp?
Steven Monday
Vacío, no cargué ningún módulo de kernel adicional. ¿Necesito un poco?
Bart De Vos
1
@ TiZon: Sí. Iptables necesita los módulos conntrack para rastrear los números de puerto y las direcciones que FTP utiliza en los comandos PASV y PORT. Además, cuando está haciendo NAT, los módulos NAT son necesarios para reescribir números de puerto y direcciones para que el protocolo FTP pueda funcionar correctamente.
Steven Monday
2
+1 para una buena y completa explicación.
Gopoi
3
@TiZon: como Steven Monai ya se ha mencionado, con el fin de FTP funcione correctamente detrás de una puerta de enlace NAT, necesitará ip_conntrack_ftpy ip_nat_ftplos módulos del núcleo cargado. FTP es un protocolo interesante para tener que lidiar detrás de un firewall / puerta de enlace NAT. Puede resultarle más fácil simplemente usar sftp (SSH FTP) que solo usa el puerto 22 y está encriptado (mucho más seguro). FileZilla es un excelente cliente FTP gratuito que admite SFTP.
Sean C.

Respuestas:

7

Para que el soporte pasivo funcione, deberá reenviar los puertos pasivos al servidor ftp interno con los mismos números de puerto .

Solución fácil: reenviarlos todo el tiempo

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

Solución más dura:

Necesitará un agente de seguimiento de conexión de propósito especial que lea el protocolo FTP y realice las asignaciones NAT correctas justo a tiempo. Parece que ip_conntrack_ftp podría hacer esto.

e_tothe_ipi
fuente
Lo hice así. Remití permanentemente todos los puertos. Puede que no sea la mejor solución, pero funciona. Primera publicación editada con 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

debería ser suficiente

Yalok Iy
fuente
¿No 2121debería reemplazarse el número de puerto 21? ¿Cómo reconocen los módulos ftp una conexión como control ftp? ¿Se aplicará a cada conexión que use el puerto 21 antes o después de NAT?
kasperd
Alguna explicación sería buena, por lo que sabemos que no solo la carga está buscando la respuesta
Tom O'Connor
Usted elige qué puerto de origen a qué puerto de destino reenviar. Puede ser adecuado para usted. Se aplicará a cada conexión al puerto que especifique, en nuestro caso 2121, en la tabla nat "PREROUTING". Cómo funciona el módulo ftp netfilter puede leer aquí en.wikipedia.org/wiki/Netfilter#Connection_tracking_helpers
Yalok Iy