使用Proftpd和MySQL(包括配额)的虚拟主机对于Arch Linux

虚拟主机与Proftpd和MySQL(包括配额)对于Arch Linux

版本1.0
原作者:Falko Timme
适用于Arch Linux的文本以及Dretech的其他更改。

本文档介绍如何安装使用MySQL数据库而不是真实系统用户的虚拟用户的Proftpd服务器。 这是更好的性能,并允许在单个机器上有成千上万的ftp用户。 除此之外,我将使用此设置显示使用配额

对于MySQL数据库的管理,您可以使用基于Web的工具,如phpMyAdmin ,它也将安装在此howto中。 phpMyAdmin是一个舒适的图形界面,这意味着您不必乱用命令行。

本教程基于Arch Linux ,并且是Debian Sarge的原始方法 。 您应该已经建立了一个基本的Arch Linux系统。 在其他发行 ,如SuSEFedoraMandriva等,只有Proftpd安装是不同的; Proftpd的配置也应该适用于这些分发。

这是一个实践指南; 它不包括理论背景。 他们在网络上的许多其他文档中被处理。

本文档不附带任何形式的保证! 我想说,这不是设立这样一个制度的唯一办法。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!

1安装Apache,MySQL和phpMyAdmin

有关Apache和/或MySQL的安装说明,请参阅https://wiki.archlinux.org/index.php/Apache
有关phpMyAdmin的安装说明,请参阅https://wiki.archlinux.org/index.php/Phpmyadmin

2安装Proftpd与MySQL支持

在Arch Linux中,MySQL支持在Proftpd中编译。 用de命令安装Proftpd:

pacman -S proftpd

然后我们创建一个ftp组(“ ftpgroup ”)和用户(“ ftpuser ”),我们所有的虚拟用户将被映射到。 将group-and userid 2001替换为系统上免费的数字:

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

3为Proftpd创建MySQL数据库

转到phpMyAdmin( http:// localhost / phpmyadminhttp://192.168.2.5/phpmyadmin (如果192.168.2.5是FTP服务器的IP号)),用户名root和您在第1步中给出的密码。

单击屏幕上方的“SQL”,并在SQL窗口中粘贴以下查询:

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;

将字符串密码替换为要用于MySQL用户proftpd的任何密码 。 仍然在phpMyAdmin中,在屏幕的左侧选择数据库ftp 。 然后我们创建数据库表:我们需要复制下面的SQL命令并将其粘贴到phpMyAdmin的查询窗口中:

CREATE TABLE `ftpgroup` ( `groupname` varchar(16) NOT NULL DEFAULT '',
`gid` smallint(6) NOT NULL DEFAULT '9001',
`members` varchar(16) NOT NULL DEFAULT '',
KEY `groupname` (`groupname`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='ProFTP group table';

CREATE TABLE `ftpquotalimits` ( `name` varchar(30) NOT NULL DEFAULT '',
`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(10) unsigned NOT NULL DEFAULT '0',
`bytes_out_avail` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_xfer_avail` bigint(10) 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', PRIMARY KEY (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `ftpquotatallies` ( `name` varchar(30) NOT NULL DEFAULT '',
`quota_type` enum('user','group','class','all') NOT NULL DEFAULT
'user', `bytes_in_used` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_out_used` bigint(10) unsigned NOT NULL DEFAULT '0',
`bytes_xfer_used` bigint(10) 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 DEFAULT CHARSET=utf8;

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 '9001',
`gid`smallint(6) NOT NULL DEFAULT '9001',
`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',
`email` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `userid` (`userid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='ProFTP user table';

4配置Proftpd

打开/etc/proftpd.conf并添加以下行:

DefaultRoot ~

# The passwords in MySQL are encrypted using CRYPT

SQLAuthTypes Crypt
SQLAuthenticate users* groups*

# used to connect to the database
# databasename@host database_user user_password
SQLConnectInfo ftp@localhost proftpd password PERCONNECTION

# Here we tell ProFTPd the names of the database columns in the "usertable"
# we want it to interact with. Match the names with those in the db
SQLUserInfo ftpuser userid passwd uid gid homedir shell

# Here we tell ProFTPd the names of the database columns in the "grouptable"
# we want it to interact with. Again the names match with those in the db
SQLGroupInfo ftpgroup groupname gid members

# set min UID and GID - otherwise these are 999 each
SQLMinID 500

# create a user's home directory on demand if it doesn't exist
CreateHome on 770 dirmode 770

# Update count every time user logs in
SQLLog PASS updatecount
SQLNamedQuery updatecount UPDATE "count=count+1, accessed=now() WHERE userid='%u'" ftpuser

# Update modified everytime user uploads or deletes a file
SQLLog STOR,DELE modified
SQLNamedQuery modified UPDATE "modified=now() WHERE userid='%u'" ftpuser

# User quotas
# ===========
QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Gb
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

如果你想看到一个横幅,看看LIST之后的使用/可用空间,然后将下面的行(Martin Mrajca)添加到/etc/profptd.conf中

SQLNamedQuery gettally  SELECT "ROUND((bytes_in_used/1073741824),2) FROM ftpquotatallies WHERE name='%u'"
SQLNamedQuery getlimit SELECT "ROUND((bytes_in_avail/1073741824),2) FROM ftpquotalimits WHERE name='%u'"
SQLNamedQuery getfree SELECT "ROUND(((ftpquotalimits.bytes_in_avail-ftpquotatallies.bytes_in_used)/1073741824),2) FROM ftpquotalimits,ftpquotatallies WHERE ftpquotalimits.name = '%u' AND ftpquotatallies.name = '%u'"
SQLShowInfo LIST "226" "Used %{gettally}GB from %{getlimit}GB. You have %{getfree}GB available space."

重启Proftpd:

/etc/rc.d/proftpd restart

5填充数据库和测试

要填充数据库,您可以使用phpMyAdmin。 首先,我们在表ftpgroup中创建一个条目。 它包含groupname,groupid和我们在第二步结尾创建的ftp组/用户的用户名(如果使用另一个超过9001,则适当地替换groupid):

INSERT INTO `ftpgroup` (`groupname`, `gid`, `members`) VALUES ('ftpgroup', 9001, 'ftpuser');

现在我们完成了表ftpgroup 。 我们不必在此创建更多的条目。 无论何时创建新的虚拟ftp用户,都可以在ftpquotalimitsftpuser表中进行 。 所以让我们创建我们的第一个用户(我们仍然在phpMyAdmin的查询窗口):

INSERT INTO `ftpquotalimits` (`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`) VALUES ('exampleuser', 'user', 'false', 'hard', 1073741824, 0, 0, 0, 0, 0);

INSERT INTO `ftpuser` (`userid`, `passwd`, `uid`, `gid`, `homedir`, `shell`, `count`, `accessed`, `modified`, `email`) VALUES ('exampleuser', encrypt('secret'), 2001, 2001, '/srv/ftp/exampleuser', '/sbin/nologin', 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'exampleuser@youcl.com');

(如果您正在使用本教程中的其他值,请不要忘记在最后一个INSERT语句中替换group-和userid 2001 !)

现在在您的工作站上打开您的FTP客户端程序(如果您在Windows系统上,像WS_FTP或SmartFTP),并尝试连接。 作为主机名,您使用系统的IP地址,用户名为exampleuser ,密码为密码 (如果您尚未选择其他密码)。

如果你能连接 - 恭喜你! 如果没有,出现问题。

现在,如果你跑

ls -l /srv/ftp

您应该看到目录/ srv / ftp / exampleuser (exampleuser的ftp目录)已被自动创建,它属于ftpuserftpgroup (我们在第二步结束时创建的用户/组)。

5.1 FTP用户管理

为了管理虚拟FTP用户,我做了一个简单的PHP脚本。 你可以在这里下载脚本。 您只需要解压缩zipfile并将ftpusermanagement.php复制到Arch Linux系统的/ srv / http目录。 在您的网络浏览器中打开ftpusermanagement.php ,例如http://192.168.2.5/ftpusermanagement.php (如果IP号码为192.168.2.5是您的Arch Linux系统的IP号码)。 你现在可以简单的添加ftp-user,编辑ftp-users和删除ftp-users。 如果删除ftp-user,您必须手动删除该用户的目录。 在php脚本的web界面中,我还提到了一些未来可能性的idaes,但是目前我将花费我的时间在其他项目中。 脚本的版权是GPL许可证,所以您可以自由地改进和扩展脚本。

5.2数据库管理

如果要在没有Web界面的情况下管理虚拟FTP用户,则只需在表ftpquotalimitsftpuser中创建条目。 下面你可以在这里找到这些表的列的解释:

ftpuser表:

重要的列是这些(其他的是由MySQL或Proftpd自动处理,所以不要手动填写!):

  • userid :虚拟Proftpd用户的名称(例如exampleuser )。
  • passwd :用户的未加密(即,明文) 密码
  • uid :您在第二步结束时创建的ftp用户的用户标识(例如9001 )。
  • gid :在第二步结束时创建的ftp组的groupid(例如2001 )。
  • homedir :虚拟Proftpd用户的主目录 (例如/ srv / ftp / exampleuser )。 如果不存在,则当新用户通过FTP第一次登录时将创建它。 虚拟用户将被关入此主目录,即他无法访问其主目录以外的其他目录。
  • shell :如果你默认填写/ sbin / nologin,可以。

ftpquotalimits表:重要的列是这些(其他的是由MySQL或Proftpd自动处理,所以不要手动填写!):

  • name :虚拟Proftpd用户的名称(例如exampleuser)。
  • quota_type :用户或组。 通常我们在这里使用用户。
  • per_session :true或false。 true表示配额限制仅适用于会话。 例如,如果用户的配额为15 MB,并且他在当前会话期间上传了15 MB,那么他无法再上传任何内容。 但是如果他再次注销,他再次有15 MB的可用性。 虚假的意思是,用户有15 MB,无论他是否退出并重新启动。
  • limit_type :硬或软。 硬配额限制是一个从不超过限制,而一个软配额可以暂时超过。 通常你在这里很努力。
  • bytes_in_avail :以字节为单位上传限制(例如15728640,为15 MB)。 0表示无限制。
  • bytes_out_avail :以字节为单位的下载限制。 0表示无限制。
  • bytes_xfer_avail :以字节为单位的传输限制。 允许用户上传和下载的总和。 0表示无限制。
  • files_in_avail :上传文件限制。 0表示无限制。
  • files_out_avail :文件下载限制。 0表示无限制。
  • files_xfer_avail扩展文件的限制。 0表示无限制。

Proftpd在内部使用ftpquotatallies表来管理配额,因此您不必在那里输入条目!

参考文献

链接

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏