服务器架设篇 - RedHat 9

一个小而巧的 FTP 服务器软件

最近更新时间: 2003/09/05

本文数据主要针对 RedHat 9 的系统进行说明,要注意的是,RedHat 9 与 Red Hat Enterprise Linux (RHEL) 是完全不同的东西!RedHat 9 在 2003 年推出,在 2004 年就不再维护了!这部份网站更新到 2005 年,也没有再维护过! 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 RedHat 9 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
我们知道在 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://vbird.org.cn/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 呢?

  • 前往参考用解答
修改历史:
2003/09/05:第一次完成

2003/09/05 以来统计人数
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计