鸟哥的 Linux 私房菜 -- FTP Server -- ProFTP

since2012/04/23

     
 
简易 FTP Server 架设 -- Pro FTPD
本文已不再维护,更新文章请参考此处
最近更新日期:2003/09/05
我们知道在 Internet 上面有个很快速的文件传输协议,就是 FTP !而且也知道最古老的 FTP 服务器软件之一就是那个很出名的 Wu FTP 啰!但是,虽然 Wu FTP 的速度快、架设方便,不过由于招牌老且大,所以『深受怪客 ( Cracker ) 的喜好』啊!导致 Wu FTP 的安全性堪虑~此外, Wu FTP 受限于他的架构问题,所以一些在 Win32 上面执行的 FTP 功能 ( 例如很出名的 Server-U ) 在 Wu FTP 上面都没有办法很简易的就达成这样的功用!为了改善安全上面的疑虑以及增强 FTP 软件的设定便利性,所以就有这个 Professional FTP daemon (proftpd) 的产生啦!这个 proftpd 并非用来与 Wu FTP 打对台的,但是由于他的设定弹性太高了!所以渐渐的大家都倾向于使用这个 FTP 软件来架设自己的 Linux 服务器呢!呵呵!如果你是使用 Wu FTP 的使用者,也可以尝试以这个 proftpd 来取代 Wu FTP 喔!应该会更安全的啦!而,如果您习惯使用 Server-U 来设定特殊账号的上传/下载数据的话,呵呵!那么 proftpd 就是您转换跑道的首选了!


大标题的图示前言:
    众所皆知的, FTP 是一个行之有年的网络协议,我们可以透过 FTP 这个协议在不同的作业平台上面进行档案的传输、删除与移动等等的工作,而使用最为广泛的 FTP 架设软件就是那个 Wu FTP 了!但是由于 Wu FTP 毕竟在『安全历史』的过程中,实在是被发现了太多的危险漏洞了,所以目前有相当多强调安全性的 FTP 服务器软件渐渐抬头,其中之一就是这个有名的 Professional FTPD 了!底下我们来谈一谈为何需要有这个服务器软件以及相关的其他说明吧!
     

    为什么要使用 Professional FTP daemon 呢?
     
    既然 Wu FTP 这个服务器软件并不是十分的安全,所以这个 Pro FTPD 当然主要就是以较为安全的角度去设计的一个全新的 FTP 服务器软件了!在 ProFTPD 的官方网站上面也提出了,最早设计这个 FTP 的理念不是想要『干掉 Wu FTP 』,而是希望给予大家一个更为安全,且在设定上面更为便利的一个 FTP 服务器软件啰!除了安全性之外,为何还要强调『设定便利性』呢?这是因为目前在 Windows 的系统当中 ( Win32 ),有个相当有名气的 FTP 服务器软件,那就是鼎鼎大名的 Server-U 啰!这个 Server U 实在是很厉害,在设定上面相当的简易,此外,还可以根据不同的使用者给予不同的传输速度与上传、下载比例,设定上面又很有弹性,实在是难能可贵的一套软件!那么我们的 Wu FTP 能否达到这样的功能呢?当然可以啰!不过.....设定上确实比较麻烦~因此上,这个 proftpd 可就帮了个大忙啰!
     
    基本上, ProFTPD 主要具有底下的几个特征:
     
    • 主要的配置文件仅有一个,设定上甚为简易;
    • 每一个开放出去的目录底下的 .ftpaccess 可以用来取代 ProFTPD 的主要配置文件规范的参数, .ftpaccess 功能类似于 Apache.htaccess 喔;
    • 设定 FTP 成为具有虚拟 FTP 主机与匿名登录 FTP 主机的设定甚为简易;
    • 可以依据个人的设定要求,以 stand-alone 的方式或者 inet/xinet (Super daemon) 的管理方式来启动;
    • 匿名登录时,用户所登入的目录底下,不需要额外的 binary 执行程序的支持,具有较佳的安全性;
    • 不需要 Linux System 本机的执行程序的支持,由于使用 Linux 本机的程序可能会造成系统安全上的顾虑, ProFTPD 在自己的原始码当中已经含有所需要的执行指令了,所以不需要系统的 binary 执行文件的支持,系统安全上面较可靠;
    • 仍然具有 Linux 系统本身的 user/owner 权限属性,以及隐藏文件的属性等等均存在;
    • 使用者登入 ProFTPD 时,登入的信息将会存放一份在 utmp/wtmp 的登录档中,这是什么呢?这就是使用 last 可以显示出登入信息的重要登录文件啰!
    • 登录密码可支持 Shadow 密码档案 ( /etc/shadow ),亦同时支持已经死亡的账号 ( 请参考『鸟哥的 Linux 私房菜 -- 基础学习篇』里面的 账号管理部分关于 shadow 的介绍 )
     
    看起来觉得真的很不错吧!呵呵!尤其是那个 .ftpaccess 档案更是能够引起使用者的『兴趣』呢!怎么说呢?还记得在 Apache 里面如果使用者想要架设一个属于自己的个人首页时,可以依照 .htaccess 设计自己的风格啊!同样的,在 ProFTPD 当中,使用者也可以藉由 .ftpaccess 这个档案来『设计属于自己的 FTP 主机』喔!可以不必依照 Linux 本机 FTP 服务器软件的僵化设定呢!呵呵!真是粉不错喔!
     

    架设之前你需要了解的原理
     
    与之前我们所说明各个 Server 的架设时需要知道的原理一样,这里我们还是得针对 FTP 的『联机原理』来说明一下,但是这部份我们已经在 Wu FTP 里面说过了,所以请前往 Wu FTP 那一章节好好阅读一下吧!在开始 FTP 的设定之前,你必须要知道的原理有:
     
    • FTP 在 Client 与 Server 进行联机时,主要使用到的 port 有几个?分别具有什么用途?
    • Client 与 Server 进行 FTP 联机时,其模式分为 Active 与 Passive ,这两种模式的差异为何?
    • 当 FTP 架设在防火墙内部时,则这个 FTP 需要使用的联机模式为何?
     
    如果你能够了解上面的几个细节,那么设定 FTP 是一点也不困难的呢!底下我们就来谈一谈这个好用的 proftpd 吧!

大标题的图示套件安装
    虽然 Wu FTP 可能还是目前使用上最广泛的 FTP 服务器软件,不过,毕竟安全上面有点小问题,所以近年来各主要的 Linux distributions 在发布 FTP 服务器软件时,渐渐的都以 ProFTPD 来取代 Wu FTP 了!例如近期的 Mandrake 9.x 等等!而由于这些主要的 distribution 使用的是 RPM 的安装方式,因此,呵呵!如果您的系统是属于这些较近期的版本,那么就直接以 RPM 的方式来安装这个 FTP 服务器软件即可!
     
    不过,毕竟使用 Wu FTP 的朋友大有人在,而且在提供 Wu FTP 套件的 distributions 通常是不提供 proftpd 的 RPM 版本的,所以这里我们主要也以 Tarball 的方式来安装 ProFTPD 。如此一来,不论您原先是使用 Wu FTP 还是原本就是 ProFTPD ,都可以经由 Tarball 的方式来重新安装一次你的 FTP 服务器软件呢!废话不再多说了,赶紧来看看怎么以 Tarball 的方式安装 ProFTPD 吧!
     
    • 下载 proftpd:

    • 您可以前往 ProFTPD 的官方网站下载 proftpd ,不过,蛮建议在台湾的中山大学 FTP 网站下载的,他的速度也是粉快的喔!中山大学关于 ProFTPD 的网址在:http://ftp.nsysu.edu.tw/Unix/FTP/proftpd/distrib/source/,我在这里测试的版本是 1.2.8 这个在 2003/03 出的最新版的 ProFTPD 喔!所以他的档名应该是:proftpd-1.2.8.tar.gz 这个档案的啦!你也可以在我们网站下载 ( http://linux.vbird.org/download/index.php#proftpd ),你可以使用 wget 或者是 ncftp 来到各大 FTP 网站下载喔!
     
    • 设定、编译与安装 proftpd:

    • 又到了这个时刻了!请注意您的 gcc 以及 make 有没有安装啊!如果没有安装的话,就赶紧先安装吧!我们要来安装 ProFTPD 啰 ( 注:我是在 Red Hat 9 上面进行编译测试的! ):
      1. 将刚刚下载的 proftpd 解压缩:
      [root@tet root]# wget  \
      http://ftp.nsysu.edu.tw/Unix/FTP/proftpd/distrib/source/proftpd-1.2.8.tar.gz
      [root@test root]# cd /usr/local/src
      [root@test src]# tar -zxvf /root/proftpd-1.2.8.tar.gz
      # ...(略)...会主动产生 proftpd-1.2.8 的目录
      [root@test src]# cd proftpd-1.2.8
      # 在这个目录底下的 INSTALL 请详细的阅读,里面有安装的几个重要信息!
       
      2. 进行编译前的参数设定:
      [root@test proftpd-1.2.8]# ./configure --prefix=/usr/local/proftpd \
      > --enable-shadow --enable-autoshadow  \
      > --with-modules=mod_ratio:mod_readme:mod_wrap
      # 请注意,那个 prefix 表示我预计要安装 proftpd 的目录;
      # 至于 --enable-shadow 与 --enable-autoshadow 则是预计要以
      # 系统的 /etc/shadow 做为我的 FTP 登入时的密码验证档案!
      # 此外,还加入许多的支持模块,会让我们的 Proftpd 变的更活泼!
       
      [root@test proftpd-1.2.8]# make && make install
      # 经过这个步骤之后,你的 proftpd 就会安装在 /usr/local/proftpd 之内,
      # 其中,配置文件在 /usr/local/proftpd/etc/proftpd.conf !
      # 至于说明档 (man pages)则在 /usr/local/proftpd/man 当中!
       
      3. 设定一些查询的相关功能!
      [root@test proftpd-1.2.8]# vi /etc/man.config
      # 加入底下这一行,这样才能以 man 来查询指令的用法!
      MANPATH /usr/local/proftpd/man
      很简单吧!这样就已经编译并且安装好了 Proftpd 啰!^_^!接下来就要开始来测试看看啰!
       
    • 设定以 xinetd 来启动 proftpd :

    • 事实上,目前大部分的 FTP daemon 多是以 super daemon 来启动的!所以这里我们也直接以 xinetd 来设定 proftpd 吧!毕竟多了一层管理,会更安全的啊! ^_^!设定的方法也真是很简单~只要编辑 xinetd 底下的 proftpd 以及 proftpd.conf 档案里面的一些内容即可!
      [root@test root]# vi /etc/xinetd.d/proftpd
      service ftp
      {
        disable        = no
             flags           = REUSE
             socket_type     = stream
             wait            = no
             user            = root
        server         = /usr/local/proftpd/sbin/proftpd
             server_args     = -c /usr/local/proftpd/etc/proftpd.conf 
             log_on_success  += DURATION USERID
             log_on_failure  += USERID
      }
      # 上面的重点在于两行粗体字的地方!尤其是 server =.. 那一行!
      # 由于我们是使用 Tarball 安装的,自然就以我们的档案放置目录为主,
      # 如果您使用 RPM 安装,这里就不太相同啰!
      # 另外,那个 server_args 后面接的则是配置文件的档名咯!
       
      [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
      # 找到底下这个设定值:
      ServerType                      standalone
      Group                           nogroup
      # 因为我们的系统默认并没有 nogroup 这个群组,所以必须要将他改成
      # 系统里面有的群组才行吶!而服务器启动的方式有 super daemon 与 
      # stand alone ,所以:
      ServerType                      inetd
      Group                           nobody
       
      [root@test root]# /etc/rc.d/init.d/xinetd restart
      [root@test root]# netstat -tlnp
      tcp        0      0 0.0.0.0:21    0.0.0.0:*    LISTEN  8483/xinetd
      # 呵呵! 21 这个埠口出现了!理论上没有问题,不过还是需要分析一下
      # /var/log/messages 这个档案的内容才行喔!
      一般来说,我们还是比较建议使用 xinetd 的方式来启动服务的,尤其是 FTP 之类的服务器架设。在这个案例当中,我们就使用了 xinetd 来启动,不过, proftpd 的配置文件 proftpd.conf 里面就必须要规定好 ServerType 这个设定值,有两个选择:
       
      • standalone:表示独立启动的意思;
      • inetd:表示使用 super daemon ,不论是 inetd 或者是 xinetd 均使用这个设定值。
       
      所以啰,这里需要修订好才行!然后就可以正确的来启动啰!很简单吧! ^_^! 好了,准备来详细的分析 proftpd 啰!

大标题的图示Server 端设定:
    Proftpd 在设定上简单是很简单,不过,如果要说复杂的设定的话,又很多样化喔!那么就来谈一谈吧!
     

    proftpd 的结构
     
    这个 proftpd 服务器的架构其实也是很简单的!主要配置文件仅有一个而已,我们就来说一说 proftpd 需要注意的档案吧!
     
    • proftpd.conf:这个就是主要的 proftpd 的配置文件了!在 RPM 安装的范例中,他所在的目录为 /etc/proftpd.conf ,在鸟哥的这个范例中,则是放置在 /usr/local/proftpd/etc/proftpd.conf 当中喔!我们未来要谈的种种 proftpd 的设定,均是在这个档案里面设定的。他详细的设定方法其实在这个 proftpd.conf 档案里面就已经写得很详细咯!而且 proftpd 也提供了很详细的文件数据了,如果是以 RPM 安装您的 proftpd 的话,那么文件档案放置在 /usr/share/doc/proftpd-"版本"/Configuration.html ,若以 Tarball 安装则在 /usr/local/src/proftpd-"版本"/ Configuration.html。不过,该说明档实在是太复杂了~只要知道其中一些主要设定即可!这也是我们在后续的介绍所想要传达的喔!

    •  
    • proftpd:这个是主要的 proftpd 的 daemon 执行档!我们得要启动他才行喔!此外,这也是 TCP Wrappers (/etc/hosts.deny(allow))设定里头的服务档案档名。另外,当 proftpd 在启动的时候会去读取配置文件,也就是 proftpd.conf 这个档案,不过,我们也可以指定其他的档案来进行 proftpd 的设定喔!果真如此,就必须要这样启动 proftpd 了:
    • [root@test root]# proftpd -c 配置文件档名
      [root@test root]# proftpd -c /usr/local/proftpd/etc/proftpd.conf
       
    • ftpcount:目前在主机上面使用 proftpd 的联机数,直接在指令列下达 ftpcount 即可!

    •  
    • ftpshut:指定再过多久之后 proftpd 服务会终止!有的时候我们会需要维护 FTP 主机对吧!所以需要关机啊!关掉 ftp 服务之前,可以使用这个 ftpshut 指令来进行喔!他的语法如下所示:
    • [root@test root]# ftpshut [-l 分钟] -d [分钟] 时间 "讯息"
      参数说明:
      -l  :在 FTP 服务器关闭服务之前的多少分钟,尝试建立新的 FTP 联机者均不被接受
      -d  :在 FTP 服务器关闭服务之前的多少分钟,以建立的 FTP 联机将强制被终止
      时间:在什么时候或多少分钟后, FTP 服务器将关闭 FTP 服务!格式有两种:
         +number :再经过 number 分钟后 FTP 会关闭
         MMHH    :在今天的 MM:HH 时间 FTP 会关闭
      讯息:显示给 user 看的信息!
      范例:
       
      范例一:
      # 再经过 180 分钟后,FTP 会关机,且关机前 20 分钟即不可再接受新联机,
      # 而以建立的联机在关机前 10 分钟强制断线,并在 client 端显示:
      # FTP will shutdown at time
      [root@test root]# ftpshut -l 20 -d 10 +180 "This FTP will shutdown at time"
      事实上, ftpshut 仅会建立一个档案,亦即是 /etc/shutmsg 而已,还记得这个档案吧?!在前一章 Wu FTP 主机设定里面的最简单的 ftpaccess 设定,里头第八项提到的项目,呵呵!没错!就是这个档案咯!如果您想要重新启动 FTP 服务的话,只要将这个档案杀掉,或者是将这个档案里面的相关数字修改一下即可!请翻至前一章节查阅喔!
       
    • ftpwho:可以用来察看目前有多少人使用 proftpd 这个服务喔!简单的语法直接下达 ftpwho 即可,如下所示:
       
      [root@test root]# ftpwho
      standalone FTP daemon [8451]:
      10194 badbird    [ 0m11s]   0m6s (idle)
      Service class                      -   1 user
      # 如上所示,目前有一个使用者,名为 badbird 的账号,在使用 proftpd 喔!
       
    大致上就是这样啦!咦!怎么没有提到 anonymous 登入 FTP 时的根目录呢?呵呵!那个咚咚是在 proftpd.conf 里面设定的啦!等一下再告诉你!
     

    proftpd.conf 的设定方式
     
    Proftpd 最重要的设定是在 proftpd.conf 这个档案内了!好了,那么这个档案的内容是如何设定的呢?基本上,这个档案的设定与 Apache 很类似吶!有点像这样:
     
    # 关于主机相关的设定
    设定项目一  参数内容
    设定参数二  参数内容
     
    # 关于某些目录的权限设定
    <Directory "完整目录名称">
    ...
    ...
    ...
    </Directory>
     
    # 关于 Anonymous 的目录与权限设定
    <Anonymous "匿名登录时候的匿名者根目录">
    ...
    ...
     <Limit 一些动作>
     ...
     ...
     </Limit>
    </Anonymous>
     
    是否与 Apache 主机的配置文件: httpd.conf 语法很类似呢?所以啰,呵呵,设定上也有很相似的参数喔!反正,只要是没有被 <xxx> </xxx> 包含在内的设定参数,都是属于主机与 Real User 的设定值,而与匿名者有关的设定则是在 <Anonymous> 与 </Anonymous> 内的设定值!此外,我们还可以透过 <Limit> 这个设定参数来订定某些动作是否可做喔!至于在这个档案内,只要该行是以 # 开头,表示该行是『批注』而已的啦!好了,那么 Limit 有哪些动作呢?!基本上有底下这些:
     
    • CWD  :Change Working Directory,变换目录之意;
    • MKD  :MaKe Directory,可建立目录与否;
    • RNFR :ReName FRom,可更改档名与否;
    • DELE :DELEt,可删除档案语法;
    • RMD  :ReMove Directory,可移除目录与否;
    • RETR :RETRieve,下载之意!由 Server 传送数据到 Client;
    • READ :可读取与否
    • WRITE:可写入与否
    • STOR :STORe,上传之意,由 Client 传送数据到 Server !
    • ALL  :全部的动作!
     
    除此之外,我们还可以指定 .ftpaccess 这个档案的设定呢!这与 proftpd.conf 内的 AllowOverride 参数有关!这个 .ftpaccess 就是允许使用者自行设定 FTP 的风格,当 FTP 的 Client 软件登入某个目录,而该目录内支持 .ftpaccess 时,那么该 FTP Client 软件将接受 .ftpaccess 的使用者自定义风格喔!这个 .ftpaccess 与 Apache 的 .htaccess 有类似的用法咯! ^_^!还有, proftpd.conf 也支持变量,变量的内容如下:
     
    %T 目前的时间
    %F 所在硬盘剩下的容量
    %C 目前所在的目录
    %R Client 端的主机名
    %L Server 端的主机名
    %U 使用者账号名称
    %M 最大允许联机人数
    %N 目前的主机联机人数
    %E FTP 主机管理员的 email 
    %i 本次上传的档案数目
    %o 本次下载的档案数量
    %t 本次上传+下载的档案数量
     

    最简单的 proftpd.conf 配置文件
     
    事实上,当我们安装好了 proftpd 之后,就已经提供了一个很简单但是已经够用的 proftpd.conf 的设定内容了!我们就来谈一谈这个简易的设定内容吧!
     
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 底下是 FTP 主机的环境设定,每个项目的内容为:
    # ServerName :当用户登入主机的时候,proftpd 会显示在 Client 端
    #       的 FTP 软件的一些基本讯息啦!
    # ServerType :启动 proftpd 的方法,有两种方式,分别是 standalone
    #       与 inetd ,因为我们是以 super daemon 启动的,所以
    #       设定为 inetd 喔!如果您想独立启动(不透过 xinetd )
    #       就需要设定为 standalone 了
    # DefaultServer:默认的主机啊!这个项目可以设定为 on 或 off ,基本上,
    #        除非您有两个 IP 或者是设定了虚拟主机 (virtualhost),
    #        否则这个项目都应该要设定为 on 才行!不然有些 uknown 
    #        的联机会无法连接到您的 FTP 服务喔!
    # Port :设定主机的 FTP 命令通道端口口!如前面 Wu FTP 所说明的,FTP
    #    命令通道通常为 21  ,您也可以更改,不过,这个设定只有当
    #    ServerType 为 standalone 时才有效!若为 inetd 则与 xientd 及
    #    /etc/services 有关那!请前往参考 wu FTP 的修改 port 设定
    # Umask :与建立目录及档案的默认属性有关的设定喔!用 022 就够了!
    # MaxInstances:同一时间允许的联机数目,这个设定项目与 process (PID) 有关!
    #        所以您的 FTP 主机中,proftpd 启用的 process 最多能有30个
    #        这个与 MaxClients 不一样喔!
    # User 与 Group:proftpd 预设的服务启动者!后面接的使用者与群组
    #        必须在 /etc/passwd 与 /etc/group 里面存在方可!
    ServerName                      "这个是鸟哥的测试用的 Proftp 主机"
    ServerType                      inetd
    DefaultServer                   on
    Port                            21
    Umask                           022
    MaxInstances                    30
    User                            nobody
    Group                           nobody
     
    # 底下则是与目录有关的设定!在这个设定中,显示允许读写与覆盖档案!
    # AllowOverwrite 就是允许覆写的意思!
    <Directory />
      AllowOverwrite                on
    </Directory>
     
    # 底下与匿名登录者有关!由 <anonymous ~ftp> 显示:『预设的匿名登录之
    # 根目录为 ftp 这个用户的家目录!』,因为 ~ 代表家目录的意思!
    # 而且,匿名登录主机后,该 process 取得的 user:group 权限为 ftp:ftp!
    # 至于那个 UserAlias 就是在设定『名字的别名』啊!语法为:
    # UserAlias "登入者的账号" "实际 Linux 主机的账号"
    # MaxClients:最多仅允许 10 个 anonymous 登入我们主机的意思!
    # DisplayLogin:当使用者登入之后的欢迎画面的档案内容!
    # DisplayFirstChdir:转换到某目录时(cd指令),显示该目录的注意事项档案内容
    <Anonymous ~ftp>
      User                          ftp
      Group                         ftp
      UserAlias                     anonymous ftp
      MaxClients                    10
      DisplayLogin                  welcome.msg
      DisplayFirstChdir             .message
     # 底下则是限制 anonymous 『不具有写入的权限!』因为 WRITE 是写入,
     # 加上 DenyAll 则是写入的权限被取消之意!
      <Limit WRITE>
        DenyAll
      </Limit>
    </Anonymous>
     
    所以,在这个例子当中,我们的 proftpd 具有下列功能:
     
    • 以 super daemon 启动 proftpd ,且启动 proftpd 的权限为 nobody:nobody ,此外,最多仅具有 30 个 process;
    • proftpd 使用 port number 为 port 21 喔(其实是需要看 /etc/xinetd.d/proftpd 的设定)!
    • 这个 proftpd 同时允许实体用户(real user)与匿名用户(anonymous)登入!
    • real user 可以跳离自己的家目录(没有 chroot),且具有写入的权限,此外,建立目录与档案默认权限为 dir:755, file:644;
    • anonymous 用户最多仅能同时 10 人上线,且具有的权限为 ftp:ftp,并且『anonymous 没有写入的权限!』
     
    事实上,这样的设定已经能够符合一般主机的设定啰!如果您还不满意,可以额外的再加入其他的设定喔!底下就来谈一谈!
     

    针对实体用户的设定
     
    事实上,在上面的 最简单 proftpd.conf 设定 当中就已经针对了实体用户( Real User )进行了若干的设定了!不过,如果您还想额外的加入某些设定,那么就继续来修改吧!假设我们需要这样的设定项目:
     
    • 使用主机本地端时间,而不要使用 GMT 时间;
    • 主机最多允许 50 条联机,且最多允许 100 个使用者上线,当超过 100 个使用者还有其他 FTP 要求时,就显示:『很抱歉,上线人数额满了!』;
    • 同一个 IP (或主机) 来源最多仅能具有 5 个 FTP 服务;
    • 允许续传的动作;
    • 被动式数据流(passive mode)的埠口为 65400 到 65420 这21个埠口!
    • 主机不允许 Root 登入;
    • 想建立一个名为 badbird 的群组,在该群组内的所有使用者都无法离开自己的家目录(chroot);
    • 在 badbird 这个群组当中的 nogoodbird 这个使用者,该使用者能够使用 ftp 但是无法使用 ssh 连到主机;
    • 在这个公开的目录 /home/ftp/pub 中,所有人均不可写入,只有读取的权限;
     
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 底下是 FTP 主机的环境设定:
    ServerName                      "这个是鸟哥的测试用的 Proftp 主机"
    ServerType                      inetd
    DefaultServer                   on
    Port                            21
    User                            nobody
    Group                           nobody
    TimesGMT                        off  # 所谓的 GMT 时间就是格林威治时间,
                       # 详细的时区观念请参考后续的NTP服务器
                       # 因为要使用本地时间,所以设为 off !
    MaxInstances                    50   # 最多仅有 50 条 prftpd 的 PID
    MaxClients  100  "很抱歉上线人数额满了" # 最多允许 100 个使用者在在线
    MaxClientsPerHost               5    # 同一个主机最多可以同时 5 个 FTP 联机
    AllowStoreRestart               on   # 允许使用者上传续传!预设是 off 
    PassivePorts   65400  65420
    # 后面接的是埠口,最小到最大的埠口共 21 个!
     
    # 其他与实体用户较相关的设定值!
    Umask                           022
    RootLogin                       off  # 不许 root 登入!预设就是 off
    RequireValidShell               off 
    # 这个设定可以让使用者不需要具有『能够执行的 shell 』!例如让
    # nogoodbird 这个具有 /bin/false 的使用者,依然可以使用 ftp 喔!
    DefaultRoot                     ~ badbird
    # 注意啊!那个 ~ 代表家目录的意思喔!特别特别留意! DefaultRoot
    # 后面接的是『群组』喔所以在这里 badbird 为群组,而不是使用者喔!
    # 这里特别容易搞混乱,请再特别的留意一下阿!只要不属于  badbird
    # 这个群组的 User 就可以离开自己的家目录了!(没有被 chroot ) ^_^
    <Directory />
      AllowOverwrite                on
    </Directory>
    <Directory /home/ftp/pub>
      <Limit WRITE>
      Denyall
      </Limit>
    </Directory>
    # 上面的设定中,在根目录内的所有目录均具有可擦写的权力,但是在
    # /home/ftp/pub 这个目录中,不论 Linux 属性为何,用户均无法写入!
    # 但是可以浏览以及下载喔!在我们这个设定当中, badbird 这个群组无法离开
    # 自己的家目录,至于其他可以离开自己家目录的用户,来到这个
    # /home/ftp/pub 当中,也不具有写入的权限喔!
     
    [root@test root]# useradd -g badbird -m -s /bin/false nogoodbird
    # 建立这个 nogoodbird 由于不具有 shell 所以不能 SSH 但可以 ftp 喔!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    事实上,对于实体用户实在不需要限制的太多!要不然就不要开放,要不然就直接改成 sftp 说!此外,在上面这个设定当中,我们暂时拿掉了 anonymous 的登入,所以使用 anonymous 将无法登入喔!
     

    针对匿名者的设定
     
    谈完了实体用户之后,我们来谈一谈,那么 anonymous 的相关登入权限要怎么设定呢?!我们的要求假设如下:
     
    • 主机环境与实体用户的需求与上面相同;
    • anonymous 的根目录为 /var/ftp 这个目录;
    • anonymous 登入后取得的 PID 在 Linux 的权限为 ftp:ftp 这个人物;
    • 当 anonymous 登入 FTP 之后,在 Client 端的 FTP 软件显示一些欢迎讯息!;
    • 最多允许 30 个 anonymous 的登入;
    • 限制上传/下载速度为 100Kbytes/s 与 50 Kbytes/s;
    • 在 /var/ftp/ 里面,除了 /var/ftp/upload 之外,其他的目录均不可写入;
    • 在 /var/ftp/upload 这个目录中,仅可以写入,不能下载,并且在用户进入这个目录后,显示出一些相关的信息;
    • 使用者账号为 nogoodbird 因为不乖,所以将他们的 FTP 权限降级而设定为 anonymous 而已!
     
    如何设定呢?!我们沿用上面的设定项目,再额外的新增底下的项目即可!
     
    1. 建立基本的配置文件案:
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 关于主机与实体用户的设定如同前一小节所示,所以我这里就略过了!
    ...(沿用上一小节的设定,这里略过).....
     
    # 底下则是 anonymous 的设定喔!
    <Anonymous /var/ftp>
      # 底下为建立 Anonymous 在 Linux 系统下的 PID 权限拥有者!
      # 此外,使用 UserAlias 将 nogoodbird 降级为 anonymous 的账号!
      User                  ftp
      Group                 ftp
      UserAlias             anonymous ftp
      UserAlias             nogoodbird ftp
      # 建立显示的讯息给 anonymous 观察用的!
      DisplayLogin          welcome.msg
      DisplayFirstChdir     .message
      MaxClients            30  "匿名登录者联机数已经饱和了!"
      # 这个就重要啦!用来限制传输速率的吶!基本语法为:
      # TransferRate (STOR|RETR) 速度(Kbytes/s) user 用户
      # STOR 为上传而 RETR 为下载的意思!速度为 Kbytes/second 喔!
      TransferRate  STOR    100  user anonymous,ftp # 单位为 KBytes/second
      TransferRate  RETR    50   user anonymous,ftp
      <Limit WRITE>
        Denyall
      </Limit>
      # 底下这个则仅与 upload 这个目录以及其下的子目录有关而已!
      <Directory /var/ftp/upload/*>
        <Limit READ>
          Denyall
        </Limit>
        <Limit WRITE>
          Allowall
        </Limit>
      </Directory>
    </Anonymous>
     
    2. 建立欢迎画面:
    # 特别留意,因为我的 anonymous 根目录在 /var/ftp ,因此,我的
    # welcome.msg 就必须放置在 /var/ftp/welcome.msg 了!
    [root@test root]# vi /var/ftp/welcome.msg
    欢迎光临!这个是鸟哥的测试 FTP 站台喔!
    我的主机: %L
    目前时间: %T
    最大联机: %M
    目前联机: %N
    您的主机: %R
    您的账号: %U
    目前目录: %C
     
    3. 建立特殊注意事项:
    # 刚刚提到,需要在 /var/ftp/upload 里面建立一个特殊讯息!
    [root@test root]# vi /var/ftp/upload/.message
    这个目录仅能上传不能下载;
    您的身份为 anonymous 喔!
     
    4. 建立 upload 的权限:
    [root@test root]# chown ftp:ftp /var/ftp/upload
    [root@test root]# chmod 755 /var/ftp/upload
     
    5. 重新启动!
    [root@test root]# /etc/rc.d/init.d/xinetd restart
     
    呵呵!这样就将您的 Anonymous 设定好了!等你一进站,哇!怎么这么棒啊!已经将您的信息都给他设定好了,欢迎画面可真的是不错啊! ^_^
     

    建立特殊交流账号 (建立一个 ftpguest 群组!将所有的 guset 设定在这个群组内!
     
    我想,很多朋友都有使用 FTP 网站与其他网站交流的经验了!您可以给予某些站长一些上传与下载的权限,并且这些权限是可以保留或者是累积的,真的是很棒啊!在 Windows 系统上面有 Server-U 这个好用的家伙,那么我们的 Linux 上头的 FTP 可以达到这样的功能吗?!呵呵! proftpd 就可以!而且设定还真的是很简单喔!假设我们要达成这样的功能好了:
     
    • 主机环境、实体用户、anonymous 的环境都与前两节的内容相同;
    • 建立一个群组名为 ftpguest ,如果使用者属于该群组,则该用户登入主机之后他的根目录会在 /var/ftp2 这个目录下;
    • 有三个使用者,名为 ftpuser1, ftpuser2, ftpuser3 ,都属于 ftpguest 群组,他们没有家目录,不能使用 ssh,但是他们在 /var/ftp2/upload 有写入的权限,但不可读取数据;
    • 在 /var/ftp2 内的所有相关下载中,最高流量为 50 Kbytes/second;
    • ftpuser1 的上传/下载比例为 1:2 ,且具有 100 MB 的预设下载量; ftpuser2 与 ftpuser3 的上传/下载比例则为 1:1,仅具有 30MB 的预设下载量;
    • 当使用者进入 /var/ftp2 时,会显示该用户的上传/下载比例,以及剩下的下载容量,还有其他的相关讯息;
    • 与使用者有关的上传/下载比例以及剩下的可下载容量,都记录在 /var/ftp2/work/ratio.dat, /var/ftp2/work/ratio.tmp 当中,所以用户在这个目录都无法读、写!
     
    在这个案例当中,最重要的就是那个『纪录用户上传/下载的 ratio 以及可用空间的记录文件』了,在我的案例当中,使用的就是 /var/ftp2/work/ratio.dat 这个档案,请注意,这个档案必须要能被 ftpuser1, ftpuser2, ftpuser3 所读取与写入才行!相当的重要喔!所以,我应该要这样设计我的配置文件:
     
    1. 建立所需要的群组与使用者:
    #  我要建立一个群组为 ftpguest ,此外,所有相关的使用者都是这个群组!
    [root@test root]# groupadd ftpguest
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser1
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser2
    [root@test root]# useradd -M -g ftpguest -s /bin/false ftpuser3
    [root@test root]# passwd ftpuser1
    # 请依序建立 ftpuser1 ftpuser2 ftpuser3 的密码!
     
    2. 建立所需要的 FTP 相关路径:
    #  我要的路径在 /var/ftp2 当中,而且 ftpguest 必须要能够写入!
    [root@test root]# mkdir -p /var/ftp2
    [root@test root]# mkdir -p /var/ftp2/upload
    [root@test root]# mkdir -p /var/ftp2/work
    [root@test root]# chmod -R 775 /var/ftp2
    [root@test root]# touch /var/ftp2/work/ratio.dat #底下两个档案用在 ratio
    [root@test root]# touch /var/ftp2/work/ratio.tmp
    [root@test root]# chown -R ftpuser1:ftpguest /var/ftp2
    [root@test root]# chmod 666 /var/ftp2/work/*

    3. 建立基本的配置文件案:
    [root@test root]# vi /usr/local/proftpd/etc/proftpd.conf
    # 关于主机,实体用户,anonymous 的设定如同前两小节所示,所以我这里就略过了!
    ...(沿用上两小节的设定,这里略过).....
     
    # 底下则是 /var/ftp2 的设定喔!就是与 ftpguest 有关的设定喔!
    DefaultRoot             /var/ftp2 ftpguest
    DisplayLogin            welcome.msg
    # 开始设定上传/下载比例
    Ratios                  on
    SaveRatios              on
    RatioFile               /work/ratio.dat
    RatioTempFile           /work/ratio.tmp
    # 上面这两个档案需要比较注意!他的路径与 DefaultRoot 有关系!
    # 因为我们的 DefaultRoot 在 /var/ftp2 ,因此,这个档案在
    # 『根目录为 /var/ftp2 时,路径为 /work/』也就是说, /work/ratio.dat
    # 其实就是 /var/ftp2/work/ratio.dat (因为 / 是 /var/ftp2 喔)
    # 这个地方是最容易搞错的!请再次的看清楚喔! ^_^
     
    # 至于底下的设定就是要让 /var/ftp2/work 这个目录下的档案都无法被使用!
    <Directory /var/ftp2/work>
      <Limit All>
        Denyall
      </Limit>
    </Directory>
     
    # 这里就是在设定使用者的上传/下载比例啦!语法为:
    # UserRatio  "使用者账号"  fileratio filequota byteratio bytequota
    #  使用者账号:就是登入 proftpd 的账号啊!
    #  fileratio :这个是以档案为基准的『比例』,通常不限制,故为 0
    #  filequota :预设能够下载多少档案,不限制时为 0 
    #  byteratio :就是上传/下载的比例,这个数字代表『 1:下载 』之意!
    #  bytequota :预设能够下载多少 KBytes 的档案!注意单位喔!
    UserRatio               ftpuser1  0  0 2 100000 # 上/下 比例为 1:2
    UserRatio               ftpuser2  0  0 1  30000
    UserRatio               ftpuser3  0  0 1  30000
    # UserRatio             ftpuser3  0  0 -2  30000 
    # 上面这行有意思!当下载比例为负值时,表示 上/下 比例为 2:1 的意思!
    <Directory /var/ftp2>
      Umask                 002
      # 这里就是在进行『下载速度的限制』啰!
      TransferRate  RETR    50  group  ftpguest
      <Limit WRITE>
        Denyall
      </Limit>
    </Directory>

    <Directory /var/ftp2/upload/*>
      <Limit READ>
        Denyall
      </Limit>
      <Limit WRITE>
        Allowall
      </Limit>
    </Directory>
     
    4. 建立欢迎画面:
    # 特别留意,因为我的 ftpguest 群组的根目录在 /var/ftp2 ,因此,我的
    # welcome.msg 就必须放置在 /var/ftp2/welcome.msg 了!
    [root@test root]# vi /var/ftp2/welcome.msg
    欢迎光临!这个是鸟哥的测试 FTP 站台喔!
    我的主机: %L
    目前时间: %T
    最大联机: %M
    目前联机: %N
    您的主机: %R
    您的账号: %U
    目前目录: %C
     
    5. 重新启动!
    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    这样就设定妥当,并且也可以正确的启用啰!好了!那么我们就赶紧来测试看看能不能记录每个用户的上传/下载比例呢?如下所示:
     
    [root@test ftp2]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 ProFTPD 1.2.8 Server (这个是鸟哥的测试用的 Proftp 主机) [test.localhost]
    Name (localhost:root): ftpuser1
    331 Password required for ftpuser1.
    Password:  <== 这里输入 ftpuser1 的密码
    230-欢迎光临!这个是鸟哥的测试 FTP 站台喔!
     我的主机: test.localhost
     目前时间: Fri Sep  5 01:08:10 2003
     最大联机: 100
     目前联机: 1
     您的主机: localhost.localdomain
     您的账号: ftpuser1
     目前目录: /
    230-User ftpuser1 logged in.
    230 Down: 0 Files (0mb)  Up: 0 Files (0mb)   1:2B CR: 97
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bye 
     
    看到上面的粗体字了吧?那表示:
     
    • Down:下载方面,目前下载过 0 个档案,共下载 0 MBytes;
    • Up  :上传方面,目前上传过 0 个档案,共上传 0 MBytes ;
    • 1:2B:上传/下载 (为 Bytes 限制)的比例为 1:2 咯!也就是上传 1MB 可以下载 2MB 咯!
    • CR  :剩余的可以下载的 MBytes 数!注意单位为 MBytes 喔!
     
    未来您只要有上传或者是下载,那么上面那行粗体自就会随之而变喔!事实上,这些信息是记录在 proftpd.conf 里面的参数『RatioFile』指定档案当中!您可以检查一下该档案:
     
    [root@test ftp2]# vi /var/ftp2/work/ratio.dat
    ftpuser1|0|0|0|0
    # 这个档案的格式为:(注:以符号『|』隔开各个字段)
    # 账号|上传档案数|上传档案总量(KBytes)|下载文件数|下载文件总量(KBytes)
     
    该档案的格式如同上面的说明,以符号『 | 』来隔开成为五个字段,每次使用者登入 proftpd 主机之后, Proftpd 会先去开启这个档案,将数据读出来,然后再与 UserRatio 的设定直比较,就可以持续的纪录每个用户的剩余可下载容量啰!那么未来如果想要新增其他使用者在这个设定群组当中,只要进行(1)新增使用者,注意这个使用者的群组需要是 ftpguest ,并且(2)再到 proftpd.conf 里面设定好 UserRatio 的设定值,(3)最后重新启动 xinetd ,就 OK 了!其他的步骤不需要进行!设定是否方便很多呢!?^_^
     

    小结语
     
    就鸟哥的感觉来看, Proftpd 真的是挺不错用的,编译上并不难,设定上也挺简单的,此外,还能够提供类似 Windows 里面那个 Server-U 的档案上传/下载比例,真的是很不错,尤其要制作 upload 的目录真的是太简易了!加上他的安全性又比 Wu FTP 来的好,实在是一个不错的 FTP 服务器软件啊!如果您对于 Windows 的系统不太满意,又喜欢 Server-U 的设定内容,那么建议您可以转换 Linux 的 proftpd 来尝试看看,真的是挺好玩的喔! ^_^

大标题的图示Client 端的设定
Client 端并没有什么好设定的地方,主要就是 ftp 的使用了,请参考 wu FTP 主机设定一节!

大标题的图示参考资源

大标题的图示课后练习
  • 如何建立一个使用者,他可以使用 FTP 的功能,但是无法以 telnet 或 ssh 登入系统?!请使用 proftpd 的设定项目来设定!
  • 我明明在台湾,我的主机时区 (/etc/sysconfig/clock) 明明在台湾,为何登入 proftpd 之后,显示的系统时间就是慢了 8 小时?请问为什么?如何解决?
  • 如果发生了无法登入,或者是与 proftpd 的 FTP 功能相关的错误时,要如何 debug 呢?

  • 前往参考用解答
简易 FTP Server 架设 -- Pro FTP 设定

2003/09/05:第一次完成
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室