Servidor FTP con VSFTPD

Qué es VSFTPD

VSFTPD (Very Secure File Transfer Protocol Daemon) es un servidor de FTP seguro y de código abierto para Linux.

Como sabemos, en cualquier transferencia por ftp interviene un programa servidor y un programa cliente. El programa del servidor gestiona las conexiones que hacen los programas clientes para subida y bajada de archivos.

Algunas de las ventajas de usar VSFTPD son:

  • Seguridad: Tiene varias características de seguridad, como encarcelamiento chroot y soporte SSL/TLS, para ayudar a proteger las conexiones FTP.
  • Configuración: Tiene un archivo de configuración sencillo (/etc/vsftpd.conf) que le permite habilitar o deshabilitar varias características y opciones.
  • Rendimiento: Está optimizado para un alto rendimiento y puede manejar un gran número de conexiones.
  • Estabilidad: Estable y seguro en desarrollo activo durante muchos años.
  • Soporte de plataformas: Se ejecuta en una amplia gama de plataformas, incluyendo Linux, Unix y BSD.
  • Comunidad: Tiene una amplia comunidad de usuarios y desarrolladores por lo que es fácil encontrar soporte.
FTP activo y pasivo

He de reconocer que antes de profundizar en la creación de servidores, desconocía por completo que existen dos tipos de conexiones en FTP: la activa (método original cuando se creó FTP) y la pasiva (actualmente la opción más recomendada). ¿Cuáles son las diferencias? En ambos se utiliza un puerto para los datos y otro para el control. El puerto de control tradicionalmente es el 21 en ambas modalidades. Por ese puerto pasan los comandos FTP. El puerto de datos, por donde se transfieren los archivos, es diferente. En activa, siempre se utiliza el puerto 20 y el servidor inicia la comunicación. En cambio, en pasiva, se utiliza cualquier puerto aleatorio libre por encima del número 1023 y el cliente inicia la comunicación

FTP activo

En el modo activo, un cliente se conecta desde un puerto de control aleatorio P al servidor en el puerto de control 21. El servidor responde desde el puerto de control y luego inicia la transmisión de datos desde el puerto 20 hacia el cliente en el puerto de datos P+1.

El siguiente esquema representa un ejemplo de conexión activo. Tenemos un cliente y un servidor FTP. El cliente inicia la comunicación mediante un puerto de control aleatorio de entre los puertos superiores a 1024, hacia el servidor en el puerto de control predeterminado 21. En este supuesto imaginario, asumamos que el cliente utiliza el puerto de control 1035 y que el servidor utiliza el puerto de control predeterminado 21. El cliente envía un comando PORT para indicar su puerto de datos, que será el siguiente al puerto de control (1035 + 1 = 1036). Luego, el servidor inicia la transferencia de archivos desde su puerto de datos hacia el puerto de datos 1036 del cliente. Este proceso presenta un riesgo de seguridad, ya que la máquina cliente debe estar dispuesta a aceptar cualquier conexión de entrada en los puertos superiores a 1024 y es probable que los cortafuegos rechacen estas conexiones aleatorias. Para solucionar este problema, se desarrolló el modo pasivo en el que el servidor establece la conexión de datos.

IMPORTANTE. Nota 1: El método activo actualmente está en desuso y no es compatible para plataformas en la nube. Nota 2: En el esquema, de manera simplificada, se indica que el servidor inicia y recibe la comunicación de datos en el puerto 20. Históricamente, este puerto se utilizó como el puerto de salida del servidor, pero en vsftpd, no es el valor predeterminado. El cliente envía el comando PORT al puerto predeterminado del servidor activo.

FTP pasivo

En el siguiente esquema, vemos un cliente que se conecta al servidor enviando un comando PASV desde un puerto de control aleatorio (1035 en el ejemplo) hacia el puerto de control 21 del servidor. El servidor le responde desde el puerto de control con su puerto de datos (4015 en el ejemplo). Con esta información, el cliente se conecta desde su puerto de datos (1036) al puerto de datos del servidor (4015). Con este método, evitamos que el cliente tenga puertos expuestos. A menudo, se pueden encontrar manuales de VSFTPD que utilizan un rango de puertos de datos de 40000 a 50000. En estos ejemplos, seguiremos haciendo lo mismo.

Puertos del Firewall

En el modo pasivo, es necesario abrir las entradas en los puertos 21, 40000 a 50000. En el modo activo, es necesario abrir los puertos 20 y 21. Además, si se utiliza FTPS con SSH/TLS, es necesario abrir el puerto 990. Dependiendo de las características del servicio FTP, abriremos únicamente los puertos necesarios. Sin embargo, para fines de demostración y por comodidad, he preferido abrirlos todos de una vez. Como siempre, recordemos que si se utiliza una plataforma en la nube, como Oracle Cloud o AWS, es necesario abrir los puertos desde el panel web de la plataforma para abrir el firewall de la red virtual y también desde el propio firewall de la instancia de la máquina virtual.

Las reglas iPtables para FTP son las siguientes:

# Abrir los puertos 20,21 y 40000 a 50000 
sudo iptables -A INPUT -p tcp --dport 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 990 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 40000:50000 -j ACCEPT
# Guardar reglas (tuve que cambiar a usuario root, con sudo no tenía permisos)
/sbin/iptables-save > /etc/iptables/rules.v4 
                        

Es importante guardar estas reglas para que se mantengan aún después de reiniciar la instancia. Para hacerlo, podemos ejecutar el siguiente comando con permisos de root:

sudo su
# Guardar reglas (tuve que cambiar a usuario root, con sudo no tenía permisos)
/sbin/iptables-save > /etc/iptables/rules.v4 
                        

Si has ingresado los comandos anteriores de iptables tal cual aparecen, estas reglas se irán al último lugar, quedando en medio la regla REJECT para rechazar todas las conexiones que no cumplan las primeras reglas. Esto es un error de planificación. Lo recomendable es listar las reglas actuales con el comando sudo iptables --line-numbers -nL INPUT y agregar las reglas para vsftpd en un número de línea anterior al REJECT. Por ejemplo, si quieres agregar todas las reglas en la línea 6, utiliza el comando sudo iptables -I INPUT 6 ... y ve subiendo de posición una tras otra.

Si es necesario reordenar la lista de reglas y llevar al final el REJECT debemos borrarlo y crear otra vez la regla con parámetro -A.

Otra opción es editar el archivo de las reglas de iptables con el comando sudo nano /etc/iptables/rules.v4 y, posteriormente, reiniciar el servicio iptables con el comando sudo service iptables restart.

iptables es un sistema de firewall que puede ser complejo de configurar. Sin embargo, en mi instancia de Oracle Cloud Infrastructure (OCI) lo he configurado exitosamente. Por otro lado, en otra instancia de OCI, estoy utilizando UFW, que es más fácil de configurar. A continuación, te muestro los comandos requeridos para abrir los puertos de FTP con UFW:

# Abrir los puertos 20,21,990 y 40000 a 50000 
sudo ufw allow 20
sudo ufw allow 21
sudo ufw allow 990
sudo ufw allow 40000:50000/tcp
                        

Si deseas encontrar más ejemplos de configuración de firewall, puedes visitar www.tallerdeapps.com. En este sitio web encontrarás tutoriales para las tres interfaces de firewall más comunes en Ubuntu: iptables, UFW y Firewalld.

Cómo abrir puertos en la red virtual de Oracle Cloud

Es necesario configurar el firewall en la mayoría de las plataformas de nube pública, como Oracle Cloud Infrastructure (OCI), Amazon Web Services (AWS), Microsoft Azure, Google Cloud Platform (GCP) o IBM Cloud. Esto debe hacerse tanto desde la plataforma de nube como desde la instancia individual.

Aunque existen algunas diferencias entre ellas, el proceso es similar. Se crean grupos de seguridad con reglas que se vinculan a la instancia o la red virtual. Por ejemplo, en el caso de OCI, se crean grupos de seguridad en la VCN y luego se vinculan a las instancias que requieren esas reglas. A continuación, se detalla el proceso en OCI. Desde el panel de OCI, accedemos a:

Networking -> Virtual Cloud Networks -> VCN Details -> Security Lists

En mi caso particular, ya tengo un grupo de seguridad previamente creado en la VCN con algunas reglas que he decidido no cambiar. Hay varias opciones para abrir puertos en OCI, como agregar nuevas reglas dentro de un grupo existente, crear un nuevo grupo específico con reglas nuevas, o crear las reglas directamente en la Lista de seguridad.

Siguiendo la recomendación de OCI, optaremos por crear un nuevo grupo de seguridad.

Para crear un nuevo grupo de seguridad, hacemos clic en [Create Security List].

Se abre un formulario que nos pide un nombre para la regla y el compartimento donde se alojará. En artículos pasados, ya hablamos sobre los compartimentos, que son directorios donde se guardan los recursos.

Aquí crearemos varias reglas para los puertos 20, 21, 990 y del 40000 al 50000 (atención: en OCI los rangos se separan con "-", mientras que en la instancia desde Linux se usan ":" )

Los valores del formulario serán Stateless, sin marcar, Ingress para entradas, CIDR, rango de IP que se aceptan (0.0.0.0/0) para todas las IPv4, TCP como protocolo, "all" para el rango al que se dirige el tráfico y por último, el puerto que queremos abrir.

Tras agregar todas las reglas, el grupo queda así:

Además, en el apartado de Grupos de Seguridad de Redes de la VNC, nos aparece el nuevo grupo creado llamado "Grupo_Seguridad_Vsftpd".

Este nuevo grupo pertenece a la VNC pero no está asignado a la instancia a la que queremos dar el servicio FTP. Para añadirla, iremos a:

Compute->Instances->Instance Details

Desde aquí, en el apartado Primary VNIC de Instance Information, tenemos control sobre a qué Grupos de seguridad vamos a vincular la instancia. Pulsamos en "Edit".

Añadimos el nuevo grupo a la instancia.

Eso es todo. Ya tenemos el grupo de reglas para FTP añadido a la instancia.

Siguiendo el consejo de Oracle Cloud Infrastructure (OCI), si tenemos otra instancia que requiere servicio FTP, solo tendremos que agregar el grupo de seguridad creado. En pequeñas infraestructuras, probablemente no se apreciará mucha ventaja en el uso de grupos de seguridad, especialmente en la capa gratuita de OCI que está limitada en recursos. Sin embargo, en entornos con una gran cantidad de servidores, esta técnica es especialmente importante. Recuerda que las reglas siempre deben configurarse en ambos lados: tanto en la plataforma OCI como en la instancia.

Instalación de VSFTPD en Ubuntu Server

Una vez que hemos configurado el firewall de la instancia OCI para alojar servicios FTP, podemos proceder a instalar el paquete VSFTPD en Ubuntu. Para hacerlo, accedemos a la terminal y ejecutamos los siguientes comandos:

# Antes de instalar el paquete, actualicemos los paquetes del sistema                         
sudo apt-get update && sudo apt-get upgrade -y
#Instalamos el paquete vsftpd
sudo apt-get install vsftpd
                        

Una vez instalado el paquete, es necesario editar el archivo de configuración principal del servicio VSFTPD para establecer los parámetros necesarios.

Configuración del archivo '/etc/vsftpd.conf' para FTP PASIVO

El archivo de configuración '/etc/vsftpd.conf' tiene muchos parámetros que se pueden ajustar. Es altamente recomendable consultar la página de manual man vsftpd.conf para obtener información detallada sobre cada uno de los parámetros. Algunos de los parámetros más importantes son las conexiones anónimas, los permisos de escritura, el enjaulamiento de usuarios, los puertos predeterminados y las directivas seleccionadas.

Antes de editar el archivo de configuración, es recomendable hacer una copia de seguridad del mismo para poder restaurarlo a su estado original en caso de ser necesario. Esto se puede hacer mediante el siguiente comando: cp /etc/vsftpd.conf /etc/vsftpd.conf.bak

sudo nano /etc/vsftpd.conf
                        

Al editar el archivo de configuración, nos encontraremos con una larga lista de directivas. Algunas deberemos activar descomentándolas y otras, que no están presentes, las agregaremos al final del archivo.

La siguiente imagen muestra el inicio del archivo de configuración de vsftpd:

En su configuración original, algunas directivas están activadas y las describiremos a continuación:

listen=NO 
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=NO # por defecto pone YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
                        
listen=NO
Si está activo, permite las conexiones en IPv4. Si deseamos utilizar IPv6, usaremos la directiva listen_ipv6=YES, la cual también incluirá las conexiones IPv4.
listen_ipv6=YES
Activará tanto las conexiones de IPv4 como las de IPv6.
anonymous_enable=NO

Impide las conexiones anónimas, lo que significa que solo los usuarios que tengan una cuenta de usuario y contraseña válida podrán conectarse al servidor y acceder a los archivos y directorios en él.

dirmessage_enable=YES

Permite habilitar o deshabilitar la visualización del mensaje de bienvenida que se muestra al usuario al conectarse a un directorio específico en el servidor FTP.

Cuando se habilita, permite especificar un archivo de texto con un mensaje personalizado que se mostrará a los usuarios cuando se conecten a un directorio específico en el servidor FTP. El nombre del archivo debe ser '.message' y debe estar en la raíz del directorio para el cual se desea mostrar el mensaje personalizado.

Por ejemplo, si se desea mostrar un mensaje de bienvenida a los usuarios al conectarse al directorio /home/ftp, se crea un archivo llamado .message en ese directorio y se escribe el mensaje de bienvenida en él.

use_localtime=YES
Cuando se activa mostrará la fecha de modificación de los archivos según la hora local del servidor. Si esta opción está configurada en "NO", los horarios que se muestran en el servidor FTP serán en UTC, lo que significa que los horarios serán consistentes para todos los clientes independientemente de su zona horaria. Esto puede ser útil si los clientes se encuentran en diferentes zonas horarias y se desea evitar confusiones. Sin embargo, los horarios pueden no ser coherentes con la zona horaria local del servidor.
xferlog_enable=YES

Cuando se activa se crea un archivo de registro llamado "xferlog" que registrará información sobre las transferencias de archivos, como el nombre de usuario, la hora de la transferencia, el nombre de archivo, el tamaño del archivo, entre otros. Esta información puede ser útil para auditar y monitorear el uso del servidor FTP. De forma predeterminada, este archivo se colocará en /var/log/vsftpd.log.

Este parámetro debe activarse conjuntamente con xferlog_file=/var/log/vsftpd.log para indicar la ruta del archivo log. Como alternativa a xferlog_file está el parámetro vsftpd_log_file que también graba un archivo log. En mis pruebas resulta más completa la información de éste último.

connect_from_port_20=NO

Recuerda lo que comentamos al principio de este artículo sobre los modos activo y pasivo. La opción "connect_from_port_20" en la configuración de vsftpd es utilizada para especificar si el servidor FTP usará el puerto 20 para conectarse al cliente durante una transferencia de archivos en el modo activo. Como estamos configurando un servidor pasivo, le asignamos el valor "NO".

NOTA: Este ajuste y otros más se pueden usar para configurar un servidor activo en un entorno local. Sin embargo, no deben ser utilizados en plataformas en la nube, ya que no funcionarán.

secure_chroot_dir=/var/run/vsftpd/empty
Aquí se especifica el directorio raíz (o "chroot") en el que los usuarios se restringen después de iniciar sesión. Un "chroot" es un término que se refiere a la práctica de restringir el acceso de un usuario a un subconjunto de archivos y directorios en el sistema de archivos. En este ejemplo los usuarios de ftp no tienen acceso fuera de /var/run/vsftpd/empty. Es importante mencionar que esta opción solo se aplica a usuarios locales y no a usuarios anónimos, también es importante configurar correctamente los permisos de los directorios para evitar errores en la conexión. Por defecto en Ubuntu 20.04: /var/run/vsftpd/empty
pam_service_name=vsftpd

es una configuración en el archivo de configuración de VSFTPD que especifica el nombre del servicio PAM (Pluggable Authentication Modules) que se utilizará para autenticar a los usuarios que se conectan al servidor FTP. PAM es un sistema de autenticación que proporciona una interfaz común para autenticar a los usuarios en varios servicios diferentes, como FTP, SSH, entre otros.

En este ejemplo que se configura "pam_service_name=vsftpd", VSFTPD buscará un archivo de configuración PAM llamado "vsftpd" en el directorio /etc/pam.d/ (en Ubuntu 20.04 está ahí) y utilizará esa configuración para autenticar a los usuarios.

rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem

Cuando esta opción está configurada y además SSL está habilitado, VSFTPD utilizará el certificado especificado para establecer conexiones seguras con los clientes que se conecten al servidor utilizando FTP sobre SSL/TLS. El archivo de certificado debe estar en formato PEM y debe contener un certificado válido emitido por una entidad de certificación reconocida.

En este ejemplo, VSFTPD utilizaría el certificado en el archivo "ssl-cert-snakeoil.pem" ubicado en la ruta "/etc/ssl/certs/" para establecer conexiones seguras con los clientes si.

Es importante mencionar que esta opción es necesaria si se desea habilitar el modo FTP over SSL/TLS, también es necesario configurar la opción "rsa_private_key_file" para especificar la ruta al archivo de la clave privada asociada al certificado.

rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Especifica la ruta al archivo de clave privada RSA utilizado para el cifrado SSL/TLS en el servidor FTP.

Por defecto, la opción esta configurada para que use el archivo de clave privada "ssl-cert-snakeoil.key" que se encuentra en la ruta "/etc/ssl/private/ssl-cert-snakeoil.key"

Las claves RSA son aquellas que constan de un archivo con clave privada y otro con la clave pública. La clave privada debe guardarse en un lugar seguro dentro del servidor mientras que la clave pública puede compartirse a quienes le queremos dar acceso. La clave pública se utiliza para cifrar los datos y la clave privada se utiliza para descifrarlos.

ssl_enable=NO

Cuando se establece en "NO", el servidor aceptará conexiones en texto sin cifrar, lo que pone los datos en riesgo de posibles ataques. La opción más segura es habilitar SSL, pero si se desea usar el servidor como directorio de escaneo en impresoras multifuncionales, actualmente, se debe elegir la opción "NO", ya que la mayoría de ellas no admiten conexiones FTP seguras.

Si activamos SSL, es necesario obtener un certificado SSL/TLS válido para poder utilizar esta opción. Una opción popular sin costo es a través de Let's Encrypt, una entidad sin fines de lucro que proporciona certificados gratuitos y confiables. Una vez obtenido el certificado, es necesario configurarlo en el archivo de configuración de VSFTPD, especificando la ruta a los archivos de certificado y clave privada en las opciones "rsa_cert_file" y "rsa_private_key_file", respectivamente. Sin embargo, en este primer servidor, no se está implementando parejas de clave pública/privada ni SSL, por lo que se recomienda borrar o comentar las líneas de código correspondientes.

Como ves, tenemos muchas directivas y todavía vamos a trabajar con algunas más que inicialmente están desactivadas.

Siguiendo con la edición del archivo de configuración, buscamos las directivas que aparecen en la siguiente lista y elimina el # para descomentarlas. Es importante asegurarse de que los valores sean los mismos que se muestran aquí:

anonymous_enable=NO
write_enable=YES 
local_enable=YES
chroot_local_users=YES

                        

Las nuevas directivas agregadas tienen las siguientes funciones:

anonymous_enable=NO
Si está configurado como NO, se negarán las conexiones anónimas.
write_enable=YES
Si está configurado como "SI", permite tanto subir como descargar archivos y carpetas. Si está configurado como "NO", se deniega la posibilidad de subir archivos y sólo se permite descargarlos.
local_enable=yes
Permite que las cuentas de usuario normales (definidas en el sistema Ubuntu en /etc/passwd) puedan iniciar sesión. Este ajuste debe estar habilitado para permitir cualquier inicio de sesión que no sea anónimo.
chroot_local_users=YES
Con esta opción, los usuarios normales que se conectan por FTP estarán limitados a acceder únicamente a su directorio /home. Si se desactiva esta opción, los usuarios podrán acceder a cualquier lugar en el servidor, lo que podría representar un grave problema de seguridad.

Necesitamos agregar algunas directivas adicionales que no se encuentran inicialmente en el archivo de configuración.

vsftpd_log_file=/var/log/vsftpd.log
allow_writeable_chroot=YES
pasv_addr_resolve=YES
pasv_address=129.151.228.46
pasv_max_port=50000
pasv_min_port=40000
                        
vsftpd_log_file=/var/log/vsftpd.log
El archivo vsftpd.log almacenará un registro de las actividades de los usuarios que se conectan y las acciones que realizan, como la transferencia de archivos, los intentos de inicio de sesión, etc. Además, este archivo de registro puede ser analizado para detectar posibles problemas o actividades sospechosas en el servidor. Para que se produzca el registro, también es necesario activar la directiva xferlog_enable=YES.
allow_writeable_chroot=YES
Permite que los usuarios puedan escribir en su directorio raíz de chroot (también conocido como jail, jaula o cárcel). Esto significa que los usuarios pueden crear, modificar o eliminar archivos y directorios dentro de su propio espacio aislado. Sin esta directiva, los usuarios sólo pueden leer los archivos en su directorio chroot y no tienen permisos de escritura.
pasv_addr_resolve=YES
Esta directiva y la siguiente sirven para que los clientes puedan accerder al servidor de manera pasiva. Cuando esta opción está establecida en "YES", vsftpd intentará resolver la dirección IP pública del servidor para usar en las conexiones pasivas. Si está establecida en "NO", vsftpd usará la dirección IP local del servidor.
pasv_address=129.151.228.46
Especifica la dirección IP externa que se usará en las conexiones entrantes en modo PASV(pasivo). Esto se usa para resolver problemas de direccionamiento en entornos de red NAT (Network Address Translation) donde los clientes detrás de un firewall o enrutador no pueden conectarse directamente a un servidor detrás de otro firewall o enrutador. Al especificar la dirección IP externa, los clientes pueden conectarse correctamente al servidor.
pasv_max_port=50000
Especifica el número máximo de puerto al que el servidor puede conectarse en modo pasivo. El modo pasivo es un tipo de conexión en el que el servidor FTP actúa como receptor y el cliente inicia la conexión. (Activo y pasivo está comentado arriba)
pasv_min_port=40000
Establece el puerto mínimo para la conexión pasiva (PASV) en el servidor FTP.

Con todas estas directivas y el firewall con los puertos requeridos abiertos, el servidor está listo para ser utilizado en plataformas en la nube, como OCI, AWS y similares.

Si has seguido todos los pasos de este tutorial has creado un servidor FTP con estas características:

  • Servidor FTP en modo pasivo.
  • No tiene SSL activado, aunque es recomendable por razones de seguridad, lo dejamos desconectado para ser compatible con impresoras multifuncionales que aún no admiten conexiones seguras FTP.
  • La restricción establece que al iniciar sesión en el cliente FTP, cada usuario local solo tiene acceso al directorio /home/mi_usuario_local, que es propietario del usuario. Por motivos de seguridad, no se permite ver ningún otro directorio del sistema o de otros usuarios.
  • Permisos de escritura para transferir, eliminar, renombrar, crear directorios, mover archivos, etc.
  • No se autorizan conexiones anónimas
  • Se crea un registro de la actividad del usuario para monitorear el servidor, incluyendo inicios de sesión, transferencias de archivos y otros temas relacionados con la seguridad, como intentos de inicio de sesión repetidos desde IP desconocidas.
Reiniciar servidor y comprobar estado

Siempre que se realizan cambios en las directivas de VSFTPD o en la configuración del firewall, es necesario reiniciar el servicio para que se apliquen los cambios.

Para reiniciar el servicio entramos:

sudo service vsftpd restart
                        

Además, es muy importante verificar que el servicio esté en ejecución. El archivo de configuración debe ser editado con mucho cuidado. Cualquier error de sintaxis, un espacio adicional o variables escritas de manera incorrecta pueden impedir la correcta ejecución del servicio.

Yo mismo, mientras realizaba pruebas para este tutorial, cometí un error al colocar un espacio adicional después de un símbolo igual y tardé un tiempo en descubrir por qué el servicio no funcionaba correctamente.

Para verificar el estado de los servicios, podemos utilizar cualquiera de estos comandos: service NombreServicio status o systemctl status NombreServicio. En este caso, son equivalentes. Introducimos el comando:

sudo service vsftpd status
                        

Si todo está funcionando correctamente, debería mostrar un estado "activo".

 vsftpd.service - vsftpd FTP server
     Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-02-02 19:07:12 UTC; 44s ago
    Process: 15777 ExecStartPre=/bin/mkdir -p /var/run/vsftpd/empty (code=exited, status=0/SUCCESS)
   Main PID: 15778 (vsftpd)
      Tasks: 1 (limit: 14240)
     Memory: 492.0K
     CGroup: /system.slice/vsftpd.service
             └─15778 /usr/sbin/vsftpd /etc/vsftpd.conf

Feb 02 19:07:12 ubuntusrv2 systemd[1]: Starting vsftpd FTP server...
Feb 02 19:07:12 ubuntusrv2 systemd[1]: Started vsftpd FTP server.
                        

Si recibimos una respuesta Active: failed (Result: exit-code), debemos revisar con mucha atención el archivo de configuración.

Usuarios de FTP

Con el servidor y firewall configurados, podemos conectarnos desde un cliente FTP con un usuario local y su contraseña. Si no tenemos un usuario, podemos crearlos con el comando useradd, como hemos visto en los artículos de Tallerdeapps.com. Debido a que este servidor FTP no está cifrado, debe utilizarse una contraseña segura.

En el artículo sobre SFTP, se recomienda por motivos de seguridad crear usuarios FTP que no tengan permisos para ejecutar comandos desde la terminal. Sin embargo, en el ejemplo de VSFTPD, la configuración actual no es compatible con esta opción. Para que la autenticación sea exitosa, el usuario debe tener permiso para iniciar sesión, de lo contrario el cliente FTP responderá con un error de autenticación.

sudo useradd -m usuario1
                        

Los parámetros utilizados son:

  • -m Indica que el usuario tendrá un directorio inicial en home/usuario1.
  • usuarios1 Es el nombre del usuario.

A continuación, se crea una contraseña segura para el usuario 'usuario1':

sudo passwd usuario1
                        

Para este usuario de ejemplo, cuando nos conectemos por FTP lo haremos dentro del directorio '/home/usuario1'.

Conexión al servidor por medio de diferentes clientes

Para conectarnos a un servidor FTP, necesitamos una aplicación cliente FTP y datos de conexión válidos para acceder al servidor. Hay una gran variedad de clientes disponibles para diferentes dispositivos y sistemas operativos, tanto con interfaces de línea de comandos como gráficas. En esta guía, mostraremos cómo conectarse a un servidor FTP usando FileZilla, en Windows desde "Ubicaciones de Red" y desde Android usando el cliente AndFTP.

También mostraremos cómo transferir documentos escaneados desde un equipo multifuncional Ricoh al servidor FTP. Con este sistema, tendremos acceso a los documentos escaneados desde cualquier lugar y dispositivo, ya sea en el hogar, la oficina, un teléfono o un ordenador.

Afortunadamente, la configuración y el proceso de conexión al servidor FTP es mucho más sencillo que la configuración del servidor. Aunque la configuración del servidor está limitada a perfiles muy técnicos, cualquier usuario puede fácilmente conectarse a un servidor FTP con un cliente y aprovechar sus ventajas.

Conexión desde Filezilla FTP

FileZilla es un software de cliente de FTP (File Transfer Protocol) gratuito y de código abierto. Se utiliza para transferir archivos entre un equipo local y un servidor de FTP remoto. FileZilla es compatible con los sistemas operativos Windows, MacOS y Linux y ofrece una interfaz fácil de usar para gestionar archivos y carpetas en un servidor FTP.

Además de la función básica de transferir archivos, FileZilla también ofrece funciones adicionales, como la capacidad de editar archivos directamente en el servidor, la opción de arrastrar y soltar archivos y la posibilidad de programar transferencias automáticas.

Para conectar al servidor, debemos rellenar los campos "Servidor", "Nombre de usuario" y "Contraseña" con los datos correspondientes. Si el puerto de control es el estándar 21, no es necesario rellenar el campo "Puerto". Tras pulsar el botón "Conexión rápida", tendremos acceso a la carpeta raíz del usuario. Con su interfaz intuitiva, transferir archivos en ambas direcciones y otras operaciones de manipulación de directorios y archivos son muy sencillas.

Conexión desde Ubicaciones de Red en Windows

En Windows, al crear una ubicación de red, se montará un acceso directo al servidor FTP en "Este PC" (antes llamado "Mi PC"). Crear una ubicación de red es sencillo. Para ello, abrimos el Explorador de archivos pulsando las teclas Windows + E. En la barra de navegación de la izquierda, hacemos clic en "Este PC". Esto desplegará una barra de menús en la parte superior con el botón "Agregar una ubicación de red". También podemos acceder a esta opción haciendo clic derecho en cualquier lugar del Explorador de archivos y seleccionando "Agregar una ubicación de red" en el menú contextual.

Al hacer clic en 'Siguiente', se abrirá una ventana donde se ingresará la URL del servidor, ya sea como dirección IP o como un nombre de dominio válido.

En la siguiente pantalla, desmarcaremos la opción de 'Inicio de sesión anónimo' y agregaremos un nombre de usuario válido en el campo correspondiente.

Por último, le asignaremos un nombre a la ubicación de red, que será el nombre que se mostrará en el acceso directo montado.

Si has llegado hasta aquí, significa que ya tienes montada tu unidad de red. ¡Felicidades!

Al hacer doble clic, se abrirá una ventana para ingresar las credenciales de inicio de sesión. Se recomienda marcar la opción de guardar contraseña, ya que en ocasiones puede haber comportamientos inesperados, como la falta de actualización en la transferencia de archivos.

Ya se pueden transferir archivos dentro y fuera de la unidad arrastrándolos. Además, disponemos de un menú de contexto al hacer clic con el botón derecho del ratón, con opciones como actualizar, crear carpetas, renombrar y otras comunes en entornos gráficos de iconos.

Conexión desde Android o Iphone

Existen para dispositivos móviles una gran variedad de clientes FTP. De todos los que he probado, personalmente me gusta AndFTP.

AndFTP es una aplicación gratuita para Android que permite la conexión y gestión de servidores FTP. Con esta aplicación, puedes subir y descargar archivos, crear y eliminar directorios, y realizar otras operaciones típicas en servidores FTP desde tu dispositivo Android.

Crear la carpeta local FTP

Antes de usar el cliente FTP, es conveniente crear la carpeta donde se guardarán los archivos descargados. Para ello, podemos utilizar la aplicación "Archivos" y crear una nueva carpeta. Una vez creada, podemos configurarla como la ubicación predeterminada para descargas en AndFTP. Para crear una carpeta nueva, abrimos la aplicación "Archivos" y seguimos los siguientes pasos.

Para crear una carpeta en la ubicación deseada, primero debemos acceder a la carpeta padre que la contendrá. Una vez dentro de la carpeta padre, podemos crear la carpeta nueva. En la mayoría de las aplicaciones, incluyendo "Archivos", el botón para crear una carpeta nueva se representa con un icono de carpeta y el símbolo "+" o "Nuevo". Por lo tanto, para crear una carpeta nueva en "Archivos", deberíamos seguir los siguientes pasos:
1. Abrir la aplicación "Archivos".
2. Navegar hasta la carpeta padre donde queremos crear la nueva carpeta.
3. Buscar y hacer clic en el botón de "Crear carpeta nueva".
4. Escribir el nombre deseado para la carpeta nueva y confirmar la creación de la carpeta.
Con estos pasos, habremos creado una carpeta nueva dentro de la carpeta padre que hayamos seleccionado previamente.

Configurar AndFTP

Cuando abrimos AndFTP, en la pantalla principal encontramos un botón en la parte superior con el símbolo "+", que nos permite crear nuevas conexiones a servidores FTP. Además, en el resto de la pantalla principal, podemos ver los accesos directos a los servidores FTP previamente configurados. Estos accesos directos nos permiten conectarnos rápidamente a los servidores sin tener que volver a configurarlos.

Crear un nuevo acceso directo en AndFTP es muy sencillo. Al pulsar el botón con el símbolo "+" en la pantalla principal, se mostrará un formulario donde podremos rellenar los siguientes campos:

  • Hostname: Dirección IP o dominio del servidor. Aquí introducimos la dirección IP o el nombre de dominio del servidor FTP o SFTP al que queremos conectarnos.
  • Tipo: Seleccionamos el protocolo de comunicación. En este ejemplo, el protocolo es FTP.
  • Puerto: Para FTP, el puerto predeterminado es el 21.
  • Carpeta remota: Opcionalmente, podemos especificar una carpeta dentro de la carpeta raíz del usuario que queremos utilizar como ubicación inicial de la conexión.
  • Usuario: Aquí escribimos el nombre de usuario que utilizamos para conectarnos al servidor.
  • Contraseña: Introducimos la contraseña correspondiente al nombre de usuario que hemos especificado anteriormente.
  • Carpeta local: Seleccionamos la carpeta de destino para las descargas. Por defecto, es el directorio raíz de la memoria interna del teléfono (/Storage/emulated). Si hemos creado una carpeta específica, la asignaremos aquí.
  • Carpeta remota: Opcionalmente, podemos especificar una carpeta dentro de la carpeta raíz del usuario que queremos utilizar como ubicación inicial de la conexión.

Una vez que hayamos rellenado estos campos, podemos guardar la configuración y utilizar el acceso directo para conectarnos al servidor de forma rápida y sencilla en el futuro.

Acceder a la nube con el acceso directo es muy rápido. En la imagen, puedes ver una captura del directorio raíz de uno de los usuarios que tengo en una instancia de OCI.

Desde el menú contextual (tres puntos arriba a la derecha) de AndFTP se pueden realizar las operaciones típicas de archivos, como la transferencia de archivos, crear directorios, eliminar archivos y directorios, renombrar, entre otras.

Algo que no hace AndFTP, al menos en la versión gratuita que conozco, es abrir directamente los archivos con la aplicación correspondiente. Los archivos siempre se descargan a la carpeta local predeterminada. Para abrirlos, debemos buscarlos desde la aplicación 'Archivos' o cualquier otra aplicación que sea adecuada según el tipo de documento.

Conexión desde impresoras multifuncionales Ricoh

Con las impresoras multifuncionales Ricoh, es posible enviar documentos escaneados a servidores utilizando diferentes protocolos, uno de los cuales es FTP. Para hacer esto, desde el panel de Android, buscaremos la aplicación "Gestión de Libreta de Direcciones" y agregaremos un nuevo destino de carpeta. En el menú desplegable, seleccionaremos el protocolo FTP y completaremos los campos con la información del servidor y del usuario.

De manera alternativa, también se pueden agregar direcciones de escáner desde el Web Image Monitor. Este es una pantalla que permite confirmar el estado y los ajustes de la máquina desde un ordenador. Cuando la impresora multifuncional y el ordenador estén conectados a una red, podrá acceder a Web Image Monitor introduciendo la dirección IP de la máquina en la barra de direcciones del navegador de Internet.

Al finalizar, se creará un nuevo destino de escaneo y podremos enviar documentos en formato PDF o TIFF/JPEG al servidor en la nube. La ventaja de utilizar carpetas compartidas en servidores en la nube es que podremos acceder a los documentos desde cualquier lugar y en cualquier momento, y desde cualquier dispositivo.

El archivo de registro

En el ejemplo que hemos desarrollado durante este artículo, se genera un archivo de registro de actividad llamado vsftpd.log, en el que se registran las conexiones al servidor y las operaciones de transferencia de archivos.

Te recuerdo que agregamos estas directivas al archivo vsftpd.conf para habilitar el registro: xferlog_enable=YES y vsftpd_log_file=/var/log/vsftpd.log.

Para consultar el archivo de registro podemos entrar:

sudo cat /var/log/vsftpd.log
                        

A continuación te muestro fragmentos de mi archivo de registro donde aparecen conexiones de usuarios y hosts reconocidos, pero también una gran cantidad de intentos repetidos de conexión desde IPs desconocidas donde hacen pruebas al azar con nombres de usuarios demasiado comunes y van probando contraseñas fáciles en serie.

Las siguientes conexiones son de uno de los servidores que administro. Durante el proceso de comunicación entre máquinas, se establece una conexión y se lleva a cabo la negociación del inicio de sesión. Si la conexión es exitosa, se permiten las transferencias de archivos entre el cliente y el servidor:

Wed Feb 1 22:27:18 2023 [pid 6597] CONNECT: Client "::ffff:79.116.194.190"
Wed Feb 1 22:27:18 2023 [pid 6596] [userftp] OK LOGIN: Client "::ffff:79.116.194.190"
Wed Feb 1 22:27:33 2023 [pid 6601] CONNECT: Client "::ffff:79.116.194.190"
Wed Feb 1 22:27:34 2023 [pid 6600] [userftp] OK LOGIN: Client "::ffff:79.116.194.190"
Wed Feb 1 22:27:34 2023 [pid 6604] [userftp] OK UPLOAD: Client "::ffff:79.116.194.190", "/transferencia.pdf", 115674 bytes, 2138.03 Kbyte/sec
                        

Pequeño extracto de intentos de ataque desde hosts maliciosos. Se producen miles de intentos diarios de intentos de inicio de sesión por la técnica de fuerza bruta. Consiste en programar conexiones reiteradas usando diccionarios con usuarios y contraseñas. Si nuestro usuario y contraseña es demasiado común o previsible, posiblemente esté en el diccionario y puedan acceder Este es un extracto de los intentos de ataque desde hosts maliciosos. Diariamente, se registran miles de intentos de inicio de sesión utilizando la técnica de fuerza bruta. Esta técnica implica programar conexiones reiteradas usando diccionarios con nombres de usuario y contraseñas predecibles o comunes. Si nuestro nombre de usuario y contraseña son predecibles, es posible que se encuentren en un diccionario y los atacantes puedan acceder a nuestras cuentas.

Thu Feb  2 10:09:31 2023 [pid 11270] CONNECT: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:32 2023 [pid 11269] [administrator] FAIL LOGIN: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:33 2023 [pid 11275] CONNECT: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:35 2023 [pid 11274] [administrator] FAIL LOGIN: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:36 2023 [pid 11277] CONNECT: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:38 2023 [pid 11276] [user] FAIL LOGIN: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:39 2023 [pid 11279] CONNECT: Client "::ffff:152.89.62.52"
Thu Feb  2 10:09:41 2023 [pid 11278] [user] FAIL LOGIN: Client "::ffff:152.89.62.52"

Sat Feb 11 05:16:49 2023 [pid 122286] CONNECT: Client "51.178.145.25"
Sat Feb 11 05:16:51 2023 [pid 122285] [admin] FAIL LOGIN: Client "51.178.145.25"
Sat Feb 11 05:16:52 2023 [pid 122291] CONNECT: Client "51.178.145.25"
Sat Feb 11 05:16:54 2023 [pid 122290] [admin] FAIL LOGIN: Client "51.178.145.25"

Sat Feb 11 05:30:03 2023 [pid 122941] CONNECT: Client "51.178.145.25"
Sat Feb 11 05:30:05 2023 [pid 122940] [wwwroot] FAIL LOGIN: Client "51.178.145.25"

Tue Feb 14 01:42:40 2023 [pid 156671] CONNECT: Client "61.220.133.198"
Tue Feb 14 01:42:43 2023 [pid 156670] [trash] FAIL LOGIN: Client "61.220.133.198"
Tue Feb 14 01:42:45 2023 [pid 156675] CONNECT: Client "61.220.133.198"
Tue Feb 14 01:42:46 2023 [pid 156674] [trash] FAIL LOGIN: Client "61.220.133.198"
Tue Feb 14 01:42:48 2023 [pid 156677] CONNECT: Client "61.220.133.198", "Connection refused: too many sessions for this address."
Tue Feb 14 01:42:49 2023 [pid 156681] CONNECT: Client "61.220.133.198", "Connection refused: too many sessions for this address."

                        

En las dos últimas líneas del extracto, se puede ver que el servidor rechaza a un cliente por realizar abuso de intentos de inicio de sesión. Para prevenir este tipo de ataques, se pueden aplicar medidas de seguridad, como la directiva 'max_per_ip' en el archivo de configuración de vsftpd (/etc/vsftpd.conf), que limita el número de sesiones permitidas por dirección IP. Otra medida de seguridad es habilitar 'tcp_wrappers=YES' en vsftpd.conf y configurar los archivos /etc/hosts.allow y /etc/hosts.deny para restringir o permitir el acceso a los servicios FTP. Por ejemplo, se puede permitir el acceso solo desde ciertas direcciones IP o restringir el acceso desde hosts conocidos por ser maliciosos.

Solución a algunos errores

Estos son algunos errores comunes que podemos encontrar al configurar un servidor vsftpd, y debo reconocer que algunos de ellos me han hecho perder mucho tiempo.

(1) Si hay problemas de conexión y no permite conectarse tras revisar los puertos del firewall y los datos de inicio de sesión, es posible que el servicio no esté en ejecución. Si el comando para iniciar el servicio devuelve un error, debemos prestar atención a la sintaxis del archivo de configuración. Además, es importante asegurarse de que los nombres de las directivas estén escritos correctamente, sin espacios en blanco antes o después del símbolo igual. Por ejemplo: listen=YES es correcto pero listen = YES da error.

Desde FileZilla, con el servicio detenido, obtenemos este mensaje de error:

(2) Si estamos utilizando usuarios enjaulados, debemos activar la directiva allow_writeable_chroot=YES, o de lo contrario recibiremos el mensaje de error: "500 OOPS: vsftpd: refusing to run with writable root inside chroot()".

(3) Un error común que se encuentra al intentar acceder a un servidor FTP que funciona en una instancia con una dirección IP privada es utilizar una dirección IP pública. Para solucionar este error, debemos incluir en el archivo de configuración de la instancia dos directivas: pasvaddrresolve=YES y pasv_address=xxx.xxx.xxx.xxx, donde xxx.xxx.xxx.xxx es la dirección IP pública del servidor. Si esto no se hace, recibiremos el error: "El servidor envió una respuesta pasiva con una dirección no enrutable".

(4) Existe un error en vsftpd que puede impedir que el servidor escuche direcciones IPv6 en ciertas condiciones. El mensaje de error devuelto puede incluir la frase "Modo Pasivo" o simplemente "PASV" seguido de un número, como en el siguiente ejemplo:

227 Entering Passive Mode (0,0,0,0,31,84)
                        

Este tipo de error puede ocurrir al intentar conectarse desde clientes Android o desde Windows utilizando la función "Ubicaciones de Red". Para solucionarlo, podemos deshabilitar las escuchas en IPv6 añadiendo la siguiente directiva en el archivo de configuración:

listen_ipv6=NO
listen=YES
                        

(5) En Windows, el comando ftp en la terminal no es compatible con servidores pasivos, por lo que no podemos conectarnos. Sin embargo, desde Linux, el mismo comando funciona perfectamente. A continuación, se muestra la respuesta de error que se obtiene al utilizar el comando ftp en Windows:

>ftp 129.151.228.46
Conectado a 129.151.228.46.
220 (vsFTPd 3.0.3)
200 Always in UTF8 mode.
Usuario (129.151.228.46:(none)): usuario1
331 Please specify the password.
Contraseña:
230 Login successful.
ftp> dir
500 Illegal PORT command.
425 Use PORT or PASV first.
ftp>

                        
<-- Funciones al final de DOM -->