您的位置:首页 > 运维架构 > Linux

一步一步学会linux之四 :vsftpd的企业案例

2009-04-02 08:43 274 查看
               一步一步学会linux之四  :vsftpd的企业案例
 
 
为学校架设一个ftp服务器,普通学生通过账号ftp和密码123登陆,他只能下载不能上传;再为要提供资源的学生开设个账号vip密码123,上传资源通过管理员审核合格了再提供给学生下载,服务器要实现 ip限制(如限制外网访问)时间限制(如晚上12点到早上6点不能下载) 
 
第一步:建立两个虚拟账号并生成数据库
[root@service root]# vi users.txt 
ftp
123
vip
123
  
[root@service root]# db_load -T -t hash -f users.txt /etc/vsftpd_login.db
[root@service root]# chmod 600 /etc/vsftpd_login.db
 
注:上述两步在前面的课程都已经讲过如果不明白什么意思的话回去看我的这篇文章
《一步一步学会linux之三 :vsftpd的 应用举例》
 
第二步:配置pam模块
 
[root@service root]# vi /etc/pam.d/ftp
 
#%PAM-1.0
#auth       required    /lib/security/pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
#auth       required    /lib/security/pam_unix.so shadow nullok
#auth       required    /lib/security/pam_shells.so
#account    required    /lib/security/pam_unix.so
#session    required    /lib/security/pam_unix.so
auth required pam_userdb.so db=/etc/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd_login
 
注释:重点是加入 这两行
auth required pam_userdb.so db=/etc/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd_login
 
用于处理虚拟账号的数据库,前面的为了防干扰只好把他们先注释掉 
 
第三步:建立系统用户与虚拟数据库用户关联
 
//建立帐户并把指定的文件夹给该帐户
[root@service root]# useradd -d /var/ftp/share ftpuser 
//建立文件夹 
[root@service root]# mkdir /var/ftp/share
//把文件夹的所有者和域的身份都赋给了ftpuser这个帐户
[root@service root]# chown ftpuser.ftpuser /var/ftp/share
//设置文件夹所有者读写属性
[root@service root]# chmod o=r /var/ftp/share 
[root@service root]# useradd -d /var/ftp/vip ftpvip
[root@service root]# mkdir /var/ftp/vip
[root@service root]# chown ftpvip.ftpvip /var/ftp/vip
[root@service root]# chmod o=rw /var/ftp/vip
 
注释:上面我们建立了两个系统帐户 ftpuser(其对应虚拟帐户ftp) 和ftpvip(其对应帐户为vip),从修改文件的权限我们很清楚知道我们要使虚拟帐户ftp只有下载功能(读),而
虚拟帐户vip有上传和下载功能(读写)。当然这只是设置了文件夹读写属性我们还要进一步编辑vsftpd.conf的配置文件。
 
第四步:配置相关的vsftpd.conf文件
 
接下来就要配置vsftpd.conf文件了,把vsftpd.conf所有注释了然后自己写算了如下:
#打开独立运行模式
listen=YES
#不允许匿名用户登陆
anonymous_enable=NO
#不允许匿名用户创建目录 这个最好不要打开否则会带来不可预测的后果
anon_mkdir_write_enable=NO
//不开放用户的改名、删除文件等权限;
anon_other_write_enable=NO
#允许本地用户登陆 <
193a1
span style="font-family:'宋体';">如果这个不打开的话 uid 500以下的人都被访问拒绝
local_enable=YES
#不允许匿名上传
anon_upload_enable=NO
#限制用户在当前目录
chroot_local_user=YES
#设置执行虚拟用户配置文件的目录
user_config_dir=/ftpconfig
 
Vsftpd的文件是配置好了但是我们还要继续增加需要用户的配置
[root@service root]# mkdir /ftpconfig
[root@service root]# vi /ftpconfig/ftp
 
然后在/ftpconfig/ftp的文件里加入如下内容
#开启虚拟帐户功能
guest_enable=yes
#虚拟帐户ftp为对应系统帐户ftpuser
guest_username=ftpuser
#配置虚拟帐户全局可读,允许其下载数据
anon_world_readable_only=yes
#限定传输速度30k每秒
anon_max_rate=30000
 
同理
[root@service root]# vi /ftpconfig/vip
 
guest_enable=yes
guest_username=ftpvip
#关闭匿名用户只读功能
anon_world_readable_only=no
#允许客户端写命令
write_enable=yes
#开启匿名用户上传功能
anon_upload_enable=yes
anon_max_rate=60000
 
注释:这里大家经常看到anon_匿名用户的前缀,其实虚拟用户在某种程度上更接近于匿名用户,包括上传,下载,修改文件名,删除文件等配置所使用的指令与匿名用户的指令是相同的。
 
好了这个vsftpd服务器的骨架已经出来了 下面我们来进一步的优化。
 
由于我的ftp是自己编译的所以启动时默认是standalone 模式因此用
/usr/local/sbin/vsftpd & 启动 注意用这个启动先要吧xinetd模式关了否则可能会出现错误
现在我们启动了vsftpd 然后看看测试截图。
 
 

 
图一 用ftp虚拟帐户登陆 
 

我现在换个 flashfxp ftp工具 用ftp虚拟帐户登陆 并试图上传视频文件liaoluyu2.wmv视频文件
  



           图二 上传文件失败
  

 

 

下面是下载test.mp3文件 大家观察下载速度是25.6kb/s左右
 

 



                      图三 下载文件(成功下载)
 
 

现在我们来观察虚拟帐户vip的测试:
 
上传的速度 大概是64.0kb/s
 
 



 
 

                                     图四  可以上传 速度为64.0kb/s
 
 
下载速度大概是64.0kb/s



              图五  下载速度64.0kb/s            
 
第五步:进一步配置vsftpd 之优化启动命令
vsftpd有两种工作模式,standalone模式和xinetd守护进程模式,在standalone模式下,每次修改配置文件必须重新启动vsftpd服务才能生效,而且每次用到的命令启动服务比较麻烦,我们做一个脚本来启动和停止服务。
建立一个新文件/etc/rc.d/init.d/vsftpd,把以下内容复制到文件中:

#!/bin/bash
#
# vsftpd This shell script takes care of starting and stopping
#             standalone vsftpd.
#
# chkconfig: - 60 50
# description: Vsftpd is a ftp daemon, which is the program /
#              that answers incoming ftp service requests.
# processname: vsftpd
# config: /etc/vsftpd/vsftpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
[ -x /usr/local/sbin/vsftpd ] || exit 0
RETVAL=0
prog="vsftpd"
start() {
        # Start daemons.
        if [ -d /etc ] ; then
                for i in `ls /etc/vsftpd.conf`; do
                        site=`basename $i .conf`
                        echo -n $"Starting $prog for $site: "
                        /usr/local/sbin/vsftpd $i &
                        RETVAL=$?
                        [ $RETVAL -eq 0 ] && {
                           touch /var/lock/subsys/$prog
                           success $"$prog $site"
                        }
                        echo
                done
        else
                RETVAL=1
        fi
        return $RETVAL
}
stop() {
        # Stop daemons.
        echo -n $"Shutting down $prog: "
        killproc $prog
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
        return $RETVAL
}
# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        stop
        start
        RETVAL=$?
        ;;
  condrestart)
        if [ -f /var/lock/subsys/$prog ]; then
            stop
            start
            RETVAL=$?
        fi
        ;;
  status)
        status $prog
        RETVAL=$?
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|condrestart|status}"
        exit 1
esac
exit $RETVAL
 
 
注释:没什么好说的重点是看清楚目录了自己修改下
保存文件,再给该文件加上执行权限:
    # chmod 755 /etc/rc.d/init.d/vsftpd

 这样我们就可以通过下面的方法来管理服务了:
    # service vsftpd {start|stop|restart|condrestart|status}
   
六、进一步优化配置vsftpd之用户时间限制
前面我们提过,vsftpd 服务是支持在linux下的两种服务模式:独立(standalone)模式和守护进程(xinetd)模式。在standalone模式下,vsftpd进程启动后会一直占用系统资源,当有连接请求时,它会迅速反应;在xinetd模式下,ftp服务是由守护进程统一管理,当出现ftp连接请求时,守护进程才将ftp服务启动,这种方式最大的优点是没有连接的时候ftp服务不会占用系统资源,处于睡眠状态,但因为要花费时间去唤醒该服务,所以响应时间较长。
现在我们尝试用守护进程来控制vsftpd。
我们需要在守护进程配置目录/etc/xinetd.d/里建立vsftpd 的守护进程文件。我们在安装时已经将该文件考到/etc/xinetd.d/目录下了。我们稍稍修改其内容:
     #vi /etc/xinetd.d/vsftpd

 service ftp
     {
         disable             = no
         socket_type                = stream
         wait                        = no
         user                        = root
         server                = /usr/local/sbin/vsftpd
         server_args                = /etc/ vsftpd.conf
         nice                        = 10
     }

         接下来把配置文件(vsftpd.conf)中的listen=yes或listen_ipv6=yes去掉,停掉vsftpd服务,重启xinetd服务:
     # sesrvice vsftpd stop
     # service xinetd restart
重新启动守护进程后,vsftpd 服务就会让守护进程来管理了。在守护进程管理过程中,我们再修改主配置文件的话,就不需要重新启动服务了。
 
现在我们开始实现ip 和时间限制了
1.       ip限制
在配置文件/etc/xinetd.d/vsftpd的{}中加入
only_from=主机表
如:only_from=192.168.1.0
表示只允许192.168.1.0网段内的主机访问
no_access=主机表
例如:no_access=192.168.1.0
表示禁止192.168.1.0网段内的主机访问
主机表 的内容可以查如下表:
 

 


 
 
1.       时间限制
同样在在配置文件/etc/xinetd.d/vsftpd的{}中加入
access_time = hour:min-hour:min
例如:access_time = 18:00-23:59
表示只有在下午6 点到午夜0 点之前才能访问此FTP 服务器;
又如:access_time = 8:30-11:30 13:00-18:00
表示只有在上午8 点半到11 点半和下午1 点到下午6 点才能访问此FTP 服务器。
 
注意修改完后一定要重启下 xinetd服务
[root@service root]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
 
其实 通过xinetd 还有很多要学的 东西 这里只是简单地满足vsftpd服务器的需求,现在我们开始测试下ip 和时间限制。
时间限制:我当前时间是北京时间16点正, ftp 允许时间00:00-6:00测试如图

service ftp
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/local/sbin/vsftpd
        server_args             =/etc/vsftpd.conf
        log_on_success          += DURATION USERID
        log_on_failure          += USERID
        nice                    = 10
        disable                 = no
        access_times             = 00:00-6:00
 
}
[root@service root]# service xinetd restart
Stopping xinetd:                                           [  OK  ]
Starting xinetd:                                           [  OK  ]
 



 
图七 在不允许的时间段内练级限制了
 
 
把时间改下access_times =12:00-18:00再测试
 
 
 


 图八 在允许的时间段内连接成功
注释:不同版本的时间限制命令估计是不同的,网上流传的是access_time 结果我测试了n久都失败,后来网上查了下结果发现有人用access_times于是我转成这个就成功了。还有一个地方要注意的就是access_times =12:00-18:00这个命令中access_times与=号之间记得留空格否则就会出现ftp: connect: Connection refused 的错误提示!!所以出现了这个提示大概就是/etc/xinetd.d/vsftpd文档内书写格式有误了。
 
为了测试方便我只允许192.168.0.1这台主机访问ftp服务器

service ftp
{
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/local/sbin/vsftpd
        server_args             = /etc/vsftpd.conf
        log_on_success          += DURATION USERID
        log_on_failure          += USERID
        nice                    = 10
        disable                 = no
        access_times            =20:00-23:59
        only_from               =192.168.0.1
}
 
 
 
 
 



 
图九 用192.168.0.1访问ftp服务器(允许)
 
 


 图十 用服务器自己(即192.168.0.2)访问就被拒绝
 
到此 一个简单的vsftpd 案例就讲完了如果有错的地方希望大家帮忙指正,问题讨论请邮
Weihua0722@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息