Hosting Virtuale · 6 min read · Jan 31, 2026
Hosting Virtuale Con Proftpd E MySQL (Incluso Quota) Su Ubuntu 14.04LTS
Questo documento descrive come installare un server Proftpd che utilizza utenti virtuali da un database MySQL invece di veri utenti di sistema. Questo è molto più performante e consente di avere migliaia di utenti ftp su una singola macchina. Inoltre, mostrerò l’uso delle quote con questa configurazione. Questo tutorial è basato su Ubuntu 14.04LTS.
Per l’amministrazione del database MySQL puoi utilizzare strumenti basati sul web come phpMyAdmin che verrà anche installato in questo howto. phpMyAdmin è un’interfaccia grafica comoda che significa che non devi sbatterti con la riga di comando.
Questo howto è inteso come una guida pratica; non copre i fondamenti teorici. Questi sono trattati in molti altri documenti sul web.
Questo documento viene fornito senza alcuna garanzia! Voglio dire che questo non è l’unico modo per configurare un sistema del genere. Ci sono molti modi per raggiungere questo obiettivo, ma questo è il modo che seguo. Non rilascio alcuna garanzia che questo funzionerà per te!
1 Nota Preliminare
In questo tutorial utilizzo il nome host server1.example.com con l’indirizzo IP 192.168.0.100. Queste impostazioni potrebbero differire per te, quindi devi sostituirle dove appropriato.
Assicurati di essere loggato come root:
sudo su1.1 Cambiare La Shell Predefinita
/bin/sh è un symlink a /bin/dash, tuttavia abbiamo bisogno di /bin/bash, non di /bin/dash. Pertanto facciamo così:
dpkg-reconfigure dash
Installare dash come /bin/sh? <-- No1.2 Disabilitare AppArmor
AppArmor è un’estensione di sicurezza (simile a SELinux) che dovrebbe fornire sicurezza estesa. Secondo me non ne hai bisogno per configurare un sistema sicuro, e di solito causa più problemi che vantaggi (pensa a questo dopo aver fatto una settimana di risoluzione dei problemi perché qualche servizio non funzionava come previsto, e poi scopri che tutto era ok, solo AppArmor stava causando il problema). Pertanto lo disabilito.
Possiamo disabilitarlo in questo modo:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils2 Installare MySQL E phpMyAdmin
Tutto questo può essere installato con un solo comando:
apt-get install mysql-server mysql-client phpmyadmin apache2Ti verrà chiesto di fornire una password per l’utente root di MySQL - questa password è valida per l’utente root@localhost così come per [email protected], quindi non dobbiamo specificare manualmente una password root di MySQL in seguito:
Nuova password per l’utente MySQL “root”: <– yourrootsqlpassword
Ripeti la password per l’utente MySQL “root”: <– yourrootsqlpassword
In aggiunta a questo, vedrai le seguenti domande:
Web server da riconfigurare automaticamente: <– apache2
Configurare il database per phpmyadmin con dbconfig-common? <– No
3 Installare Proftpd Con Supporto MySQL
Per Ubuntu è disponibile un pacchetto proftpd-mod-mysql preconfigurato. Installalo come demone standalone in questo modo:
apt-get install proftpd-mod-mysqlTi verrà posta la seguente domanda:
Esegui proftpd: <– standalone
Poi creiamo un gruppo ftp (ftpgroup) e un utente (ftpuser) a cui verranno mappati tutti i nostri utenti virtuali. Sostituisci il gruppo e l’userid 2001 con un numero che è libero sul tuo sistema:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser4 Creare Il Database MySQL Per Proftpd
Ora creiamo un database chiamato ftp e un utente MySQL di nome proftpd che il demone proftpd utilizzerà in seguito per connettersi al database ftp:
mysql -u root -p
CREATE DATABASE ftp;
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON ftp.* TO 'proftpd'@'localhost.localdomain' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;Sostituisci la stringa password con qualsiasi password tu voglia utilizzare per l’utente MySQL proftpd. Ancora sulla shell MySQL, creiamo le tabelle del database di cui abbiamo bisogno:
USE ftp;
CREATE TABLE ftpgroup (
groupname varchar(16) NOT NULL default '',
gid smallint(6) NOT NULL default '5500',
members varchar(16) NOT NULL default '',
KEY groupname (groupname)
) ENGINE=MyISAM COMMENT='ProFTP group table';
CREATE TABLE ftpquotalimits (
name varchar(30) default NULL,
quota_type enum('user','group','class','all') NOT NULL default 'user',
per_session enum('false','true') NOT NULL default 'false',
limit_type enum('soft','hard') NOT NULL default 'soft',
bytes_in_avail bigint(20) unsigned NOT NULL default '0',
bytes_out_avail bigint(20) unsigned NOT NULL default '0',
bytes_xfer_avail bigint(20) unsigned NOT NULL default '0',
files_in_avail int(10) unsigned NOT NULL default '0',
files_out_avail int(10) unsigned NOT NULL default '0',
files_xfer_avail int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpquotatallies (
name varchar(30) NOT NULL default '',
quota_type enum('user','group','class','all') NOT NULL default 'user',
bytes_in_used bigint(20) unsigned NOT NULL default '0',
bytes_out_used bigint(20) unsigned NOT NULL default '0',
bytes_xfer_used bigint(20) unsigned NOT NULL default '0',
files_in_used int(10) unsigned NOT NULL default '0',
files_out_used int(10) unsigned NOT NULL default '0',
files_xfer_used int(10) unsigned NOT NULL default '0'
) ENGINE=MyISAM;
CREATE TABLE ftpuser (
id int(10) unsigned NOT NULL auto_increment,
userid varchar(32) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
uid smallint(6) NOT NULL default '5500',
gid smallint(6) NOT NULL default '5500',
homedir varchar(255) NOT NULL default '',
shell varchar(16) NOT NULL default '/sbin/nologin',
count int(11) NOT NULL default '0',
accessed datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
PRIMARY KEY (id),
UNIQUE KEY userid (userid)
) ENGINE=MyISAM COMMENT='ProFTP user table';
quit;Come avrai notato, con il comando quit; siamo usciti dalla shell MySQL e siamo tornati sulla shell di Linux.
A proposito, (presumo che il nome host del tuo sistema server ftp sia server1.example.com) puoi accedere a phpMyAdmin all’indirizzo http://server1.example.com/phpmyadmin/ (puoi usare l’indirizzo IP invece di server1.example.com) in un browser e accedere come proftpd. Poi puoi dare un’occhiata al database. In seguito puoi utilizzare phpMyAdmin per gestire il tuo server Proftpd.
5 Configurare Proftpd
Apri /etc/proftpd/modules.conf…
vi /etc/proftpd/modules.conf… e abilita i seguenti tre moduli:
| [...] # Installa uno dei proftpd-mod-mysql, proftpd-mod-pgsql o qualsiasi altro # motore backend SQL per utilizzare questo modulo e il backend richiesto. # Questo modulo deve essere caricato obbligatoriamente prima di qualsiasi # dei backend SQL esistenti. LoadModule mod_sql.c [...] # Installa proftpd-mod-mysql e decommenta il precedente # modulo mod_sql.c per usarlo. LoadModule mod_sql_mysql.c [...] # Installa uno dei precedenti backend SQL e decommenta # il precedente modulo mod_sql.c per usarlo LoadModule mod_quotatab_sql.c [...] |
Poi apri /etc/proftpd/proftpd.conf e commenta le seguenti righe:
vi /etc/proftpd/proftpd.conf| [...] # |
Più in basso nel file, aggiungi le seguenti righe:
| [...] # # Framework di autenticazione alternativi # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # Le password in MySQL sono criptate usando CRYPT SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # usato per connettersi al database # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Qui diciamo a ProFTPd i nomi delle colonne del database nella "usertable" # con cui vogliamo interagire. Abbina i nomi con quelli nel db SQLUserInfo ftpuser userid passwd uid gid homedir shell # Qui diciamo a ProFTPd i nomi delle colonne del database nella "grouptable" # con cui vogliamo interagire. Ancora i nomi corrispondono a quelli nel db SQLGroupInfo ftpgroup groupname gid members # imposta min UID e GID - altrimenti questi sono 999 ciascuno SQLMinID 500 # crea la home directory di un utente su richiesta se non esiste CreateHome on # Aggiorna il conteggio ogni volta che l'utente accede SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Aggiorna modificato ogni volta che l'utente carica o elimina un file SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Quote degli utenti # =========== QuotaEngine on QuotaDirectoryTally on QuotaDisplayUnits Mb QuotaShowQuotas on SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail, files_xfer_avail FROM ftpquotalimits WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used, bytes_out_used, bytes_xfer_used, files_in_used, files_out_used, files_xfer_used FROM ftpquotatallies WHERE name = '%{0}' AND quota_type = '%{1}'" SQLNamedQuery update-quota-tally UPDATE "bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1}, bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3}, files_out_used = files_out_used + %{4}, files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'" ftpquotatallies SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}" ftpquotatallies QuotaLimitTable sql:/get-quota-limit QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally RootLogin off RequireValidShell off [...] |
Assicurati di sostituire la string password con la vera password per l’utente MySQL proftpd nella riga SQLConnectInfo!
Poi riavvia Proftpd:
/etc/init.d/proftpd restartRicevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.