En el Modo pasivo de FTP, es el cliente quien establece la conexión al servidor a través del puerto TCP 21 y una vez establecida la conexión, el servidor abre un puerto aleatorio, por encima del 1024, al que se conectará posteriormente.
El Vsftpd permite permite activar el modo pasivo y establecer un rango de puertos aleatorios a ser usados con dicho modo.
Primero configuraremos en el fichero /etc/vsftpd/vsftpd.conf
#Bloque para el pasivo pasv_enable=YES pasv_min_port=10000 pasv_max_port=10100 pasv_addr_resolve=NO pasv_address=X.X.X.X
La IP pasiva debe se la IP pública si se está usando un servidor con NAT en CentOS 6 (en algún caso he comprobado que hay que comentar esta línea, centOS 5).
Abrimos en este ejemplo el rango de puertos entre el 10000 y el 10100 (100 puertos). Ahora, lo que tenemos que hacer es aceptar ese rango en iptables para conexiones ya establecidas y relacionadas:
#FTP ACTIVO $ iptables -I INPUT -p tcp --dport 21 -j ACCEPT $ iptables -I INPUT -m state --state RELATED,ESTABLISHED -p tcp --dport 20 -j ACCEPT #FTP PASIVO $ iptables -I INPUT -m state --state ESTABLISHED,RELATED,NEW -p tcp --dport 10000:10100 -j ACCEPT
Además necesitamos cargar dos módulos de IPTABLES que sirven para seguir las conexiones FTP y llevar control sobre éstas. Son nf_conntrack_ftp e nf_nat_ftp, El primer es necesario siempre y el segundo se puede obviar si no se trabaja con NAT.
Se deben incluir en /etc/sysconf/iptables-config:
IPTABLES_MODULES="nf_conntrack_ftp nf_nat_ftp"
Comprobar si el módulo está cargado con:
$ lsmod | grep ip
Por supuesto, si el servidor está detrás de un firewall, éste deberá abrir los puertos comentados anteriormente.
AÑADIDO (25/3/2015):
Si tienes un kernel 2.6.19 or anterior, reeplaza nf_conntrack_ftp por ip_conntrack_ftp. Similarmente, reemplaza nf_nat_ftp por ip_nat_ftp.
$modprobe ip_conntrack_ftp $modprobe ip_nat_ftp
Si queremos que sea persistente:
cd /etc/sysconfig/modules
Crear un fichero, por ejemplo ftp.modules
$cat ftp.modules #!/bin/sh
MODULES="ip_conntrack_ftp ip_nat_ftp"
for i in $MODULES ; do
modprobe $i >/dev/null 2>&1
done