ProFTP配置方便,并有MySQL和Quota模块可供选择,利用它们的完美结合可以实现非系统账号的管理和用户磁盘的限制。下面介绍如何安装和添加虚拟用户。

安装EPEL软件包

rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

注:epel源的地址时有变化,最新地址参见:

http://mirrors.sohu.com/fedora-epel/5/i386/repoview/epel-release.html

YUM安装ProFTPd

yum install proftpd

设置开机启动

chkconfig –level 3 proftpd on

ProFTPd管理:

启动proftpd:service proftpd start
停止proftpd:service proftpd stop
重启proftpd:service proftpd restart
重载proftpd:service proftpd reload

配置文件/etc/proftpd.conf,可以通过proftpd -t6指令检测语法是否正确。

添加虚拟用户

首先我们需要设置配置文件/etc/proftpd.conf

添加下面代码进配置文件:

AuthUserFile /etc/ftpd.passwd
AuthGroupFile /etc/ftpd.group

关闭检测/etc/shells:

RequireValidShell off

设置仅使用虚拟用户认证:

AuthOrder mod_auth_file.c

禁止PAM认证:

PersistentPasswd off
AuthPAM off

限制改变根目录:

DefaulRoot ~

按照上面的要求设置好配置文件后,我们使用ftpasswd工具来添加虚拟用户,首先下载这个工具。

cd /usr/sbin/
wget http://www.castaglia.org/proftpd/contrib/ftpasswd
chmod +x ftpasswd

ftpasswd工具的格式如下:

添加:

ftpasswd -passwd -file /etc/proftpd/ftpd.passwd -uid {uid} -gid {gid} -home {home} -shell /sbin/nologin -des -name {username}
更改密码: ftpasswd -passwd -change-password -file /etc/proftpd/ftpd.passwd -name {username}

删除:

ftpasswd -passwd -delete-user -file /etc/proftpd/ftpd.passwd -name {username}

更多命令执行 ftpasswd -help或查看:

http://www.castaglia.org/proftpd/contrib/ftpasswd.html

配置文件详解

#proftpd.conf的全局设置

ServerName               "FTP Server "  #服务器的名字

ServerType               standalone     #proftpd运行的方式,有standalone和inetd

DeferWelcome             off        #只有在认证用户之后才显示欢迎信息

ServerIdent              off      #登陆的时候不显示ftp服务器的相关信息,增加安全性

User                     nobody    #以nobody,nogroup的身份运行程序

Group                    nogroup

Port                     21          #指定FTP的端口,默认是21端口

Umask                    022          #新文件的权限掩码

ShowSymlinks             off          #不显示链接文件的目标文件

DefaultRoot              ~  !username # ~用户只能访问自己的目录,!usernmae用户除外RequireValidShell        off         #用户是否拥有shell,关闭安全,这个就是指用户不具有登陆 \                                     >shell的权限,同样可以登陆ftp

UseReverseDNS            off          #关闭DNS反向查询,节省连接时间        

TimeoutLogin             60        #登陆时等待输入密码的时间

TimeoutIdle              300       #登陆后允许IDLE的时间

TimeoutNoTransfer        600       #没有数据传输时允许IDLE的时间#

AllowStoreRestart        on        #允许断点续上传

AllowRetrieveRestart     on        #允许断点续下载

AllowForeignAddress      on              #要允许 FXP 写成 on

PassivePorts             50000 65534     #指定被动模式端口的范围

MultilineRFC2228         on              #FTP安全扩展

MaxClients               100             # 最大链接数限制

MaxInstances             100             #最大实例数为30

MaxClientsPerHost        2 "每个IP只允许2个连接"  #每个IP只能有两个连接

ServerLog               /var/log/proftpd/ #日志文件 

AllowOverwrite           on               #允许覆写.

AuthPAM                  on               #设置是否采用PAM用户认证模块进行用户认证。 

AuthPAMConfig     ftp   指定进行PAM认证时使用的配置文件名称,配置文件位于etc/pam.d/目录下。 
#某个目录的设置

<Directory "路径名">

...

...

</Directory>
#关于匿名用户的设置

<Anonymous "匿名登陆的目录">

...

...

<Limit 限制动作>

...

...

</Limit>

</Anonymous>
#关于用户权限的参数说明

CWD: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 100 user xx    限制用户上传的速度

TransferRate RETR 50 user  xx    限制用户下载的速度
#ProFTPD建立虚拟用户

在Windows下FTPD以某一个帐号运行,所有的FTP用户权限管理全部由FTPD来完成与系统帐号无关。但是在xNix下则不同,FTPD只允许那些系统帐号登陆。但是我们往往希望FTPD用户和系统帐号分离方便管理。这样就需要使用ProFTPD的虚拟用户功能。

  首先在proftpd.conf中添加:

    AuthOrder mod_auth_file.c mod_auth_unix.c

    AuthUserFile /usr/local/etc/ftpd.passwd

    #AuthGroupFile /usr/local/etc/ftpd.group

  AuthOrder为FTP用户身份验证顺序。mod_auth_file.c是ProFTPD的虚拟用户验证,虚拟用户和组的信息存储在下面的AuthUserFile和AuthGroupFile指定的文件中,不过我想搞简单点所以就不要虚拟组了。mod_auth_unix.c是系统用户身份验证,即/etc/passwd。

然后使用添加如下命令添加一个新的虚拟用户:

ftpasswd --passwd --file=/usr/local/etc/ftpd.passwd --name=test --uid=1002 --home=/usr/local/ftp/test --shell=/usr/sbin/nologin

–passwd指定建立一个新的虚拟用户,–group则建立一个虚拟组;

–file指定存储虚拟用户的文件;

–name指定此虚拟用户的用户名,密码会在命令执行时要求输入;

–uid指定此虚拟用户对应的系统用户UID,此虚拟用户将以此系统UID的身份读写文件;

–home指定此虚拟用户的根目录,就是其登陆FTP后的根目录;

–shell指定此虚拟用户的shell,为了安全当然指定一个不可登陆的shell了。
#PAM认证模块使用实例

auth required /lib/security/pam_listfile.so item=user sense=allow file =/etc/ftpwho onerr=fail 

其中的pam_listfile.so模块就是用来实现基于用户的ftp控制。Item=user就表明是通过用户名进行控制,sense=allow表示如果用户名出现在/etc/ftpwho文件中就返回认证成功信息,file=/etc/ftpwho指定配置文件,onerr=fail表示如果出现某些错误(比如无法打开配置文件等)时返回的结果,这里是失败信息

常见问题

Q:在那里可以找到最新版本?

A:请您查看www.proftpd.org

Q:welcome.msg与.message有什么区别

A:请您看proftpd.conf中的描述

DisplayLogin welcome.msg
DisplayFirstChdir .message

也就是说welcome.msg在登陆时显示,而.message在每次更改目录时显示

Q:在本机上能登录proftpd,在局域网和其他地方不行,why?

A:请您降低您的防火墙设置,使用setup进行设置

Q:如何限定每个ip的最大连接数(匿名)?

A: 请您参看Configuration.html,默认值如下

#MaxClientsPerHost none

Q:安装proftpd时,出现类似“configure: error: no acceptable cc found in $PATH”,怎么办?

A:请您安装GCC编译器及其依赖软件包

Q:如何限制用户上载和下载的速率?

A:请您使用以下参数

RateReadBPS RateReadFreeBytes
RateWriteBPS RateWriteFreeBytes
RateReadBPS和RateWriteBPS限制下载和上载的速率
RateReadFreeBytes和RateWriteFreeBytes限制当用户现在这么多数据量以后再进行限速,这样可以实现对于小文件不限速,而大文件限速。

Q:如何设置空闲超时时间?

A:请您检查

TimeoutIdle 设置空闲连接超时时间
TimeoutLogin 设置空闲登陆超时时间
TimeoutNoTransfer 设置当没有数据传输时的超时时间
TimeoutStalled 设置被阻塞的下载的超时时间

Q:如何禁止admin用户登录自己的home目录?

A:请您在proftpd.conf中使用DefaultRoot ~ !admin

Q:达到最大用户数限制时,如何给出提示信息?

A:请您在proftpd.conf中使用MaxHostsPerUser 100 “对不起,已经到达该用户最大连接数100,请您稍候再试!”

Q:怎么限制每个IP允许的线程数?

A:请您在proftpd.conf中使用MaxClientsPerHost 1 “对不起,每个ip只允许有1个连接!”

Q:如何查看proftpd的运行信息或者进行调试?

A:请您使用命令/usr/local/sbin/proftpd -d9 -n

Q:普通用户可以登录,但匿名用户无法登录?

A:请您检查proftpd.conf,修改为(这里/home/ftp可以是任何希望匿名用户登录以后的当前根目录,但是确保要使该目录允许ftp用户访问),并且若部分的User指令指定的用户为ftp用户,则需要在配置文件中添加如下命令指示:RequireValidShell off,如果还不行,请删除相应帐号,并重新创建用户及其相应的组

Q:如何限制一个正常用户登录以后只能访问某个目录?

A:可以通过指令DefaultRoot来实现。例如若希望将ftpusers组的用户限定在自己的home目录下,则需要首先创建该组: /usr/sbin/groupadd ftpusers然后将用户ideal加入到该组中: usrmod -G ftpusers ideal 最后在proftpd.conf文件中添加如下内容: DefaultRoot ~ ftpusers

也可以限制用户登录以后仅仅访问自己主目录下的一个子目录:

Default! Root ~/anoftp ftpusers

当然也可以将用户限制在其他目录之下,而不是自己的home目录下:

DefaultRoot /tmp ftpusers

也可以限定一个用户组的某些用户被限制,而其他不作限制:

DefaultRoot ~ ftpusers,!empolyee

这个指令指示仅仅限制ftpusers组中的不是empolyee组的用户进行限制。

Q:如何隐藏服务器版本信息,以增强安全性

A:请您在proftpd.conf中添加ServerIdent off

Q:如何设定虚拟主机?

A:您可以通过指令:VirtualHost来实现,一个最简单的例子:

ServerName “virtual FTP server”

若您仅仅希望通过匿名访问某个虚拟主机,则使用如下! 的指令:

Serv erName “virtual FTP server”
DenyAll
User private
Group private
AllowAll

这样192.168.2.35的这台主机则仅仅允许匿名登录。

Q:为何我配置的proftpd在用flashget的站点资源管理器时总是到list-la这一步时出错,即客户端不能列目录, 但用ie浏览器就可以自由的进入各个目录?

A:端口21是ftp 的command端口,而文件列表和数据则是通过数据端口,例如“正在连接 ftp 数据 socket 61.138.232.37:1120”,估计是防火墙规则的问题,请注意你的防火墙配置是否正确

Q:如何禁止root登录

A:请您在proftpd.conf中添加RootLogin off

Q:如何设置最大尝试次数?

A:请您在proftpd.conf中添加MaxLoginAttempts 3,其中3是你设的数值

Q:在Redhat8.0下装proftpd_1.2.6,每次服务启动完后,登陆的时候总是显示:500 FTP server shut down (going down at Sat Oct 5 15:59:31 2002) — please try again later. 这是怎么回事啊?

A:请您删除shutmsg文件,rm -f /etc/shutmsg

Q:怎么把数据连接类型改成PASV?

A:请您在proftpd.conf里添加PassivePorts 49152 65534

Q:在shell下用了ftpshut后,再在shell下用proftpd命令后,总提示ERROR: Syntax error, command unrecognized.怎么办?

A:请您使用ftprestart

Q:文件在多个分区中,要求在一个ftp目录中出现,如何实现?

A:您可以使用mount –bind命令,把文件都挂接到一个目录,然后再把虚拟路径指向这个目录

Q:装proftpd时,./configure再make,然后它就一直在循环checking文件,why?

A:一般是文件属性检查错误,请您检查文件属性是否正常,如下载时,电脑时间是否正确

Q:我想让匿名用户访问我的windows分区文件夹,请问如何实现?

A:请您在/etc/fstab文件中使fat分区自动mount到anonymous主目录就可以了’

后注:

1.用./sbin/proftpd start 来起动ftp服务时,报找不到 libmysqlclient.so.10文件错误 解决:

1) echo “/usr/local/mysql/lib/mysql” » /etc/ld.so.conf

2) ldconfig -v|grep libmysqlclient

2.安装完proftpd,启动报No such group “nogroup”错误

解决:修改./etc/proftpd.conf 把nogroup改成nobody

3.如何限制只有指定IP可以访问本地FTP服务器呢?

Order allow,deny
Allow from 192.168.0.
Deny from all

From 192.168.0.0/24 
AllowClass friends
DenyAll

或在iptables中设置

A RH-Firewall-1-INPUT -m state –state NEW -s 192.168.0.2 -m tcp -p tcp –dport 22 -j ACCEPT
A RH-Firewall-1-INPUT -m state –state NEW -s 192.168.0.2 -m tcp -p tcp –dport 21 -j ACCEPT

参考:

http://www.itwhy.org/2011/07-19/612.html