• 欢迎访问Ppabc博客网站,专注于Linux、CentOS、Apache、Nginx、MySQL、PHP等开源工具安装优化的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入Ppabc博客
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏Ppabc博客吧

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

baidu空间 admin 12年前 (2008-03-07) 336次浏览

作者:Michael , 来源:Michael’s blog , 点击:775

该文章转自[网络大杂烩]:http://www.goalercn.com/tech/view.php?id=602
自从在 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 的文件,大家完全照抄就基本可以了

#基本配置
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
至此,完成了 proftpd.conf 配置文件的编写

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

四、完成 MySQL 数据库表配置
完成 proftpd.conf 配置文件后,需要进行数据库表的配置,包括创建表和插入数据
1、登陆 mysql 或者使用 phpmyadmin 工具创建数据库 FTP
#mysqladmin create FTP
2、运行下面的 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=InnoDB;; —
— 导出表中的数据 `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=InnoDB;; —
— 导出表中的数据 `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=InnoDB;; —
— 导出表中的数据 `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=InnoDB;;
如果你想设置 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、http://FTP.sql
http://FTP.zip

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

该文章转自[网络大杂烩]:http://www.goalercn.com/tech/view.php?id=602

]]>


Selinux 中国 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:FreeBSD 上 Proftpd 带匿名登陆和使用 MySQL 用户验证的 Quota 磁盘限额安装手记
喜欢 (0)