Server Setup · 6 min read · Jan 31, 2026
Virtuelles Hosting Mit Proftpd Und MySQL (Incl. Quota) Auf Ubuntu 14.04LTS
Dieses Dokument beschreibt, wie man einen Proftpd-Server installiert, der virtuelle Benutzer aus einer MySQL-Datenbank anstelle von echten Systembenutzern verwendet. Dies ist viel leistungsfähiger und ermöglicht es, Tausende von FTP-Benutzern auf einer einzigen Maschine zu haben. Darüber hinaus werde ich die Verwendung von Quoten mit diesem Setup zeigen. Dieses Tutorial basiert auf Ubuntu 14.04LTS.
Für die Verwaltung der MySQL-Datenbank können Sie webbasierte Tools wie phpMyAdmin verwenden, die ebenfalls in diesem Howto installiert werden. phpMyAdmin ist eine komfortable grafische Benutzeroberfläche, was bedeutet, dass Sie sich nicht mit der Befehlszeile herumschlagen müssen.
Dieses Howto ist als praktische Anleitung gedacht; es behandelt nicht die theoretischen Hintergründe. Diese werden in vielen anderen Dokumenten im Web behandelt.
Dieses Dokument kommt ohne jegliche Gewährleistung! Ich möchte sagen, dass dies nicht der einzige Weg ist, ein solches System einzurichten. Es gibt viele Möglichkeiten, dieses Ziel zu erreichen, aber dies ist der Weg, den ich wähle. Ich gebe keine Garantie, dass dies für Sie funktioniert!
1 Vorbemerkung
In diesem Tutorial verwende ich den Hostnamen server1.example.com mit der IP-Adresse 192.168.0.100. Diese Einstellungen können bei Ihnen abweichen, daher müssen Sie sie gegebenenfalls ersetzen.
Stellen Sie sicher, dass Sie als root angemeldet sind:
sudo su
1.1 Ändern Sie die Standard-Shell
/bin/sh ist ein Symlink zu /bin/dash, jedoch benötigen wir /bin/bash, nicht /bin/dash. Daher tun wir Folgendes:
dpkg-reconfigure dash
Installieren Sie dash als /bin/sh? <– Nein
1.2 Deaktivieren Sie AppArmor
AppArmor ist eine Sicherheitserweiterung (ähnlich wie SELinux), die erweiterte Sicherheit bieten soll. Meiner Meinung nach benötigen Sie es nicht, um ein sicheres System zu konfigurieren, und es verursacht normalerweise mehr Probleme als Vorteile (denken Sie daran, nachdem Sie eine Woche lang Probleme behoben haben, weil ein Dienst nicht wie erwartet funktionierte, und dann stellen Sie fest, dass alles in Ordnung war, nur AppArmor das Problem verursachte). Daher deaktiviere ich es.
Wir können es folgendermaßen deaktivieren:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Installieren Sie MySQL Und phpMyAdmin
Dies kann alles mit einem einzigen Befehl installiert werden:
apt-get install mysql-server mysql-client phpmyadmin apache2
Sie werden aufgefordert, ein Passwort für den MySQL-Root-Benutzer anzugeben - dieses Passwort gilt für den Benutzer root@localhost sowie für [email protected], sodass wir später kein MySQL-Root-Passwort manuell angeben müssen:
Neues Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Wiederholen Sie das Passwort für den MySQL “root”-Benutzer: <– yourrootsqlpassword
Zusätzlich sehen Sie die folgenden Fragen:
Webserver automatisch neu konfigurieren: <– apache2
Datenbank für phpmyadmin mit dbconfig-common konfigurieren? <– Nein
3 Installieren Sie Proftpd Mit MySQL-Unterstützung
Für Ubuntu gibt es ein vorkonfiguriertes proftpd-mod-mysql-Paket. Installieren Sie es als eigenständigen Daemon wie folgt:
apt-get install proftpd-mod-mysql
Sie werden gefragt:
Proftpd ausführen: <– eigenständig
Dann erstellen wir eine FTP-Gruppe (ftpgroup) und einen Benutzer (ftpuser), auf die alle unsere virtuellen Benutzer abgebildet werden. Ersetzen Sie die Gruppen- und Benutzer-ID 2001 durch eine Nummer, die auf Ihrem System frei ist:
groupadd -g 2001 ftpgroup
useradd -u 2001 -s /bin/false -d /bin/null -c “proftpd-Benutzer” -g ftpgroup ftpuser
4 Erstellen Sie Die MySQL-Datenbank Für Proftpd
Jetzt erstellen wir eine Datenbank namens ftp und einen MySQL-Benutzer namens proftpd, den der Proftpd-Daemon später verwenden wird, um sich mit der FTP-Datenbank zu verbinden:
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;
Ersetzen Sie den String password durch das Passwort, das Sie für den MySQL-Benutzer proftpd verwenden möchten. Immer noch in der MySQL-Shell erstellen wir die benötigten Datenbanktabellen:
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-Gruppe Tabelle’;
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-Benutzer Tabelle’;
quit;
Wie Sie vielleicht bemerkt haben, haben wir mit dem Befehl quit; die MySQL-Shell verlassen und sind zurück in der Linux-Shell.
Übrigens, (ich gehe davon aus, dass der Hostname Ihres FTP-Servers server1.example.com ist) können Sie phpMyAdmin unter http://server1.example.com/phpmyadmin/ (Sie können die IP-Adresse anstelle von server1.example.com verwenden) in einem Browser aufrufen und sich als proftpd anmelden. Dann können Sie sich die Datenbank ansehen. Später können Sie phpMyAdmin verwenden, um Ihren Proftpd-Server zu verwalten.
5 Konfigurieren Sie Proftpd
Öffnen Sie /etc/proftpd/modules.conf…
vi /etc/proftpd/modules.conf
… und aktivieren Sie die folgenden drei Module:
| [...] # Installieren Sie eines von proftpd-mod-mysql, proftpd-mod-pgsql oder einem anderen # SQL-Backend-Engine, um dieses Modul und das erforderliche Backend zu verwenden. # Dieses Modul muss zwingend vor einem der # vorhandenen SQL-Backends geladen werden. LoadModule mod_sql.c [...] # Installieren Sie proftpd-mod-mysql und dekommentieren Sie das vorherige # mod_sql.c-Modul, um dies zu verwenden. LoadModule mod_sql_mysql.c [...] # Installieren Sie eines der vorherigen SQL-Backends und dekommentieren Sie # das vorherige mod_sql.c-Modul, um dies zu verwenden LoadModule mod_quotatab_sql.c [...] |
Dann öffnen Sie /etc/proftpd/proftpd.conf und kommentieren Sie die folgenden Zeilen aus:
vi /etc/proftpd/proftpd.conf
| [...] # |
Weiter unten in der Datei fügen Sie die folgenden Zeilen hinzu:
| [...] # # Alternative Authentifizierungsrahmen # #Include /etc/proftpd/ldap.conf #Include /etc/proftpd/sql.conf DefaultRoot ~ SQLBackend mysql # Die Passwörter in MySQL sind mit CRYPT verschlüsselt SQLAuthTypes Plaintext Crypt SQLAuthenticate users groups # verwendet, um sich mit der Datenbank zu verbinden # databasename@host database_user user_password SQLConnectInfo ftp@localhost proftpd password # Hier sagen wir ProFTPd die Namen der Datenbankspalten in der "usertable" # mit denen wir interagieren möchten. Stimmen Sie die Namen mit denen in der DB ab SQLUserInfo ftpuser userid passwd uid gid homedir shell # Hier sagen wir ProFTPd die Namen der Datenbankspalten in der "grouptable" # mit denen wir interagieren möchten. Wieder stimmen die Namen mit denen in der DB ab SQLGroupInfo ftpgroup groupname gid members # setze min UID und GID - andernfalls sind diese jeweils 999 SQLMinID 500 # erstelle das Home-Verzeichnis eines Benutzers auf Anfrage, wenn es nicht existiert CreateHome on # Aktualisiere die Anzahl jedes Mal, wenn sich der Benutzer anmeldet SQLLog PASS updatecount SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser # Aktualisiere modifiziert jedes Mal, wenn der Benutzer eine Datei hochlädt oder löscht SQLLog STOR,DELE modified SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser # Benutzerquoten # =========== 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 [...] |
Stellen Sie sicher, dass Sie den String password durch das tatsächliche Passwort für den MySQL-Benutzer proftpd in der Zeile SQLConnectInfo ersetzen!
Starten Sie dann Proftpd neu:
/etc/init.d/proftpd restart
Erhalte neue Beiträge in deinem Posteingang.
Kein Spam. Jederzeit abmelden.