Estoy tratando de reenviar un servidor FTP con IPTables. El servidor FTP se ejecuta en un cuadro de Windows 2008 (Cerberus).
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
fuente
lsmod | grep -i ftp
?ip_conntrack_ftp
yip_nat_ftp
los 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.Respuestas:
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.
fuente
Creo que necesita cargar el módulo de seguimiento de conexión FTP.
http://www.sns.ias.edu/~jns/wp/2006/01/12/iptables-connection-tracking-ftp/
fuente
debería ser suficiente
fuente
2121
debería reemplazarse el número de puerto21
? ¿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?