Configuración de un Servidor FTP Seguro con VSFTPD en Ubuntu Server

Si bien hay una versión de FileZilla Server para Linux, VSFTPD es la solución nativa más robusta y ampliamente utilizada en Ubuntu Server.

Paso 1: Instalar VSFTPD

Abre la terminal en tu Ubuntu Server y actualiza los paquetes, luego instala vsftpd:

Bash
sudo apt update
sudo apt install vsftpd

Paso 2: Configurar el Firewall (UFW)

Asegúrate de que el firewall (UFW) permita las conexiones FTP (puertos 20 y 21) y también el rango de puertos para el modo pasivo (usaremos 40000-50000 como ejemplo, que deberás definir luego en la configuración de vsftpd):

Bash
# Permitir SSH (si estás conectado remotamente)
sudo ufw allow OpenSSH
# Permitir puertos FTP
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
# Permitir rango de puertos para modo pasivo
sudo ufw allow 40000:50000/tcp
# Activar el firewall
sudo ufw enable

Paso 3: Realizar una Copia de Seguridad y Configurar VSFTPD

Haz una copia de seguridad del archivo de configuración original y ábrelo para editarlo:

Bash
sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.orig
sudo nano /etc/vsftpd.conf

Dentro del archivo, modifica o asegura las siguientes líneas (descomenta si tienen un # al principio, o añádelas):

ConfiguraciónValorExplicación
anonymous_enableNODeshabilita el acceso anónimo (recomendado).
local_enableYESPermite a los usuarios locales iniciar sesión.
write_enableYESPermite comandos de modificación del sistema de archivos (subir/borrar).
chroot_local_userYESEncierra a los usuarios en su directorio personal (seguridad).
pasv_min_port40000Puerto mínimo para conexiones pasivas.
pasv_max_port50000Puerto máximo para conexiones pasivas.

Guarda y cierra el archivo (Ctrl+X, Y, Enter en nano).

Paso 4: Crear un Usuario FTP Específico

Por seguridad, es mejor usar un usuario dedicado para el FTP, en lugar de un usuario del sistema que también tenga acceso por SSH:

Bash
# Crear un nuevo usuario (ej: 'ftpuser')
sudo useradd -m -s /usr/sbin/nologin ftpuser
# Establecer contraseña
sudo passwd ftpuser

Paso 5: Reiniciar el Servicio

Para aplicar todos los cambios, reinicia vsftpd:

Bash
sudo systemctl restart vsftpd

💻 Conexión con el Cliente FileZilla

Una vez que VSFTPD está configurado en tu Ubuntu Server, puedes usar el Cliente FileZilla para conectarte:

  1. Abre el Cliente FileZilla en tu PC.

  2. Ve al Gestor de Sitios (Archivo > Gestor de Sitios).

  3. Haz clic en Nuevo Sitio y rellena los siguientes datos:

    • Protocolo: FTP (o FTPS si configuraste SSL/TLS en el servidor).

    • Servidor: La dirección IP de tu Ubuntu Server (ej: 192.168.1.100 o tu IP pública si estás fuera de la LAN).

    • Puerto: 21 (el estándar).

    • Tipo de Conexión: Normal.

    • Usuario: ftpuser (o el que hayas creado).

    • Contraseña: La contraseña que estableciste para ese usuario.

  4. Haz clic en Conectar.

Si todo está correcto, el cliente FileZilla se conectará al servidor VSFTPD en tu Ubuntu Server, y podrás ver tus directorios remotos y transferir archivos.

Este video explica la configuración de un servidor FTP en Ubuntu Server y cómo conectarse con FileZilla: Configure FTP Server on Ubuntu Server 20.04 and connect with Filezilla.

sudo systemctl status vsftpd

Es crucial verificar tanto el estado del servicio como la conectividad del puerto para asegurar que tu servidor FTP (generalmente VSFTPD en Ubuntu) esté activo y accesible.

Aquí tienes los métodos más efectivos para saber si el servicio FTP está activo en tu Ubuntu Server:

1. Verificar el Estado del Servicio (VSFTPD)

El método más directo es preguntar al gestor de servicios del sistema, Systemd.

Utiliza el comando systemctl status para ver la información detallada del servicio VSFTPD:

Bash
sudo systemctl status vsftpd

Interpretación de la Respuesta:

  • Active: active (running): ¡Esto es lo que quieres ver! Significa que el demonio de VSFTPD se está ejecutando correctamente y está listo para aceptar conexiones.

  • Active: inactive (dead): El servicio está detenido. Necesitas iniciarlo con sudo systemctl start vsftpd.

  • Active: failed: El servicio intentó iniciar, pero falló. Debes revisar los registros (journalctl -xe) para diagnosticar el problema (a menudo es un error en el archivo de configuración /etc/vsftpd.conf).

Opcional (Formato simple): Para una respuesta más concisa, puedes usar:

Bash
systemctl is-active vsftpd

Si la respuesta es active, el servicio está corriendo.


2. Verificar si el Puerto 21 está Escuchando

Aunque el servicio esté running, puede que no esté escuchando en el puerto correcto. Esto lo verificas con los comandos de red que muestran los sockets abiertos.

Utiliza el comando ss (Socket Statistics) para ver si el puerto FTP (por defecto el 21) está en estado LISTEN (escuchando conexiones).

Bash
sudo ss -tlpn | grep 21

Interpretación de la Respuesta:

Una salida como esta indica que el servicio está escuchando en el puerto 21:

LISTEN 0 128 0.0.0.0:21 0.0.0.0:* users:(("vsftpd",pid=1234,fd=X))
  • LISTEN: Confirma que el puerto 21 está abierto y esperando conexiones.

  • 0.0.0.0:21: Indica que está escuchando en todas las interfaces de red (0.0.0.0) en el puerto 21.

  • users:(("vsftpd",pid=1234,fd=X)): (Si tienes permiso de superusuario) Te muestra el proceso de vsftpd asociado al puerto.


3. Probar la Conexión Remota (Desde otra máquina o localmente)

La prueba definitiva es intentar la conexión, que simula el uso de un cliente como FileZilla.

Prueba con telnet o nc (Netcat)

Si tienes instalado telnet (o nc que es más moderno) en la máquina cliente (o incluso en el servidor mismo), puedes probar la conexión al puerto 21.

Bash
# Para probar desde el servidor a sí mismo
telnet 127.0.0.1 21

# o usando tu IP de red
telnet TU_IP_DEL_SERVIDOR 21

Interpretación de la Respuesta:

  • Conexión Exitosa: Si se conecta, verás un mensaje de bienvenida del servidor VSFTPD (por ejemplo, 220 (vsFTPd 3.0.3)), lo que significa que el servicio está activo y el firewall no está bloqueando la conexión de control.

  • Error o Timeout: Si obtienes un error como "Connection refused" (Conexión rechazada) o un timeout, puede ser que el servicio no esté activo, o que el firewall (UFW) esté bloqueando el puerto 21 (y el rango de puertos pasivos).

Si la conexión falla, asegúrate de haber abierto los puertos en el firewall (UFW) como se describió en la respuesta anterior:

Bash
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 40000:50000/tcp  # (O el rango que definiste en vsftpd.conf)
sudo ufw status

El Error Crítico y su Solución

El error que te aparece es muy específico:

Respuesta: 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Error: Error critico: No se pudo conectar al servidor

¿Qué Significa este Error?

Este error se debe a una actualización de seguridad en versiones recientes de VSFTPD.

  1. chroot(): Configuraste VSFTPD para "encerrar" al usuario (chroot_local_user=YES) en su directorio personal (/home/sotelo, por ejemplo). Esto es una buena práctica de seguridad.

  2. writable root: El problema es que el directorio raíz de este entorno restringido (en este caso, el directorio personal del usuario) tiene permisos de escritura (writable).

  3. refusing to run: VSFTPD considera esto un riesgo de seguridad (podría permitir que el usuario suba archivos maliciosos y los ejecute) y, por lo tanto, se niega a completar la conexión.

Solución: Quitar los Permisos de Escritura del Directorio Raíz

La solución es quitar los permisos de escritura del directorio que funciona como raíz del chroot (el directorio personal del usuario sotelo).

Ejecuta estos comandos en tu Ubuntu Server:

1. Quitar Permisos de Escritura del Home Directory

Establece permisos de solo lectura (read-only) para el propietario en el directorio principal del usuario FTP:

Bash
sudo chmod a-w /home/sotelo

Este comando elimina el permiso de escritura (w) para 'a' (all users), dejando solo lectura y ejecución, que es suficiente para la navegación.

2. Crear un Subdirectorio Específico para Subidas

Ahora que /home/sotelo es de solo lectura, el usuario no puede subir archivos allí. Debes crear un subdirectorio dentro de /home/sotelo donde sí tenga permiso para subir archivos:

Bash
# Crea un directorio donde el usuario SÍ podrá escribir
sudo mkdir /home/sotelo/ftp_files
# Otorga permisos de escritura al usuario 'sotelo' SOLO en este nuevo subdirectorio
sudo chown sotelo:sotelo /home/sotelo/ftp_files

3. Reiniciar el Servicio VSFTPD

Asegúrate de aplicar los cambios reiniciando el servicio:

Bash
sudo systemctl restart vsftpd

Pasos completos para solucionar:

  1. Primero, corrige el error de chroot:

bash
sudo chmod a-w /home/sotelo
  1. Reinicia el servicio:

bash
sudo systemctl restart vsftpd
# o si el servicio se llama diferente
sudo systemctl restart vsttpd

Comentarios

Entradas más populares de este blog

ejercicios-Crear Carpeta y Archivo de Texto en Ubuntu

Tutorial de Carpetas y Directorios en Ubuntu Linux

Instalar Docker en Ubuntu Server usando docker.io