Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: https://www.alcancelibre.org
Licencia Creative Commons
© 1999-2026 Joel Barrios Dueñas. Este manual se distribuye bajo la licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional (CC BY-NC-SA 4.0). Usted es libre de compartir y adaptar el material bajo los siguientes términos: debe dar crédito al autor, no puede utilizarlo para fines comerciales y debe compartir las obras derivadas bajo la misma licencia. La licencia completa está disponible en https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.es.
Pure-FTPD se presenta como una alternativa eficiente y segura para implementar servidores FTP. Aunque el protocolo FTP tradicional ha perdido relevancia frente a opciones más modernas y seguras por defecto (como SFTP o HTTPS), sigue siendo útil en contextos específicos que requieren compatibilidad universal. Este manual guía su instalación y configuración segura en distribuciones basadas en Red Hat Enterprise Linux.
FTP (File Transfer Protocol o Protocolo de Transferencia de Archivos) constituye uno de los protocolos estándar más utilizados en Internet, resultando idóneo para la transferencia de grandes bloques de datos a través de redes que soportan TCP/IP. El servicio utiliza los puertos 20 y 21, exclusivamente sobre TCP. El puerto 20 se dedica al flujo de datos entre cliente y servidor. El puerto 21 se emplea para el envío de órdenes del cliente hacia el servidor. Prácticamente todos los sistemas operativos y plataformas incluyen soporte para FTP, lo que permite que cualquier computadora conectada a una red basada sobre TCP/IP pueda hacer uso de este servicio a través de un cliente FTP.
URL: https://datatracker.ietf.org/doc/html/rfc959
Pure-ftpd es un equipamiento lógico para servidor FTP originalmente creado por Arnt Gulbrandsen, miembro de Troll Tech, responsables de la biblioteca Qt, base de KDE. Se distingue de otros proyectos por perseguir objetivos claros: mantener el servicio con un consumo mínimo de recursos, evitar llamadas a mandatos externos (lo que elimina una fuente común de problemas de seguridad), adherirse estrictamente a los estándares del protocolo FTP, y ofrecer una configuración sencilla que resulta tanto segura como amistosa para el usuario.
Para implementar un servidor FTP con Pure-FTPD, se requiere instalar el paquete correspondiente. El mandato varía según la distribución utilizada.
Si utiliza AlmaLinux, Rocky Linux o Red Hat™ Enterprise Linux y derivados, ejecute lo siguiente para instalar lo necesario:
dnf -y install epel-release
dnf -y install pure-ftpd
Si utiliza ALDOS, ejecute lo siguiente para instalar lo necesario:
yum -y install pure-ftpd
El servicio Pure-FTPD utiliza principalmente un archivo de configuración y otros ficheros de soporte:
/etc/pure-ftpd/pure-ftpd.conf: Archivo de configuración principal del servicio (daemon)./etc/pure-ftpd/pureftpd.pdb: Base de datos de usuarios virtuales (si se utiliza ese modo de autenticación)./etc/pure-ftpd/pureftpd.passwd: Archivo de contraseñas para usuarios virtuales./etc/pure-ftpd/pureftpd.lock: Archivo de bloqueo interno del servicio.Esta sección detalla los pasos para configurar el archivo principal, habilitar seguridad TLS, integrar SELinux y gestionar el servicio.
Los valores predeterminados del archivo /etc/pure-ftpd/pure-ftpd.conf hacen que el servicio funcione sin necesidad de cambio alguno y además lo haga de una forma segura. Sin embargo, existen varios parámetros que vale la pena conocer y ajustar según las necesidades específicas del servidor.
Parámetro MaxClientsNumber.
Establece el número máximo de usuarios conectados de forma simultánea. El valor predeterminado es 50. Puede modificarse de acuerdo a un propósito en particular y disponibilidad de ancho de banda. En el ejemplo a continuación, se limita el número de usuarios simultáneos a 25.
MaxClientsNumber 25
Parámetro MaxClientsPerIP.
Establece el número máximo de conexiones desde una misma dirección IP. Considerando que muchos usuarios pudieran acceder desde un servidor intermediario (proxy), el valor predeterminado de 8 puede modificarse según el criterio del administrador. En el ejemplo a continuación, se limita a 5 conexiones por IP.
MaxClientsPerIP 5
Parámetro NoAnonymous.
Define si se permitirán los accesos anónimos. En un servidor FTP público, ésta es una función deseada. Si el administrador lo considera pertinente, puede desactivarse cambiando el valor predeterminado no por yes.
NoAnonymous yes
Parámetro AnonymousCantUpload.
Define si se permitirá a los usuarios anónimos subir contenido hacia el servidor FTP. De modo predeterminado, este parámetro está activo para impedir lo anterior.
AnonymousCantUpload yes
Parámetro AnonymousCanCreateDirs.
Define si se permite a los usuarios anónimos crear directorios cuando está permitido que éstos puedan subir archivos al servidor FTP. El valor predeterminado es no.
Parámetro AnonymousBandwidth.
Define la tasa de Kb por segundo de descarga permitida para los usuarios anónimos. En el siguiente ejemplo, se establece una tasa de hasta 12 Kb por segundo.
AnonymousBandwidth 12
Parámetro DisplayDotFiles.
Establece si se permitirá mostrar los archivos cuyo nombre inicia con un punto (archivos ocultos) cuando el usuario envíe un mandato de listado con la opción -a. En la mayoría de los casos, dista de ser conveniente permitir mostrar los archivos ocultos. En el ejemplo a continuación, se define que se impida mostrar archivos ocultos.
DisplayDotFiles no
Parámetro ProhibitDotFilesWrite.
Define si se mantiene la capacidad de sobrescribir archivos ocultos (aquellos cuyos nombres inician con un punto). Conservar el valor predeterminado no resulta conveniente en escenarios donde el servidor FTP proporciona acceso al directorio raíz de un sitio web, ya que permite la actualización de archivos de configuración esenciales como .htaccess o .htpasswd. Activar este parámetro (yes) añade una capa de seguridad adicional al restringir estas modificaciones en otro tipo de implementaciones.
Parámetro umask.
Define la máscara predeterminada para los nuevos archivos y nuevos directorios en el servidor FTP. El valor predeterminado es 133:022. El usuario puede cambiar la máscara desde el cliente FTP a través de SITE CHMOD. En el siguiente ejemplo, se establecen los valores predeterminados.
umask 133:022
Parámetro Quota.
Define la cuota de número máximo de archivos y espacio utilizado por el usuario. Resulta muy conveniente para servidores de hospedaje web. En el siguiente ejemplo se establece una cuota máxima de 1500 archivos y 50 MB de espacio.
Quota 1500:50
Parámetro MaxDiskUsage.
Define el espacio máximo permitido en la partición que contiene /var/ftp para el servicio FTP donde se permite que los usuarios anónimos suban contenido. El valor predeterminado es 99. En el siguiente ejemplo, se establece un uso máximo del 80%.
MaxDiskUsage 80
Parámetro MaxLoad.
Protege la estabilidad del servidor al restringir las descargas para usuarios anónimos únicamente cuando la carga del sistema alcanza o supera un umbral definido. Esta medida garantiza que el servicio FTP sin afectar el rendimiento general del sistema durante períodos de alta demanda. El valor predeterminado es 4.
Parámetro UserBandwidth.
Define la tasa de Kb por segundo de descarga permitida para todos los usuarios, incluyendo los anónimos. Su utilización junto con el parámetro AnonymousBandwidth hace que este último carezca de sentido. Se utiliza o bien UserBandwidth o bien AnonymousBandwidth. Jamás combine su uso. En el siguiente ejemplo, se establece una tasa de hasta 12 Kb por segundo para todos los usuarios.
UserBandwidth 12
Parámetro CustomerProof.
Este parámetro fue diseñado para lidiar con usuarios inexpertos a fin de impedir que realicen operaciones que bloqueen el acceso hacia sus archivos de forma accidental, como chmod 0 public_html. En un servicio de hospedaje web, conviene activarlo.
CustomerProof yes
Parámetro CreateHomeDir.
Especifica si se debe crear automáticamente el directorio de inicio de un usuario en caso de que éste sea inexistente. En el siguiente ejemplo, se habilita esta función.
CreateHomeDir yes
Parámetro AntiWarez.
Define que sea imposible descargar archivos cuyo propietario sea el usuario ftp, como una medida de seguridad que permitirá al administrador supervisar lo subido antes de permitir su distribución. El valor predeterminado es no y se recomienda dejarlo así para una buena política de seguridad.
Parámetro PassivePortRange.
Este parámetro permite establecer el rango arbitrario de puertos utilizados para las conexiones pasivas. Puede elegirse cualquier rango entre 1024 y 65535, mismo que deberá ser habilitado en el muro cortafuegos. En el siguiente ejemplo se establece el rango de 30300 a 30309:
PassivePortRange 30300 30309
Parámetro ForcePassiveIP.
Este parámetro permite forzar una dirección IP en las respuestas PASV/EPSV para escenarios con NAT (Network Address Translation). También acepta nombres de anfitrión simbólicos para puertas de enlace con direcciones IP dinámicas. En el ejemplo se utiliza la IP del servidor en el esquema pedagógico estándar.
ForcePassiveIP 192.168.100.2
Operar un servidor FTP sin cifrado es sumamente riesgoso, ya que todas las credenciales y datos se transmiten en texto plano. Habilitar TLS (Transport Layer Security) es, por tanto, una medida de seguridad indispensable para cualquier despliegue, transformando el servicio en FTPES (FTP sobre TLS explícito).
Pure-FTPD gestiona el soporte TLS a través del parámetro TLS en su archivo de configuración principal. Este parámetro acepta tres valores que definen la política de seguridad:
Además de establecer el parámetro TLS, es necesario generar o proporcionar un certificado digital y configurar la ruta hacia éste.
Para entornos de prueba, laboratorio o uso interno, puede generar rápidamente un certificado autofirmado utilizando OpenSSL. El siguiente mandato crea un certificado RSA de 2048 bits con validez de 10 años (3650 días):
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem
Durante la ejecución, se le solicitará información para el certificado, como el código de país, nombre de la organización y, de manera crítica, el Nombre Común (Common Name), que debe ser el nombre de dominio completo (FQDN) de su servidor (por ejemplo, ftp.alcancelibre.org).
Posteriormente, restrinja los permisos del archivo del certificado para que sólo el usuario root pueda leerlo:
chmod 600 /etc/ssl/private/pure-ftpd.pem
Nota para entornos de producción: Los certificados autofirmados generarán advertencias en los clientes. Para un servicio público, se recomienda encarecidamente obtener un certificado válido de una autoridad certificadora.
Edite el archivo de configuración principal para habilitar y forzar el uso de TLS:
vim /etc/pure-ftpd/pure-ftpd.conf
Localice y descomente (elimine el símbolo # al inicio) las siguientes líneas, asegurándose de que los valores coincidan con el ejemplo a continuación. Ajuste la ruta del certificado (CertFile) si lo generó en una ubicación distinta a /etc/ssl/private/.
# Habilita TLS y rechaza conexiones sin cifrar (FTPES obligatorio)
TLS 2
# Especifica la suite de cifrado
TLSCipherSuite HIGH
# Ruta al archivo PEM que contiene el certificado y la clave privada
CertFile /etc/ssl/private/pure-ftpd.pem
⚠️ Advertencia de compatibilidad: La opción CertFile requiere que el certificado y la clave privada residan en un único archivo PEM. Si utiliza un certificado de Let's Encrypt, deberá combinar los archivos fullchain.pem y privkey.pem en uno solo.
Guarde los cambios y cierre el editor. Los cambios surtirán efecto tras reiniciar el servicio.
En sistemas con SELinux activo y en modo enforcing, es probable que el servicio pure-ftpd encuentre restricciones para acceder a recursos del sistema, como los directorios de inicio de los usuarios o los puertos de red.
Para permitir el funcionamiento completo del servidor FTP, puede ser necesario habilitar la política booleana ftpd_full_access. Esta directiva concede al proceso del servidor FTP un amplio acceso, similar al que tendría si SELinux estuviera desactivado, y suele ser necesaria para configuraciones que involucran directorios de usuario personalizados.
Ejecute el siguiente mandato para habilitar esta política de manera permanente (persistente tras reinicios):
setsebool -P ftpd_full_access on
🔧 Ajuste granular de políticas: Si la política ftpd_full_access resulta demasiado permisiva para su entorno, SELinux ofrece políticas booleanas más específicas (como ftpd_connect_db, ftpd_anon_write, etc.) que pueden ajustarse para conceder sólo los permisos estrictamente necesarios. Puede listarlas con getsebool -a | grep ftpd.
La gestión del servicio difiere entre sistemas que utilizan systemd y aquellos que emplean SysVinit.
Si utiliza AlmaLinux, Rocky Linux o Red Hat™ Enterprise Linux, ejecute lo siguiente para activar el servicio en todos los niveles de ejecución:
systemctl enable pure-ftpd
Ejecute lo siguiente para iniciar por primera vez el servicio:
systemctl start pure-ftpd
Ejecute lo siguiente para reiniciar el servicio o bien hacer que los cambios hechos a la configuración surtan efecto:
systemctl restart pure-ftpd
Ejecute lo siguiente para detener el servicio:
systemctl stop pure-ftpd
Si utiliza ALDOS o SysVinit, ejecute lo siguiente para activar el servicio en todos los niveles de ejecución:
chkconfig pure-ftpd on
Ejecute lo siguiente para iniciar por primera vez el servicio:
service pure-ftpd start
Ejecute lo siguiente para reiniciar el servicio o bien hacer que los cambios hechos a la configuración surtan efecto:
service pure-ftpd restart
Ejecute lo siguiente para detener el servicio:
service pure-ftpd stop
Es necesario abrir los puerto 20 y 21, por TCP (FTP-DATA y FTP, respectivamente) y el rango de puertos para conexiones pasivas que se haya definido.
Asumiendo que la red predeterminada corresponde a la zona public, ejecute lo siguiente para abrir los puertos requeridos:
firewall-cmd --zone=public --add-service=ftp
firewall-cmd --zone=public --add-port=20/tcp
firewall-cmd --zone=public --add-port=30300-30309/tcp
Ejecute lo siguiente para añadir de manera permanente la regla correspondiente:
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --permanent --zone=public --add-port=20/tcp
firewall-cmd --permanent --zone=public --add-port=30300-30309/tcp
Si utiliza la zona block, drop o external, simplemente reemplace public por la zona correspondiente en las reglas descritas arriba.