当前位置: 首页 > 图文教程 > 服务器 > FTP服务器 > proftp配置全功略 FTP

FTP服务器
用SSL加密增强FTP服务器安全性
Windows下FTP服务器的安全管理
如何配置FTP服务器
FTP服务器快速架设全攻略
FTP服务器如何实现安全性 (上)
基于UNIX平台FTP服务器的建立(下)
Windows XP架设FTP服务器的方法教程
Linux系统架设VSFTP服务器实例解析
企业内部FTP服务器的架设
FTP服务器安全
Linux的ftp服务vsftp详细配置
Ubuntu自带的FTP服务器vsftpd技巧
在Linux下建立强大的FTP搜索引擎
用无线路由器构建FTP服务器
FTP服务中允许上传权限存在的问题
简单实用 Linux下的FTP服务器配置
FTP空间不足 Windows 系统性能监控来报警
如何启用Web服务器并运行FTP服务
FTP服务器架设的三方面安全因素
如何配置Linux操作系统下的FTP服务器

FTP服务器 中的 proftp配置全功略 FTP


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-17   浏览: 38 ::
收藏到网摘: n/a

国内关于proftp设置的文档实在太少,只能看着官方文档慢慢学习,特把学习经验分享给大家。

proftp+mysql+quota。

安装proftp之前,必须先做一个工作,假如你的mysql是自己编译的,那就必须先修改/etc/ld.so.conf,否则后面运行proftp会报错。
vi /etc/ld.so.conf

添加下面一行:

/usr/local/mysql/lib/mysql

注意大家如果mysql的安装路径于我不一样,则填写相应的路径,有关mysql的编译安装请参考《Linux+Apache+Mysql+PHP典型配置》。

1、下载相关软件

wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.9.tar.gz

下载proftp的最新版本1.2.9

wget http://www.castaglia.org/proftpd ... tatab-1.2.11.tar.gz

这是配合proftp的磁盘限额的模块

2、解压编译

tar zvxf proftpd-1.2.9.tar.gz

tar zvxf proftpd-mod-quotatab-1.2.11.tar.gz

cp mod_quotatab/*.c proftpd-1.2.9/contrib/

cp mod_quotatab/*.h proftpd-1.2.9/contrib/

vi proftpd-1.2.9/contrib/mod_sql_mysql.c

找到#include 这一行,将mysql.h改成你的系统中此文件所在的路径,如/usr/local/mysql/include/mysql/mysql.h

编译:

ok, 现在我们可以来启动proftp了,只要

/usr/local/proftpd/sbin/proftpd

用你的ftp客户端试验以下,应该可以正常登陆,包括匿名和linux用户名可以。

其实默认的proftp满足日常的服务器管理用还是绰绰有余的,有个地方还是要修改一下,就是默认proftp的配置文件不支持ftp续传,所以我们只要vi /usr/local/proftpd/etc/proftpd.conf

添加以下两行

以下为引用的内容:
AllowRetrieveRestart on
AllowStoreRestart on

重新启动以下proftp,就可以正常续传文件了。

创建proftpd脚本

只要在proftp的源代码目录

cp proftpd-1.2.9/contrib/dist/rpm/proftpd.init.d /etc/rc.d/init.d/proftpd

记得修改proftpd文件,一般要修改proftpd的实际路径

chmod 755 /etc/rc.d/init.d/proftpd

ok

以后就可以用这个教本来启动,停止,重启proftp

呵呵,今天就讲这些,明天讲些proftp的一些基础配置

上次我们讲了proftp的基本安装,由于我们后面有关于mysql和quota的设置,所以编译的时候把相应的模块都编译进去了,如果你不需要mysql和磁盘限额的功能,完全可以不需要这么编译。

这里要讲一个非常实用的命令,/usr/local/proftpd/sbin/ftpshut

这个命令还是比较实用的,因为你可能需要不断的调整你的服务器,而这个命令就非常灵活,可以在不停止proftpd进程的前提下,定时停止ftp连接,这里将会详细说它是怎么使用的。

ftpshut [ -l min ] [ -d min ] time [ warning-message ... ]

-l min: 在ftp关闭服务之前的几分钟内,尝试建立新的ftp连接均不被接受

-d min: 在ftp关闭服务之前的几分钟内,已经建立的ftp连接将被中止

time: 在多少时间后,服务器将关闭ftp服务,格式有两种

+number 经过number分钟后关闭

MMHH 在今天MM:HH服务器将关闭

注意,这里我们用这个命令是把ftp服务给停了,但实际的proftpd进程还没停止,所以一般调试ftp会使用到这个命令。

举例:

再经过30分钟后,FTP服务将关闭,在这之前的20分钟不可接受任何新的ftp连接,已经建立的在服务关闭前10分钟强制断线,并在客户端显示“FTP Server Will shutdown at time”

ftpshut -l 20 -d 10 +30 "FTP Server Will shutdown at time"

其实ftpshut就是产生/etc/shutmsg ,你只要删除这个文件ftp又可以重新服务,或者直接ftpshut -R

好了,开始讲一些proftpd的基本配置吧,其实大家如果熟悉apache的配置的话,你会发现proftpd的设置基本都是类似的,它的配置基本格式是

以下为引用的内容:

#全局设置
设置项目1 参数1
设置项目2 参数2

#某个目录的设置
<Directory "路径名">
...
...
</Directory>

#关于匿名用户的设置
<Anonymous "匿名登陆的目录">
...
...
<Limit 限制动作>
...
...
</Limit>
</Anonymous>

我们用到的比较多的可能是Limit的使用,Limit大致有以下动作,基本能覆盖全部的权限了,大家灵活使用就是了。

CMD:Change Working Directory 改变目录
MKD:MaKe Directory 建立目录的权限
RNFR: ReName FRom 更改目录名的权限
DELE:DELEte 删除文件的权限
RMD:ReMove Directory 删除目录的权限
RETR:RETRieve 从服务端下载到客户端的权限
STOR:STORe 从客户端上传到服务端的权限
READ:可读的权限,不包括列目录的权限,相当于RETR,STAT等
WRITE:写文件或者目录的权限,包括MKD和RMD
DIRS:是否允许列目录,相当于LIST,NLST等权限,还是比较实用的
ALL:所有权限
LOGIN:是否允许登陆的权限

针对上面这个Limit所应用的对象,又包括以下范围

AllowUser 针对某个用户允许的Limit
DenyUser 针对某个用户禁止的Limit
AllowGroup 针对某个用户组允许的Limit
DenyGroup 针对某个用户组禁止的Limit
AllowAll 针对所有用户组允许的Limit
DenyAll 针对所有用户禁止的Limit

关于限制速率的参数为:

TransferRate STOR|RETR 速度(Kbytes/s) user 使用者

下面我们以例子来解说proftp的配置,这样大家可能更加容易理解。

以下为引用的内容:
1、ftp服务器支持断点续传,且最大支持同时10人在线,每个ip只允许一个连接;
2、允许ftpusers用户组只能访问自己的目录,而不能访问上级或者其他目录;
3、用户登陆服务器时不显示ftp服务器版本信息,以增加安全性;
4、建立一个kaoyan的ftp帐户,属于ftpusers组,kaoyan用户只允许下载,没有可写的权限。下载速率限制在50Kbytes/s。
5、建立一个upload用户,也属于ftpusers组,同kaoyan用户的宿主目录一样,允许upload用户上传文件和创建目录的权限,但不允许下载,并且不允许删除目录和文件的权限,上传的速率控制在100Kbytes/s

先是前期的用户和组添加以及目录的权限设置

以下为引用的内容:
group add ftpusers
useradd -d /home/kaoyan -g ftpusers -s /bin/fales kaoyan
useradd -d /home/kaoyan -g ftpusers -s /bin/fales upload
chown -R kaoyan:upload /home/kaoyan
chmod -R 775 /home/kaoyan

如果你只想ftpusers组的用户访问,可以设置成770都行。

设置/usr/local/proftpd/etc/proftpd.conf

注意#表示注释,对设置没影响,可以不写

以下为引用的内容:

ServerName "Frank's FTP Server"
ServerType standalone
DefaultServer on
Port 21
Umask 022
MaxInstances 30 #最多有30个proftpd的PID
User nobody
Group nobody
TimeoutStalled 10
MaxClients 10 #最多允许10个用户在线
MaxClientsPerHost 1 "对不起,一个IP只允许一个连接"
AllowStoreRestart on
#允许断点续传(上传),断点续续(下载)是默认支持的,不用设置
DisplayLogin welcome.msg #欢迎词文件
ServerIdent off #屏蔽服务器版本信息
DefaultRoot ~ ftpusers #设置ftpusers组只能访问自己的目录

<Directory />
AllowOverwrite on
</Directory>
<Directory /home/kaoyan>
<Limit WRITE> #不允许写
DenyUser kaoyan
</Limit>
<Limit RMD RNFR DELE RETR> #不允许删除,改名,下载
DenyUser upload
</Limit>
TransferRate RETR 50 user kaoyan
TransferRate STOR 100 user upload
</Directory>

我这里实现的方式还可以通过

以下为引用的内容:

<Anonymous ~kaoyan>

...

...

</Anonymous>

<><Anonymous ~upload>

...

...

</Anonymous>

而且更加灵活,具体用那种方式,看大家了,我只是给大家入个门而已

前面的两个,我想大家对proftp的设置应该有些认识,是不是跟apache的配置差不多吧。我想配置过Serv_U服务器的,再稍微看一下proftp的配置规则,应该能马上能配置出一个强大的proftp服务器。

这里我们再讲一些proftp的其他参数配置:

MaxHostsPerUser 1 "对不起,每个帐户最多允许来源ip为1个"

#MaxHostsPerUser 对防止ftp帐号还是比较有用的。

MaxClientsPerUser 1 "对不起,每个帐户在每个客户端最多可以同时登陆1次"

#这个参数可以防止多线程软件下载对服务器的破坏

MaxClientsPerHost 1 "对不起,同一个客户端只能最多1个帐号可以登陆"

#比如ftp服务端有好多帐户你都有,但也只能用1个帐号登陆

呵呵,这三个Max参数比较容易搞晕,大家可要搞清他们的含义哦

WtmpLog on

#是否要把ftp记录在日志中,如果不想可以设置成off屏蔽掉log日志。

TimeoutIdle 600

#客户端idel时间设置,默认就是600秒

DisplayLogin welcome.msg

#设置ftp登陆欢迎信息文件

关于欢迎文件的设置包含如下参数

%T 目前的时间

%F 所在硬盘剩下的容量

%C 目前所在的目录

%R Client 端的主机名称

%L Server 端的主机名称

%U 使用者帐户名称

%M 最大允许连接人数

%N 目前的服务器连接人数

%E FTP服务器管理员的 email

%i 本次上传的文件数量

%o 本次下载的文件数量

%t 本次上传+下载的文件数

知道这些参数,我们就可以写出一个友好的欢迎语

vi /home/kaoyan/welcome.msg

欢迎您%U, 这是Frank的测试FTP服务器;

目前时间是:%T;

本服务器最多允许%M个用户连接数;

目前服务器上已有%N个用户连接数;

目前你所在的目录是%C;

目录所在的硬盘还剩下%F字节。

让proftp支持现在流行的FXP传输方式,默认是不支持的。

只要在服务端设置

AllowForeignAddress on

PassivePorts 49152 65534 #端口也可自己指定喜欢的

千万别忘了在客户端也要设置成支持FXP哦,否则想我试验了好几次,一直以为服务器没设置好,其实就是客户端没设置,呵呵。

如何让root能登陆,默认proftp是不支持root登陆,我们可以设置让root也能登陆ftp,不过我在这里还是建议大家最好不要让root能登陆ftp,设置如下

RootLogin on

如何禁止某个地址访问ftp

比如禁止10.1.1网段的机器访问ftp,可以这么设置

以下为引用的内容:
<Limit LOGIN>
Order deny,allow
Deny from 10.1.1.
Allow from all
</Limit>

虚拟ftp的建立,一般用于一台ftp服务器有好多ip地址,或者ftp用不同的端口,基本设置语法是:

比如我们要做一个端口是5555的ftp服务器:

以下为引用的内容:
<VirtualHost 210.51.0.124>
ServerName "Frank FTP Server"
Port 5555
...
<Directory 目录>
...
<Limit 动作>
...
</Limit>
...
</Directory>
</VirtualHost>

至于虚拟主机中的其他设置跟我以前讲的基本差不多

上传/下载比率设置,我想用过Serv_U的朋友一定知道这个功能的使用,我们这里让proftp也实现这个功能。

要实现功能注意编译的时候加入ratio模块,否则proftp默认是不支持,假设有个帐户ftp1的ftp目录在/home/kaoyan ,然后我们设置ftp1的上传/下载比率是1:2(即上传1M,就可以下载2M)

以下为引用的内容:
touch /home/kaoyan/ratio.dat
touch /home/kaoyan/ratio.tmp
chmod -R 666 /home/kaoyan

在proftpd.conf设置如下

以下为引用的内容:
Ratios on
SaveRatios on
RatioFile /home/kaoyan/ratio.dat
RatioTempFile /home/kaoyan/ratio.tmp

在相应的设置项里添加

以下为引用的内容:
UserRatio ftp1 0 0 2 1000
#UserRatio "使用者帐户" fileratio filequota byteratio bytequota
#  fileratio :以文件为基础的比率,通常不限制,故为 0
#  filequota :预设置能下载多少文件,不限制时为 0
#  byteratio :就是上传/下载的比例,如果数字为2,表示1:2
#  bytequota :预设置能下载多少 KBytes 的文件
#上面设置的就是1:2的比率,默认只允许下载1M的文件

重启一下,以后ftp1就可以启用上传/下载比率了

今天我们讲proftp+mysql+quota的应用,我想大家最期待的就是这个了吧

1、首先我们建立相应的用户和用户组

以下为引用的内容:
groupadd -g 5500 ftpgroup
adduser -u 5500 -s /bin/false -d /bin/null -c "proftpd user" -g ftpgroup ftpuser

2、操作数据库

以下为引用的内容:

mysql mysql -uroot -ppassword
create database ftpdb
grant select, update on ftpdb.* to proftpd@localhost identified by 'password'
use ftpdb


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`)
) TYPE=MyISAM COMMENT='ProFTP group table';

INSERT INTO `ftpgroup` VALUES ('ftpgroup', 5500, 'ftpuser');

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` 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'
) TYPE=MyISAM;

CREATE TABLE `ftpquotatallies` (
`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'
) TYPE=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`)
) TYPE=MyISAM COMMENT='ProFTP user table';

注意这里大家根据实际情况填写自己数据库的用户名和密码,如果大家对数据库操作不熟悉的话,不妨可以用phpmyadmin来操作。

3、配置proftp文件

以下为引用的内容:

ServerName "Frank's FTP Server" ServerType standalone DefaultServer on
Port 21

Umask 022

MaxInstances 30
MaxLoginAttempts 3

User nobody
Group nobody

MaxHostsPerUser 1 "Sorry, you may not connect more than one time."
MaxClientsPerUser 2 "Only one such user at a time."
MaxClientsPerHost 3 "Sorry, you may not connect more than one time."

RootLogin off
RequireValidShell off
TimeoutStalled 10
MaxClients 10
AllowForeignAddress on
AllowStoreRestart on
ServerIdent off
DefaultRoot ~ ftpgroup

SQLAuthTypes Backend Plaintext
#Backend表示用户认证方式为MySQL数据库的认证方式
#Plaintext表示明文认证方式,排在最前面的为最先使用的方式
SQLAuthenticate users* groups*

# databasename@host database_user user_password
SQLConnectInfo ftpdb@localhost proftpd password
SQLUserInfo ftpuser userid passwd uid gid homedir shell
SQLGroupInfo ftpgroup groupname gid members
SQLHomedirOnDemand on
#如果用户主目录不存在,则系统会根据此用户在用户数据表中的homedir字段的值新建一个目录
# 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

QuotaEngine on
QuotaDirectoryTally on
QuotaDisplayUnits Mb
QuotaShowQuotas on
QuotaLog "/var/log/quota"
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type, bytes_in_avail, bytes_out_avai
l, 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_i
n_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}'" ftpquota
tallies

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

ok,就这么简单,重启一下proftp服务就已经能使用proftp+mysql+quota的功能

我们可以在数据库ftpuser添加一个虚拟用户

INSERT INTO `ftpuser` VALUES (1, 'test', 'ftppasswd', 5500, 5500, '/home/test', '/sbin/nologin');

大家可以在phpmyadmin里直接操作添加一个用户,相信不用我教大家怎么添加吧

如果你想设置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: - 允许传输的文件数(包括上传/下载)

老实说用mysql和quota模块来验证用户和设置磁盘限额,但我总觉得还是不够完善,因为在这个方法中,数据库表里还没有相应的权限的字段,所以说相应用户的权限还是得用实际得用户即mysql对应得uid和gid来控制权限,那天要是mysql数据库也能完全控制权限就好了。