FreeBSD上Proftpd带匿名登陆和使用MySQL用户验证的Quota磁盘限额安装手记

自从在Yahoo工作后,对FreeBSD的喜欢是越来越强烈,这两年多几乎再也不用RedHat之类的Linux了,最近尝试了在FreeBSD上配置了一个基于Proftpd的FTP服务器,要求使用MySQL数据库存放ftp用户信息,并在数据库内存放用户Quota磁盘限额信息,同时还支持anonymous匿名用户登陆。

之前网上搜索到一些文章,好像都出自同一个朋友的手,到处都是转载或者稍微的修改。下面是Michael根据大家的经验和proftpd的MAN文档进行的实际安装手记。

本次Michael的FTP服务器使用的是FreeBSD 4.10 Release版本,Michael决定使用FreeBSD非常优秀的Ports系统进行所有软件的安装。以下的所有操作均是在Root用户或者sudo root的情况下完成。

一、安装MySQL
#cd /usr/ports/databases/mysql41-server
#make install
系统会自动下载mysql的安装包mysql-4.1.14.tar.gz,并完成编译和安装过程

注1:对于mysql的安装,需要说明几点要注意的地方,FreeBSD的Ports自动完成mysql安装后,还需要自己完成下面几件事情后才能正常使用
1、创建mysql用户和mysql用户组,并修改目录权限
#pw groupadd mysql -g 88
#pw adduser mysql -u 88 -g 88 -d /nonexistent -s /sbin/nologin
#chown -R mysql:mysql /var/db/mysql
#chown -R mysql:mysql /usr/local/share/mysql
2、创建mysql系统数据库
#/usr/local/bin/mysql_install_db
#/usr/lcoal/bin/mysql_create_system_tables
3、创建mysql自启动脚本
#cp /usr/local/share/mysql/mysql.server /usr/local/etc/rc.d/mysql-server.sh
4、创建mysql配置文件 my.cnf
#cp /usr/local/share/mysql/my-medium.cnf /etc/my.cnf (有my-medium、small、large、huge等可选)

现在,你可以通过 /usr/local/etc/rc.d/mysql-server.sh start 或者重启系统来启动mysql了

二、安装proftpd
和mysql的安装很相似,使用ports安装
#cd /usr/ports/ftp/proftpd-mysql
#make install
安装的时候会要求选择proftpd要安装的模块,选择好mysql和quota,其他的根据情况选择
然后系统自动下载proftpd-1.3.0rc2.tar.bz2并完成编译和安装。

三、配置proftpd.conf
完成上面的安装,proftpd其实已经可以运行了,但是我们还需要根据自己的安装要求进行必要的配置,所以先备份默认的配置文件
#cp /usr/local/etc/proftpd.conf /usr/local/etc/proftpd.conf.sample

1、重新编写proftpd.conf,下面是Michael的文件,大家完全照抄就基本可以了
[coolcode]
#基本配置
ServerName “Michael’s Ftp Site”
ServerType standalone
DefaultServer on

#设置用户登陆时不显示ftp服务器版本信息
ServerIdent off

#设置ftp服务使用的端口,可以修改
Port 21

#设置ftp目录的权限
Umask 022

#设置系统各种超时时间和重试次数
MaxLoginAttempts 3
TimeoutLogin 120
TimeoutIdle 600
TimeoutNoTransfer 900
TimeoutStalled 3600

#允许最大的同时连接用户数
MaxClients 10

#允许每个用户主机最大并发连接数
MaxClientsPerHost 3

AllowOverwrite no
AllowStoreRestart on
UseReverseDNS off

#如果shell为空时允许用户登录
RequireValidShell off

#将用户限制在自己的主目录下 ,这个设置很重要
DefaultRoot ~

#设置系统最大的进程数,防止dos攻击,默认是30
MaxInstances 10

#设置系统用于运行proftpd服务的用户和用户组(需要后面自己创建)
User FTPUSR
Group FTPGRP

#设置对全局的文件可以进行改写

AllowOverwrite on

#设置系统运行日志和文件传输日志
SystemLog /var/log/proftpd.syslog
TransferLog /var/log/proftpd.transferlog

######################## 下面是匿名登陆部分的设置 #################
#匿名用户登陆后访问的目录为 ftp用户的主目录

User ftp
Group ftpusers

#设置anonymous用户为系统实际用户ftp的别名
UserAlias anonymous ftp

#设置匿名用户同时在线最大用户数
#此用户数受限于前面的全局同时在线用户数
MaxClients 5

#设置welcome.msg文件作为用户登陆的提示信息文件
#.message文件作为用户每次进入的目录提示信息
DisplayLogin welcome.msg
DisplayFirstChdir .message

#设置一些特殊的权限,比如写文件和登陆限制等 (可以不用)

DenyAll


Order deny,allow
Deny from 61.101.201.0/32
Allow from all


######################## 完成匿名登陆的设置 #################

######################## 下面是磁盘限额Quota设置 ############
#启用磁盘限额
QuotaDirectoryTally on

SQLHomedirOnDemand on

#磁盘限额单位 b”|”Kb”|”Mb”|”Gb”
QuotaDisplayUnits “Mb”

QuotaEngine on

#磁盘限额日志记录
QuotaLog “/var/log/proftpd.quotalog”

#打开磁盘限额信息 “quote SITE QUOTA”命令
QuotaShowQuotas on
####################### 完成磁盘配额设置 ####################

####################### 下面是MySQL数据库部分设置 ###########
#数据库联接的信息
#FTP是数据库名,localhost是MySQL主机名,3306是mysql服务的端口号
#Michael是连接数据库的用户名,testpwd是密码(如果没有密码留空)
SQLConnectInfo FTP@localhost:3306 Michael testpwd

#数据库认证的类型
SQLAuthTypes Backend Plaintext

#指定用来做用户认证的表的有关信息。(将在后面创建)
SQLUserInfo FTPUSERS userid passwd uid gid homedir shell
SQLGroupInfo FTPGRPS groupname gid members

#数据库认证
SQLAuthenticate users groups usersetfast groupsetfast

#proftpd进行的mysql调用语句,别修改任何地方
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 quotalimits 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 quotatallies 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}'” quotatallies

SQLNamedQuery insert-quota-tally INSERT “%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}” quotatallies

QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
[/coolcode]

至此,完成了proftpd.conf配置文件的编写

注2:之前Michael按照网上的部分文档编写了最后部分的mysql调用语句,结果最后运行proftpd后,登陆时总是出现421 Service not available 的错误,后来发现是最后部分的语句有问题,上面的语句是Michael经过修改后的,将不会有问题。

四、完成MySQL数据库表配置
完成proftpd.conf配置文件后,需要进行数据库表的配置,包括创建表和插入数据
1、登陆mysql或者使用phpmyadmin工具创建数据库 FTP
#mysqladmin create FTP
2、运行下面的sql语句创建表和插入必要数据
[coolcode lang=”sql”]
— phpMyAdmin SQL Dump
— version 2.6.4-pl2
— http://www.phpmyadmin.net

— 主机: localhost
— 生成日期: 2005 年 11 月 03 日 14:23
— 服务器版本: 4.1.14
— PHP 版本: 4.4.0

— 数据库: `FTP`

— ——————————————————–


— 表的结构 `FTPGRPS`

CREATE TABLE `FTPGRPS` (
`groupname` text NOT NULL,
`gid` smallint(6) NOT NULL default ‘0’,
`members` text NOT NULL
) ENGINE=MyISAM;;


— 导出表中的数据 `FTPGRPS`

INSERT INTO `FTPGRPS` VALUES (‘FTPGRP’, 2001, ‘FTPUSR’);
INSERT INTO `FTPGRPS` VALUES (‘ftpusers’, 2002, ‘ftp’);

— ——————————————————–


— 表的结构 `FTPUSERS`

CREATE TABLE `FTPUSERS` (
`userid` text NOT NULL,
`passwd` text NOT NULL,
`uid` int(11) NOT NULL default ‘0’,
`gid` int(11) NOT NULL default ‘0’,
`homedir` text,
`shell` text
) ENGINE=MyISAM;;


— 导出表中的数据 `FTPUSERS`

INSERT INTO `FTPUSERS` VALUES (‘Michael’, ‘testftp’, 2001, 2001, ‘/var/ftp/incoming’, ”);

— ——————————————————–


— 表的结构 `quotalimits`

CREATE TABLE `quotalimits` (
`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` float NOT NULL default ‘0’,
`bytes_out_avail` float NOT NULL default ‘0’,
`bytes_xfer_avail` float 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;;


— 导出表中的数据 `quotalimits`

— 设置Michael用户,磁盘配额1G,可以上传下载流量2G,最多文件数10个
INSERT INTO `quotalimits` VALUES (‘Michael’, ‘user’, ‘false’, ‘soft’, 1.024e+09, 0, 2.048e+09, 10, 0, 0);

— ——————————————————–


— 表的结构 `quotatallies`

CREATE TABLE `quotatallies` (
`name` varchar(30) NOT NULL default ”,
`quota_type` enum(‘user’,’group’,’class’,’all’) NOT NULL default ‘user’,
`bytes_in_used` float NOT NULL default ‘0’,
`bytes_out_used` float NOT NULL default ‘0’,
`bytes_xfer_used` float 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;;
[/coolcode]

如果你想设置quota,只要在ftpquotalimits表里设置一下就行了,这个表里的各个参数分别代表:

代码:
quotalimits表
name: – 用户帐号
quota type: – user, group, class, all (we use user)
per_session: – true or false (we use true)
limit_type: – 硬限制 or 软限制 (我们一般用硬限制)
bytes_in_avail: – 允许上传的字节数
bytes_out_avail: – 允许下载的字节数
bytes_xfer_avail: – 允许传输的字节数(包括上传/下载)
files_in_avail: – 允许上传的文件数
files_out_avail: – 允许下载的文件数
files_xfer_avail: – 允许传输的文件数(包括上传/下载)

五、完成最后的用户、用户组和目录设置
1、创建proftpd服务运行的用户和用户组
#pw groupadd FTPGRP -g 2001
#pw adduser FTPUSR -u 2001 -g 2001 -d /var/ftp/incoming -s /sbin/nologin

2、创建匿名登陆用户映射的系统用户和用户组
#pw groupadd ftpusers -g 2002
#pw adduser ftp -u 2002 -g 2001 -d /var/ftp/incoming -s /sbin/nologin

六、运行测试配置系统服务
1、运行proftpd服务
#/usr/local/sbin/proftpd

2、测试
在任何一台可以访问服务器的机器上测试ftp连接,使用Michael用户和testftp口令登陆,然后运行quote SITE QUOTA命令查看设置的磁盘限额信息
然后测试使用anonymous匿名用户登陆测试

3、监控和调试proftpd服务
#/usr/local/sbin/proftpd proftpd -n -d 5 -c /usr/local/etc/proftpd.conf
这样在测试和连接ftp的时候,可以在主机上看到所有的proftpd运行信息

4、日志监控
可以使用下面的命令查看系统日志、传送日志等
#tail -f /var/log/proftpd.syslog
#tail -f /var/log/proftpd.transferlog

5、配置系统自启动proftpd服务
#vi /etc/rc.conf
加入下面一行
proftpd_enable=”YES”
这样系统启动的时候会调用/usr/local/etc/rc.d/proftpd.sh脚本启动proftpd服务

ok
大功告成,大家可以根据自己的需要修改上面任何一个部分的细节,最好在自己理解的基础上进行修改,整个过程包括proftpd的配置都很简单。有问题欢迎大家来和我讨论,经过Michael测试使用,发现proftpd的确是个不错的东东!

附件:
1、proftpd.conf
proftpd.zip

2、FTP.sql
FTP.zip

参考资料:
http://www.chinaunix.net/jh/15/3028.html

51 thoughts on “FreeBSD上Proftpd带匿名登陆和使用MySQL用户验证的Quota磁盘限额安装手记”

  1. 2、创建匿名登陆用户映射的系统用户和用户组
    #pw groupadd ftpusers -g 2002
    #pw adduser ftp -u 2002 -g 2001 -d /var/ftp/incoming -s /sbin/nologin

    pwadduser ftp -u 2002 -g 2001 (这个地方是2001还是2002?把ftp 到FTPGRP 组?)

  2. Please let me know if you’re looking for a article author for your weblog.
    You have some really good articles and I believe I would be a good asset.
    If you ever want to take some of the load off, I’d absolutely love to write some articles for your blog
    in exchange for a link back to mine. Please send me an e-mail
    if interested. Kudos!

  3. I’d like to thank you for the efforts you have put in writing
    this blog. I’m hoping to check out the same high-grade
    blog posts from you in the future as well. In truth, your creative
    writing abilities has encouraged me to get my own,
    personal website now 😉 pof natalielise

  4. Pingback: 정자동룸
  5. I do not know whether it’s just me or if perhaps everyone else experiencing problems with your site.
    It appears as though some of the text on your content are running off the screen. Can someone else please provide
    feedback and let me know if this is happening to them too?

    This may be a issue with my browser because I’ve had this happen before.
    Appreciate it

  6. May I just say what a comfort to find someone who genuinely understands what they are discussing on the web.
    You certainly know how to bring a problem to light and make
    it important. More people should look at this and understand this side of your story.
    It’s surprising you are not more popular since you surely possess the gift.

  7. Hey! Quick question that’s completely off topic. Do you
    know how to make your site mobile friendly? My blog looks weird when viewing from my apple iphone.
    I’m trying to find a template or plugin that might be able to fix this problem.
    If you have any suggestions, please share.
    Many thanks!

  8. I’m really impressed along with your writing talents and also with the layout for your blog.
    Is that this a paid subject or did you modify it yourself?
    Either way stay up the excellent quality writing, it is uncommon to peer a great blog like
    this one these days..

Leave a Reply

Your email address will not be published. Required fields are marked *

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Anti-spam image