Hosting · 14 min read · Nov 24, 2025

Alojamiento Virtual Con PureFTPd Y MySQL (Incl. Gestión De Cuotas Y Ancho De Banda) En OpenSUSE 13.2

Alojamiento Virtual Con PureFTPd Y MySQL (Incl. Gestión De Cuotas Y Ancho De Banda) En OpenSUSE 13.2

Versión 1.0
Autor: Srijan Kishore
Sigue a howtoforge en Twitter
Última edición 19/Nov/2014

Este documento describe cómo instalar un servidor PureFTPd que utiliza usuarios virtuales de una base de datos MySQL en lugar de usuarios reales del sistema. Esto es mucho más eficiente y permite tener miles de usuarios ftp en una sola máquina. Además de eso, mostraré el uso de cuotas y límites de ancho de banda de carga/descarga con esta configuración. Las contraseñas se almacenarán encriptadas como cadenas MD5 en la base de datos.

Para la administración de la base de datos MySQL, puedes usar herramientas basadas en la web como phpMyAdmin, que también se instalará en este tutorial. phpMyAdmin es una interfaz gráfica cómoda, lo que significa que no tienes que lidiar con la línea de comandos.

¡Este documento se presenta sin garantía de ningún tipo! Quiero decir que esta no es la única forma de configurar un sistema así. Hay muchas maneras de lograr este objetivo, pero este es el camino que elijo.

1 Nota Preliminar

En este tutorial utilizo el nombre de host server1.example.com con la dirección IP 192.168.0.100. Estas configuraciones pueden diferir para ti, así que debes reemplazarlas donde sea apropiado. Debes tener una instalación básica de Open Suse antes de continuar como se describe en este tutorial.

2 Instalar MariaDB, Apache2 Y phpMyAdmin

MariaDB, Apache y los módulos PHP necesarios para phpMyAdmin se pueden instalar de la siguiente manera:

zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd
server1:~ # zypper install mariadb mariadb-client apache2 apache2-mod_php5 php5-mysql php5-mcrypt php5-mbstring php5-gd  
Cargando datos del repositorio...  
Leyendo paquetes instalados...  
Resolviendo dependencias de paquetes...
  
Problema: php5-mysql-5.6.1-4.1.x86_64 requiere php5 = 5.6.1, pero este requisito no puede ser proporcionado  
  proveedores desinstalables: php5-5.6.1-1.1.x86_64[openSUSE-13.2-0]  
                   php5-5.6.1-1.1.i586[repo-oss]  
                   php5-5.6.1-1.1.x86_64[repo-oss]  
                   php5-5.6.1-4.1.i586[repo-update]  
                   php5-5.6.1-4.1.x86_64[repo-update]  
  Solución 1: Se realizarán las siguientes acciones:  
  no instalar php5-mysql-5.6.1-4.1.x86_64  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  Solución 2: Se realizarán las siguientes acciones:  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar apache2-mod_php5-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  no instalar php5-mbstring-5.6.1-4.1.x86_64  
  no instalar php5-mysql-5.6.1-4.1.x86_64  
  Solución 3: Se realizarán las siguientes acciones:  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar apache2-mod_php5-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  no instalar php5-mbstring-5.6.1-4.1.x86_64  
  Solución 4: Se realizarán las siguientes acciones:  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar apache2-mod_php5-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  no instalar php5-mbstring-5.6.1-4.1.x86_64  
  Solución 5: Se realizarán las siguientes acciones:  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar apache2-mod_php5-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  no instalar php5-mbstring-5.6.1-4.1.x86_64  
  Solución 6: Se realizarán las siguientes acciones:  
  no instalar php5-mcrypt-5.6.1-4.1.x86_64  
  no instalar apache2-mod_php5-5.6.1-4.1.x86_64  
  no instalar php5-gd-5.6.1-4.1.x86_64  
  no instalar php5-mbstring-5.6.1-4.1.x86_64  
  Solución 7: desinstalación de patterns-openSUSE-minimal_base-conflicts-20141007-2.1.x86_64  
  Solución 8: romper php5-mysql-5.6.1-4.1.x86_64 ignorando algunas de sus dependencias  

Elige entre las soluciones anteriores por número o cancela [1/2/3/4/5/6/7/8/c] (c): <--7

Luego creamos los enlaces de inicio del sistema para MySQL (para que MySQL se inicie automáticamente cada vez que el sistema arranca) y comenzamos el servidor MySQL:

systemctl enable mysql.service  
systemctl start mysql.service

Para asegurar la instalación de MySQL, ejecuta:

mysql_secure_installation
server1:~ # mysql_secure_installation  
/usr/bin/mysql_secure_installation: línea 379: find_mysql_client: comando no encontrado  
  
NOTA: ¡SE RECOMIENDA EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT PARA TODOS LOS SERVIDORES MariaDB EN USO EN PRODUCCIÓN!  
      ¡LEA CADA PASO CUIDADOSAMENTE!  
  
Para iniciar sesión en MariaDB y asegurarla, necesitaremos la contraseña actual del usuario root.  Si acabas de instalar MariaDB y no has establecido la contraseña de root aún, la contraseña estará en blanco, así que solo debes presionar enter aquí.  
  
Introduce la contraseña actual para root (presiona enter si no hay):   
OK, se utilizó la contraseña correctamente, continuando...
  
Establecer la contraseña de root asegura que nadie pueda iniciar sesión en el usuario root de MariaDB sin la autorización adecuada.  
  
¿Establecer contraseña de root? [Y/n] <--ENTER  
Nueva contraseña: <--mariadbpassword  
Reingresa la nueva contraseña: <--mariadbpassword  
¡Contraseña actualizada con éxito!  
Recargando tablas de privilegios..  
 ... ¡Éxito!  
  
Por defecto, una instalación de MariaDB tiene un usuario anónimo, permitiendo que cualquiera inicie sesión en MariaDB sin tener que tener una cuenta de usuario creada para ellos.  Esto está destinado solo para pruebas y para que la instalación sea un poco más fluida.  Debes eliminarlos antes de pasar a un entorno de producción.  
  
¿Eliminar usuarios anónimos? [Y/n] <--ENTER  
 ... ¡Éxito!  
  
Normalmente, solo se debe permitir que root se conecte desde 'localhost'.  Esto asegura que alguien no pueda adivinar la contraseña de root desde la red.  
  
¿Deshabilitar el inicio de sesión remoto de root? [Y/n] <--ENTER  
 ... ¡Éxito!  
  
Por defecto, MariaDB viene con una base de datos llamada 'test' a la que cualquiera puede acceder.  Esto también está destinado solo para pruebas y debe eliminarse antes de pasar a un entorno de producción.  
  
¿Eliminar la base de datos de prueba y el acceso a ella? [Y/n] <--ENTER  
 - Eliminando base de datos de prueba...  
 ... ¡Éxito!  
 - Eliminando privilegios en la base de datos de prueba...  
 ... ¡Éxito!  
  
Recargar las tablas de privilegios asegurará que todos los cambios realizados hasta ahora surtan efecto de inmediato.  
  
¿Recargar tablas de privilegios ahora? [Y/n] <--ENTER  
 ... ¡Éxito!  
  
Limpiando...  
  
¡Todo listo!  Si has completado todos los pasos anteriores, tu instalación de MariaDB ahora debería estar segura.  
  
¡Gracias por usar MariaDB!  
server1:~ #

Ahora tu configuración de MySQL debería estar asegurada.

Luego creamos los enlaces de inicio del sistema para Apache (para que se inicie automáticamente cada vez que el sistema arranca) y lo iniciamos:

systemctl enable apache2.service  
systemctl start apache2.service

phpMyAdmin se puede instalar de la siguiente manera:

zypper install phpmyadmin

Para asegurarnos de que podemos acceder a phpMyAdmin, edita el archivo de la siguiente manera:

vi /etc/apache2/conf.d/phpMyAdmin.conf

Agrega el alias de la siguiente manera:

Alias /phpMyAdmin /srv/www/htdocs/phpMyAdmin
Alias /phpmyadmin /srv/www/htdocs/phpMyAdmin
[...]

Antes de iniciar apache, necesitamos seguir el enlace y hacer cambios en httpd.conf

vi /etc/apache2/httpd.conf

Nota: si los valores del archivo son diferentes, cambia el valor de la siguiente manera:

Comenta estas líneas y agrega estas líneas

#  
#    Options None  
#    AllowOverride None  
#    Order deny,allow  
#   Deny from all  
#  
  
  
Options None  
AllowOverride None  
Require all denied  

A continuación, necesitamos crear el archivo de configuración para phpmyadmin como

cd /srv/www/htdocs/phpMyAdmin  
cp config.sample.inc.php config.inc.php

En el archivo de configuración, puedes ver que phpmyadmin espera una base de datos llamada “phpmyadmin” que contiene las tablas pma:

[...]  
$cfg['Servers'][$i]['pmadb']               = 'phpmyadmin';  
[...]  

Así que creamos una:

echo "create database phpmyadmin;" | mysql -u root -p 'mariadbpassword'

y cargamos las tablas desde la documentación de phpmyadmin.

mysql -u root -p 'mariadbpassword' < /usr/share/doc/packages/phpMyAdmin/examples/create_tables.sql

Ahora inicia el servicio de Apache

systemctl enable apache2.service  
systemctl restart apache2.service

Ahora podemos acceder a phpmyadmin en http://192.168.0.100/phpmyadmin O en http://server1.example.com

3 Instalar PureFTPd Con Soporte MySQL

El paquete PureFTPd de OpenSUSE admite varios backends, como MySQL, PostgreSQL, LDAP, etc. Por lo tanto, todo lo que tenemos que hacer es instalar el paquete normal de PureFTPd:

 zypper install pure-ftpd

Luego creamos un grupo ftp (ftpgroup) y un usuario (ftpuser) al que se mapearán todos nuestros usuarios virtuales. Reemplaza el grupo y el ID de usuario 2001 con un número que esté libre en tu sistema:

groupadd -g 2001 ftpgroup  
useradd -u 2001 -s /bin/false -d /bin/null -c "usuario pureftpd" -g ftpgroup ftpuser

4 Crear La Base De Datos MySQL Para PureFTPd

Ahora creamos una base de datos llamada pureftpd y un usuario MySQL llamado pureftpd que el demonio PureFTPd utilizará más adelante para conectarse a la base de datos pureftpd:

mysql -u root -p
CREATE DATABASE pureftpd;  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost' IDENTIFIED BY 'ftpdpass';  
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON pureftpd.* TO 'pureftpd'@'localhost.localdomain' IDENTIFIED BY 'ftpdpass';  
FLUSH PRIVILEGES;

Reemplaza la cadena ftpdpass con la contraseña que desees usar para el usuario MySQL pureftpd. Aún en la consola de MySQL, creamos la tabla de base de datos que necesitamos (sí, ¡solo hay una tabla!):

USE pureftpd;
CREATE TABLE `ftpd` (  
User varchar(16) NOT NULL default '',  
status enum('0','1') NOT NULL default '0',  
Password varchar(64) NOT NULL default '',  
Uid varchar(11) NOT NULL default '-1',  
Gid varchar(11) NOT NULL default '-1',  
Dir varchar(128) NOT NULL default '',  
ULBandwidth smallint(5) NOT NULL default '0',  
DLBandwidth smallint(5) NOT NULL default '0',  
comment tinytext NOT NULL,  
ipaccess varchar(15) NOT NULL default '*',  
QuotaSize smallint(5) NOT NULL default '0',  
QuotaFiles int(11) NOT NULL default 0,  
PRIMARY KEY (User),  
UNIQUE KEY User (User)  
)  ENGINE=MyISAM;
quit;

Ahora puedes acceder a phpMyAdmin en http://server1.example.com/phpMyAdmin/ (también puedes usar la dirección IP en lugar de server1.example.com) en un navegador e iniciar sesión como el usuario pureftpd. Luego puedes echar un vistazo a la base de datos. Más adelante puedes usar phpMyAdmin para administrar tu servidor PureFTPd.

5 Configurar PureFTPd

Edita /etc/pure-ftpd/pure-ftpd.conf y asegúrate de que las líneas ChrootEveryone, AnonymousOnly, MySQLConfigFile y CreateHomeDir estén habilitadas y se vean así:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
ChrootEveryone              yes  
[...]  
AnonymousOnly               no  
[...]  
MySQLConfigFile              /etc/pure-ftpd/pureftpd-mysql.conf  
[...]  
CreateHomeDir               yes  
[...]  

La configuración ChrootEveryone hará que PureFTPd chroot a cada usuario virtual en su directorio de inicio, por lo que no podrá navegar por directorios y archivos fuera de su directorio de inicio. La línea CreateHomeDir hará que PureFTPd cree el directorio de inicio de un usuario cuando el usuario inicie sesión y el directorio de inicio aún no exista. AnonymousOnly debe estar configurado en no porque de lo contrario solo se permitirán sesiones FTP anónimas.

Luego creamos /edit /etc/pure-ftpd/pureftpd-mysql.conf. Debería verse así:

vi /etc/pure-ftpd/pureftpd-mysql.conf
MYSQLSocket      /var/run/mysql/mysql.sock  
#MYSQLServer     localhost  
#MYSQLPort       3306  
MYSQLUser       pureftpd  
MYSQLPassword   ftpdpass  
MYSQLDatabase   pureftpd  
#MYSQLCrypt md5, cleartext, crypt() o password() - md5 es MUY RECOMENDABLE en lugar de texto claro  
MYSQLCrypt      md5  
MYSQLGetPW      SELECT Password FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetUID     SELECT Uid FROM ftpd WHERE User="\L" AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetGID     SELECT Gid FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MYSQLGetDir     SELECT Dir FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthUL SELECT ULBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetBandwidthDL SELECT DLBandwidth FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTASZ   SELECT QuotaSize FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")  
MySQLGetQTAFS   SELECT QuotaFiles FROM ftpd WHERE User="\L"AND status="1" AND (ipaccess = "*" OR ipaccess LIKE "\R")

Asegúrate de reemplazar la cadena ftpdpass con la contraseña real para el usuario MySQL pureftpd en la línea MYSQLPassword. ¡Ten en cuenta que usamos md5 como método MYSQLCrypt, lo que significa que almacenaremos las contraseñas de los usuarios como una cadena MD5 en la base de datos, lo cual es mucho más seguro que usar contraseñas en texto claro!

Ahora creamos los enlaces de inicio del sistema para PureFTPd y lo iniciamos:

systemctl enable pure-ftpd  
systemctl start pure-ftpd

6 Poblar La Base De Datos Y Probar

Para poblar la base de datos, puedes usar la consola de MySQL:

mysql -u root -p
USE pureftpd;

Ahora creamos el usuario exampleuser con el estado 1 (lo que significa que su cuenta ftp está activa), la contraseña secret (que se almacenará encriptada usando la función MD5 de MySQL), el UID y GID 2001 (usa el ID de usuario y el ID de grupo que creaste al final del paso dos), el directorio de inicio /home/www.example.com, un ancho de banda de carga y descarga de 100 KB/sec. (kilobytes por segundo), y una cuota de 50 MB:

INSERT INTO `ftpd` (`User`, `status`, `Password`, `Uid`, `Gid`, `Dir`, `ULBandwidth`, `DLBandwidth`, `comment`, `ipaccess`, `QuotaSize`, `QuotaFiles`) VALUES ('exampleuser', '1', MD5('secret'), '2001', '2001', '/home/www.example.com', '100', '100', '', '*', '50', '0');
quit;

Ahora abre tu programa cliente FTP en tu estación de trabajo (algo como WS_FTP o SmartFTP si estás en un sistema Windows o gFTP en un escritorio Linux) e intenta conectarte. Como nombre de host, usa server1.example.com (o la dirección IP del sistema), el nombre de usuario es exampleuser y la contraseña es secret.

Si puedes conectarte, ¡felicitaciones! Si no, algo salió mal.

Ahora, si ejecutas

ls -l /home/
server1:~ # ls -l /home/  
total 0  
drwxr-xr-x 1 administrator users    128 Nov  7 14:30 administrator  
drwxr-xr-x 1 ftpuser       ftpgroup  18 Nov 19 14:32 www.example.com  
server1:~ #

debes ver que el directorio /home/www.example.com (el directorio de inicio de exampleuser) se ha creado automáticamente, y es propiedad de ftpuser y ftpgroup (el usuario/grupo que creamos al final del paso dos):

7 Administración De La Base De Datos

Para la mayoría de las personas, es más fácil si tienen una interfaz gráfica para MySQL; por lo tanto, también puedes usar phpMyAdmin (en este ejemplo en http://server1.example.com/phpMyAdmin/ o http://192.168.0.100/phpMyAdmin/) para administrar la base de datos pureftpd.

Siempre que quieras crear un nuevo usuario, debes crear una entrada en la tabla ftpd, así que explicaré las columnas de esta tabla aquí:

Tabla ftpd:

  • User: El nombre del usuario virtual de PureFTPd (por ejemplo, exampleuser).

  • status: 0 o 1. 0 significa que la cuenta está deshabilitada, el usuario no puede iniciar sesión.

  • Password: La contraseña del usuario virtual. Asegúrate de usar la función MD5 de MySQL para guardar la contraseña encriptada como una cadena MD5:


  • UID: El ID de usuario del usuario ftp que creaste al final del paso dos (por ejemplo, 2001).

  • GID: El ID de grupo del grupo ftp que creaste al final del paso dos (por ejemplo, 2001).

  • Dir: El directorio de inicio del usuario virtual de PureFTPd (por ejemplo, /home/www.example.com). Si no existe, se creará cuando el nuevo usuario inicie sesión por primera vez a través de FTP. El usuario virtual estará encarcelado en este directorio de inicio, es decir, no puede acceder a otros directorios fuera de su directorio de inicio.

  • ULBandwidth: Ancho de banda de carga del usuario virtual en KB/sec. (kilobytes por segundo). 0 significa ilimitado.

  • DLBandwidth: Ancho de banda de descarga del usuario virtual en KB/sec. (kilobytes por segundo). 0 significa ilimitado.

  • comment: Puedes ingresar cualquier comentario aquí (por ejemplo, para tu administración interna). Normalmente dejas este campo vacío.

  • ipaccess: Ingresa direcciones IP aquí que están permitidas para conectarse a esta cuenta FTP. * significa que cualquier dirección IP está permitida para conectarse.

  • QuotaSize: Espacio de almacenamiento en MB (no KB, como en ULBandwidth y DLBandwidth) que el usuario virtual puede usar en el servidor FTP. 0 significa ilimitado.

  • QuotaFiles: cantidad de archivos que el usuario virtual puede guardar en el servidor FTP. 0 significa ilimitado.

8 FTP Anónimo

Si deseas crear una cuenta ftp anónima (una cuenta ftp a la que todos pueden iniciar sesión sin una contraseña), necesitas un usuario y un grupo llamados ftp. Ambos se han creado automáticamente cuando instalaste el paquete pure-ftpd, así que no necesitas crearlos manualmente. Sin embargo, el directorio home de ftp es /srv/ftp por defecto, pero me gustaría crear el directorio ftp anónimo en /home/ftp (los directorios ftp de los usuarios normales también están en /home, por ejemplo, /home/www.example.com). Pero, por supuesto, puedes usar el directorio /srv/ftp para ftp anónimo, si lo prefieres.

Si deseas usar /home/ftp, abre /etc/passwd y cambia el directorio home del usuario ftp de /srv/ftp a /home/ftp (no hagas esto si deseas usar /srv/ftp):

vi /etc/passwd
[...]  
#ftp:x:40:49:Cuenta FTP:/srv/ftp:/bin/bash  
ftp:x:40:49:Cuenta FTP:/home/ftp:/bin/bash  
[...]  

Luego mueve /srv/ftp a /home (no hagas esto si deseas usar /srv/ftp):

mv /srv/ftp /home

Luego creamos el directorio /home/ftp/incoming que permitirá a los usuarios anónimos cargar archivos. Daremos al directorio /home/ftp/incoming permisos de 311 para que los usuarios puedan cargar, pero no ver ni descargar ningún archivo en ese directorio. El directorio /home/ftp tendrá permisos de 555 que permiten ver y descargar archivos:

chown ftp:nobody /home/ftp  
cd /home/ftp  
mkdir incoming  
chown ftp:nobody incoming/  
chmod 311 incoming/  
cd ../  
chmod 555 ftp/

(Si deseas usar /srv/ftp en su lugar, reemplaza /home/ftp con /srv/ftp en los comandos anteriores.)

Los usuarios anónimos podrán iniciar sesión y se les permitirá descargar archivos de /home/ftp, pero las cargas estarán limitadas a /home/ftp/incoming (y una vez que se cargue un archivo en /home/ftp/incoming, no se puede leer ni descargar desde allí; el administrador del servidor debe moverlo a /home/ftp primero para hacerlo disponible para otros).

Ahora tenemos que configurar PureFTPd para ftp anónimo. Abre /etc/pure-ftpd/pure-ftpd.conf y asegúrate de que tienes las siguientes configuraciones en él:

vi /etc/pure-ftpd/pure-ftpd.conf
[...]  
NoAnonymous                 no

[...]  
AnonymousBandwidth            8  
[...]  
AnonymousCantUpload         no  
[...]  

(La configuración AnonymousBandwidth es opcional: te permite limitar los anchos de banda de carga y descarga para los usuarios anónimos. 8 significa 8 KB/sec. Usa cualquier valor que desees, o comenta la línea si no deseas limitar los anchos de banda.)

Finalmente, reiniciamos PureFTPd:

systemctl restart pure-ftpd.service

9 Enlaces

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.