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-gdserver1:~ # 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): <--7Luego 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.servicePara asegurar la instalación de MySQL, ejecuta:
mysql_secure_installationserver1:~ # 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.servicephpMyAdmin se puede instalar de la siguiente manera:
zypper install phpmyadminPara asegurarnos de que podemos acceder a phpMyAdmin, edita el archivo de la siguiente manera:
vi /etc/apache2/conf.d/phpMyAdmin.confAgrega 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.phpEn 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.sqlAhora inicia el servicio de Apache
systemctl enable apache2.service
systemctl restart apache2.serviceAhora 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-ftpdLuego 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 ftpuser4 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 -pCREATE 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.confMYSQLSocket /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-ftpd6 Poblar La Base De Datos Y Probar
Para poblar la base de datos, puedes usar la consola de MySQL:
mysql -u root -pUSE 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 /homeLuego 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.service9 Enlaces
- OpenSUSE: http://www.opensuse.org/
- PureFTPd: http://www.pureftpd.org/
- phpMyAdmin: http://www.phpmyadmin.net/
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.