服务器架设篇 - RedHat 9

第二十二章、简易 FTP Server 架设 -- Wu FTP

最古老的 Wu FTP 服务器

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

本文数据主要针对 RedHat 9 的系统进行说明,要注意的是,RedHat 9 与 Red Hat Enterprise Linux (RHEL) 是完全不同的东西!RedHat 9 在 2003 年推出,在 2004 年就不再维护了!这部份网站更新到 2005 年,也没有再维护过! 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 RedHat 9 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
在 Internet 上面的传输协定当中, FTP ( File Transfer Protocol ) 算是一个最古老的协定之一了!早期还没有这么多好用的协定之前( 例如 SAMBA ),都是使用 FTP 来进行数据的传递的呢!另外,一般来说,数据的传输以 FTP 这个协定来发送是相当的快速的,而且某些场合当中其实也相当的方便。不过,值得注意的是,使用 FTP 来传输时,其实是具有一定程度的『危险性』,因为数据在 Internet 上面是完全没有受到保护的『明码』机制!所以,其实鸟哥不太建议大家使用这个服务器的啦!尤其当你建置好了 FTP 之后,如果经常进行数据的传递,对于您的网络带宽『真的有很大的损害』啊!不过,无论如何, FTP 仍然有其存在的必要!例如中山大学的 FTP 站就作的相当的棒啊!所以,底下我们就来谈一谈用在这个古老的协定上面,最古老的服务器之一: Wu FTP

原理:

    File Transfer Protocol ( FTP ) 是相当古老的网络协定之一,他最主要的功能就是进行 Server 端与 Client 端之间的文件发送的功能啦!FTP 其实是以 TCP 封包的模式进行 Server 与 Client 之间的连接,当连接创建之后,用户可以在 Client 端连上 Server 端进行文件的下载与上传,此外,还可以直接管理用户在 Server 上面的文件呢,相当的方便!而这个最古老的 FTP 服务器软件,大概要算是 Wu FTP 了,所以,底下我们将针对 Wu FTP 进行设置的说明喔!
     

    FTP 的功能简介
     
    FTP 主机除了单纯的进行文件的传输与管理之外,其实他还提供了几个主要的功能,底下我们约略的来谈一谈:
     
    1. 不同等级的用户身份:FTP 缺省的情况下可以提供三种主要的身份,分别是(1)实体帐号,real user;(2)访客, guest;(3)匿名登录者, anonymous 这三种。分成三种身份主要可以做为主机的控管上面的便利性,而且也可以将用户作一个有效的管理呢!例如实体用户可以进行的动作可能会比较多一些,至于匿名登录者,大概我们就仅提供他下载一下资源而已,并不许匿名者使用太多主机的资源啊!当然,这三种人物能够使用的『在线指令』自然也就不相同啰! ^_^

    2.  
    3. 命令记录与注册表记录:FTP 可以利用系统的 syslogd 这个 daemon 来进行数据的纪录,而记录的数据报括了用户曾经下达过的命令与用户传输数据(传输时间、文件大小等等)的纪录呢!

    4.  
    5. 限制或解除用户家目录所在(change root, 简称 chroot):为了避免用户在您的 Linux 系统当中随意逛大街,意指离开用户家目录而进入到 Linux 系统的其他目录去,所以将用户的工作范围『局限』在用户的家目录底下,嗯!实在是个不错的好主意!FTP 可以限制用户仅能在自己的家目录当中活动喔!如此一来,由于用户无法离开自己的家目录,而且登录 FTP 后,显示的『根目录』就是自己家目录的内容,这种环境称之为 change root ,简称 chroot ,改变根目录的意思啦!这有什么好处呢?当一个恶意的用户以 FTP 登录您的系统当中,如果没有 chroot 的环境下,他可以到 /etc, /usr/local, /home 等其他重要目录底下去察看文件数据,尤其是很重要的 /etc/ 底下的设置档,如 /etc/passwd 等等。这样他就有办法取得系统的某些重要信息,用来『入侵』您的系统呢!所以在 chroot 的环境下,当然就比较安全一些咯!
     

    FTP 的运作流程与使用到的 port
     
    FTP 正常情况下的连接方向:
    我们在网络基础当中得知,TCP 这种封包由于需要经过 Server 端与 Client 端两边的『三向交握』之后,才能确定连接,因此,他可以说是一个比较『可靠』的连接模式,因为双边都已经经过确认(ACK)的动作,所以,当然会较为『可靠了』!那么既然 FTP 主要的工作是让 Client 与 Server 端可以进行文件的传输,自然需要较为可靠的连接啰,不然文件数据传到一半竟然损毁时,怎么办?!因此,FTP 当然就是以 TCP 这种封包来进行连接的。在这里,我们不厌其烦的,再次说明一下 FTP 在正常模式情况(或者称为主动模式, active)下,主机与 client 端到底是如何创建连接的呢(在不考虑防火墙与其他不知名因素的情况下)?
     
    1. Client 端主动向 Server 端发送连接需求:由于是用户端想要连上 FTP 主机,所以呢,当然连接的方向首先会由 Client 发起!此时,Client 端随机选取一个大于 1024 以上的 port 来主动的连接到 FTP 主机提供的 FTP 端口口(通常为port 21),而由于是主动的连接封包,所以这个连接会带有 SYN 的标志在;

    2.  
    3. Server 端接受后,回应给 Client 端:当 Server 接收到 Client 的要求之后,会回应 Client 端的需求,此时 Server 端会创建等待连接的资源,并且将一带有 SYN 与确认 (ACK) 的封包送回 Client 端;

    4.  
    5. Client 端回应确认封包:在 Client 端接收到来自 Server 端告知的封包后,会再次的发送一个确认封包给主机,此时,两边才会正式的创建起连接的信道,这个步骤 1 ~ 3 就是 Three-Way Handshake(三向交握的啦!)。需要注意的是,这个已经创建连接的信道(通常是 port 21)仅能进行 FTP 的『指令』而已,如果该指令涉及到数据的发送(data transfer)时,例如上传或下载等等,那么就需要额外创建一条数据传输的信道才行 ( ftp-data )!而数据传输的信道创建则需要继续底下的步骤

    6.  
    7. Client 端发送数据传输要求的命令给 Server:当需要进行数据的传输时,Client 端会激活另一个高于 1024 的端口口来做为连接的准备(这个高于 1024 的端口口与步骤 1 那个端口口不是同一个!),并且 Client 端会主动的利用刚刚已经创建的指令信道(通常是 port 21)发送一个命令告诉 Server 说:『我已经准备好一个数据传输的端口口了,请准备进行传输吧』!特别留意喔,这个时候 Client 是通过『命令信道』来对 Server 下达命令的,而且已经通知 Server 我(client)要激活的端口口了喔

    8.  
    9. Server 端以 ftp-data 端口口主动连接到 Client :收到命令之后的 Server 会『主动』的以 ftp-data 端口口(一般为 port 20)向 Client 端通知的那个高于 1024 的端口口进行连接,特别需要留意的是,此时是『Server 端主动向 Client 端的连接』喔,所以该连接的 TCP 封包会带有一个 SYN 的标志在

    10.  
    11. Client 端回应主机端,并继续完成三向交握:在接到 Server 来的封包之后, Client 会回应一个带有 ACK 确认的封包,并继续来完成另一个三向交握的进程,此时,数据传输的信道才正式的创建。
     
    如此一来则成功的创建起『命令』与『数据传输』两个信道!不过,要注意的是,『数据传输信道』是在有数据传输的行为时才会创建的信道喔!并不是一开始连接到 Server 就立刻创建的信道呢!留意一下啰!
     
    使用到的 port:
    由上面的连接数据来看,其实我们会用到的主机的两个端口口分别是:
     
      (1)命令信道的 ftp (缺省为 port 21 ) 与
      (2)数据传输的 ftp-data (缺省为port 20)
     
    这两个端口口的工作是不一样的,首先,那个 port 21 主要是用在接收 Client 端下达的命令之用,例如显示目录内的文件内容 dir 以及上传下载 (put, get) 等等的指令的;至于 port 20 刚刚上头约略提过了,就是用在数据传输的时候才会创建的一个连接呢!而且,重要的是,两者的连接方向是不一样的!首先, port 21 主要接受来自 Client 端的主动连接,至于 port 20 则为主动连接至 Client 端呢!这样的情况在 Server 与 Client 两者同时为公共 IP (Public IP) 的 Internet 上面,通常没有太大的问题,不过,万一你的 Client 端是在防火墙后端,或者是 NAT 主机后端呢?会有什么问题发生呢?底下我们来谈一谈这个严重的问题!
     
    在 NAT 或者防火墙后端的 FTP Client 连接问题:
    万一你的 FTP client 是在 NAT 主机的后端,那由于我们的 NAT 主机会自动的纪录 client 端向外连接的信息,所以在 Client 依上面步骤 1 送出要求封包后,步骤 2 的 FTP 回传的封包可以通过 NAT 转交给 client ,这没有问题!所以, Client 连接到 Server 的命令信道 ( port 21 )可以正确的被创建起来的。不过,万一 Client 端在创建起了命令信道之后,对 Server 下达数据传输的命令呢?连接会是如何?我们以底下的图标来说明好了:
    1. 由于目前的 NAT 主机可以记录由内部电脑连接出去的信息,因此,借由 port 21 的连接可以顺利的被创建起来;
    2. 当 Client 端由 port 21 下达数据传输的命令时,此时『个人PC』会告诉 FTP Server 说:『我开了一个 >1024 的端口口等你来连接喔』!
    3. 这个时候要特别留意的是,『个人PC』经过NAT主机连接后,在 FTP Server 看到的『个人PC』的 IP 其实是 NAT 那部主机的!所以,这个时候 FTP Server 会主动的由 port 20 向 NAT 主机的 >1024 那个 port 要求创建连接!(请翻阅NAT主机一章)
     
    了解问题的所在了吗?原本我们的 FTP 主机要连接的其实是『个人PC』这部电脑的 >1024 那个 port ,不过,由于 NAT 的关系,所以却造成了连接是向 NAT 主机的 >1024 那个 port 进行主动连接的!如此一来,想当然尔,NAT 主机并没有启动 >1024 那个 port 等 FTP 主机来连接,所以自然无法成功的创建起连接,这个时候你就会看到『Can't build data connection: Connection refused, 无法进行数据传输』之类的消息了!啊!真是惨啊! @_@
     
    那有没有办法可以克服这个问题呢?难道真的在 NAT 主机后面就一定无法使用 FTP 吗?当然不是!目前有两个简易的方法可以克服这个问题:
     
    1. 使用 Linux NAT 主机的 iptables 缺省模块,亦即 ip_conntrack_ftp 与 ip_nat_ftp 这两个内核模块!应用 modprobe 这个指令就可以将这两个模块加载了!我们刚刚说过,既然 iptables (NAT 主机)可以记录 client 端向外连接的信息,而 client 端向 server 端要求数据传输时,会主动告知 Server 我(client) 要等你来连接的 port ,因此,这两个聪明的模块可以通过检查 NAT 主机内的信息而加以应用,那就可以让 Server 与 Client 端创建 ftp-data 的连接啦!不过,这两个模块并不是万能的,因为这两个模块目前仅能针对缺省的 ftp-data(port 20) 进行检验的工作,万一您连接的是一个使用非 port 20 为 ftp-data 传输的主机时,那这两个模块就没有办法发挥其性能了!

    2.  
    3. 另一个方法就是使用被动式连接 (passive)!什么是被动式连接呢?想一想,既然『主机主动』连接到我的 NAT 后面的 client 不能成功,那么我反其道而行,如果以 client 来连到 server 呢?是否就变成如同 port 21 相似的连接方向,如此一来不就可以成功的创建连接了吗?呵呵!没错,而且也不需要启动上面两个模块了,并且也不担心 FTP Server 是否激活非 port 20 的 ftp-data port 啦!这部份我们底下说明喔。
     

    什么是『被动, passive』的连接
     
    既然在 NAT (或防火墙) 后端的 client 无法让主机主动的来创建连接,那么我就让主机『被动的等我 client 去连接』啊!果真如此的话,那么我的连接状态变成如何了呢?
     
    1. Client 端主动向 Server 端发送连接需求

    2.  
    3. Server 端接受后,回应给 Client 端

    4.  
    5. Client 端回应确认封包:上面这三个步骤与主动式连接一样,同样的完成三向交握后,创建命令信道了!底下说明被动式数据传输信道的创建。

    6.  
    7. Client 端发送数据传输要求的命令给 Server:与主动式连接不一样的是,在被动式连接时,Client 端在下达命令之后,并告诉 FTP Server 说『我要使用 PASV 模式(就是 passive 啦!)的方式来进行数据传输』;

    8.  
    9. Server 端挑选 > 1024 的端口口等待连接:在接受 client 的 PASV 要求之后,如果没有特别的设置时 (目前的 FTP 服务器版本已经可以指定 passive port 来规定被动式连接的端口口号码 ) ,Server 会随机选取一个大于 1024 的端口口,并经由命令信道告诉 client 端说:『我已经开了一个 ftp-data 的端口口等妳连接喔!』并开始等待 client 端的连接;

    10.  
    11. Client 端主动向 Server 端创建连接并继续完成三向交握:经由命令信道得知 Server 的端口口之后, Client 端会随机挑选另一个大于 1024 的端口口,并主动向 Server 端的等待连接的端口口进行连接动作,所以此连接封包是带有 SYN 的标志的喔!然后 Server 会回应一个带有 ACK 确认的封包,并继续来完成另一个三向交握的进程,此时,数据传输的信道就正式的创建。
     
    发现上面的不同点了吗?呵呵!如此一来,在 NAT 主机内部的 Client 就可以顺利的连接上 FTP Server 了!这就是在 FTP 连接里面的所谓被动式连接啰!但是,万一 FTP 主机是在 NAT 后端那怎么办.....呵呵!那可就糗了吧~ @_@这里就牵涉到更深入的 DMZ 技巧了,我们这里暂不介绍这些深入的技巧,先理解一下这些特殊的连接方向,这将有助于您未来服务器架设时候的考虑因素喔!
     
    此外,不晓得您有无发现,呵呵!通过 PASV 模式,Server 在没有特别设置的情况下,会随机选取大于 1024 的 port 来提供 Client 端连接之用。那么万一主机激活的 port 被搞鬼怎么办?而且,如此一来也很难追踪来自入侵者攻击的登录信息啊!所以,这个时候我们可以通过 passive ports 的功能来『限定』主机取用的 port number 喔!
     

    FTP 的安全性问题与替代方案
     
    事实上,FTP 是一个不太安全的协定呢!怎么说呢?很简单啊!因为 FTP 与 Telnet 相似的,他是以『明码』的状态在 Internet 上面流窜的,所以当然就容易被有心人士将你的数据给他抓下来,并且加以利用啦!因此,他当然不是很安全啊!所以,在网络上大家才会常常告诫说,不要随意架设 FTP 网站啊!否则主机怎么被破解的都不晓得哩!此外,由于 FTP 软件常常会有漏洞的问题,因此也要常常更新套件喔!另外,其实拜 SSH 所赐,目前我们已经有较为安全的 FTP 了,那就是 ssh 提供的 sftp 这个 server 啊!这个 sftp-server 最大的优点就是:『他是经过加密的数据!』所以在 Internet 上面流窜的时候,嘿嘿!毕竟是比较安全一些啦!所以,建议您,除非必要,否则的话,使用 SSH 提供的 sftp-server 功能即可~然而这个功能对于一些习惯了图形接口,或者是有中文文件名的用户来说,实在是不怎么方便,因为目前还没有很棒的 sftp-server 的图形接口软件说~所以,有的时候,FTP 站还是有其存在的需要的。如果真的要架设 FTP 网站,那么还是得需要注意几个事项喔:
     
    1. 随时更新到最新版本的 FTP 软件,并随时注意漏洞消息;
    2. 善用 iptables 来规定可以使用 FTP 的网域;
    3. 善用 TCP_Wrappers 来规范可以登录的网域;
    4. 善用 FTP 软件的设置来限制使用您 FTP 主机的用户的不同权限啊;
    5. 使用 Super daemon 来高端管理您的 FTP 主机;
    6. 随时注意用户的家目录、以及匿名用户登录的目录的『文件权限』;
    7. 若不对外公开的话,或许也可以修改 FTP 的 port 。
     
    无论如何,在网络上听过太多人都是由于开放 FTP 这个服务器而导致整个主机被入侵的事件,所以,这里真的要给他一直不断的强调,要注意安全啊!
     

    什么时候才要设置 FTP 啊!开放谁人连进来
     
    既然(1)FTP 不怎么安全(2)FTP 的用户身份至少有三种,那么在设置 FTP 服务器之前就需要针对这些不同身份者的登录限制来做规划啰!以达成较为安全的管理啊!底下我们谈一些大致的概念性问题,这些真的是蛮概念的~看看即可!
     
    开放的用户身份与可能造成的危害
    建议事项
    实体用户(Real user)
    • 在缺省的条件下,开放 FTP 本来就提供了实体用户登录之用。
    • 不过,需要了解的是,以实体用户做为 FTP 登录者身份时,基本上,系统并没有针对实体用户来进行『限制』的,所以他可以针对整个文件系统进行任何的工作。因此,如果您的 FTP 用户没能好好的保护自己的密码,导致被入侵,那么你的整个 Linux 系统将很有可能被毁灭啊!
    • 由于实体用户本来就可以通过网络连接到主机来进行工作,因此实在没有特别的需要开放 FTP 的服务啊!例如 sftp 本来就能达到传输文件的功能啰!
    • 如果确定要让实体用户用户利用 FTP 服务器的话,那么您就需要避免让几个系统用的帐号可以登录!这个时候可以将『不想让他登录』的帐号写入 /etc/ftpusrs 这个文件当中啊!例如 root 就是个很好的例子!
    访客(Guest)
    • 通常会创建 guest 身份的案例当中,多半是由于主机提供了类似『个人 Web 首页』的功能给一般身份用户,那么这些用户总是需要管理自己的网页空间吧?这个时候将用户的身份压缩成为 guest ,并且将他的可用目录设置好,即可提供用户一个方便的使用环境了!且不需要提供他 real user 的权限喔!
    • 仅提供需要登录的帐号即可,不需要提供系统上面所有人均可登录的环境啊!
    • 当然,我们在主机的设置当中,需要针对不同的访客给他们不一样的『家目录』,而这个家目录与用户的权限设置需要相符合喔!例如要提供 test 这个人管理他的网页空间,而他的网页空间放置在 /home/test/www 底下,那我就将 test 在 FTP 提供的目录仅有 /home/test/www 而已,比较安全啦!而且也方便用户啊!
    • 针对这样的身份者,需要设置较多的限制,包括:上下传文件数目与硬盘容量的限制、连接登录的时间限制、许可使用的指令要减少很多很多,例如 chmod 就不要允许他使用等等!
    匿名者(anonymoust)
    • 提供匿名登录实在不是个好主意~因为毕竟你的系统为何要让别人登录利用呢?
    • 不过,如果是提供整个学校单位来利用的话,那就另当别论了!
    • 无论如何,提供匿名登录都是一件相当危险的事情,因为,只要您一不小心,将重要的数据放置到匿名者可以读取的目录中时,那么就很有可能会泄密!与其战战兢兢,不如就不要设置啊~
    • 果真要开放匿名登录时,很多限制都要进行的,这包括:(1)允许的工作指令要减低很多,几乎就不许匿名者使用指令啦、(2)限制文件传输的数量,尽量不要允许『上传』数据的设置、(3)限制匿名者同时登录的最大连接数量,可以控制盗连喔!
     

套件安装

事实上,使用 Wu ftp 来架设你的 FTP 服务器时,还是以 RPM 的方式来安装比较好啦!另外,如果您的 Linux distribution 提供其他版本的 FTP 服务器,呵呵!那么就不要使用 wu ftp 也没有关系啊!这是因为 wu ftp 实在是太古老了,所以很多的黑客软件都是针对他来设计的,也因为如此啊,所以才会产生『Wu FTP 服务器比较不安全』的情况啊!好了,底下我们以 Red Hat 7.x 的版本来进行说明吧。基本上,一个 FTP 服务器包含 Server 与 Client 用途的套件至少要有:
 
[root@test root]# rpm -qa | grep ftp
ncftp-3.0.3-6
ftp-0.17-12
wu-ftpd-2.6.1-20
 
其中:
  • wu-ftpd :这就是主要的 FTP 服务器套件啦!
  • ftp :提供 ftp 指令,就是 client 端的工具啦!
  • ncftp :提供匿名登录的 FTP 网站的 client 端相当棒的另一套连接 FTP 软件!
如果没有安装,请马上安装吧!如果不晓得怎么安装,那么请拿出『鸟哥的 Linux 私房菜 -- 基础学习篇』好好的将 mount CD 的指令、搜索的指令,以及 RPM 的指令瞧一瞧先!

Server 端设置:

    其实 Server 端的设置最主要的就仅有 /etc/ftpaccess 这个主要设置档啦!几乎只要他搞定了,FTP 就不会有问题说~不过,由于 FTP 的高危险性,所以其他几个跟安全较有相关的文件我们也得来瞧一瞧才行啊!因此上,我们首先就需要来了解一下 wu ftp 到底有哪些设置文件与运行档呢?
     

    Wu FTP 的结构
     
    Wu FTP 的文件结构先来了解一下,才好继续进行说明啊!底下主要粗分为设置档与运行档进行说明喔!
     
    设置档: Wu FTP 的设置档主要有底下这几个:
    • /etc/ftpaccess:这是最主要的设置档了!所有跟 Wu FTP 有关的设置内容,都可以在这个文件做修订;
    • /etc/pam.d/ftp, 与 /etc/ftpusers:这两个文件与 PAM 模块关系较大!在缺省的情况中,只要在 /etc/ftpusers 这个文件内的用户『都不能使用 FTP 的服务
    • /etc/ftphosts:用来允许或拒绝(allow/deny)某部主机或者某位用户是否能够登录 FTP 主机的设置文件,基本上,这文件里面的设置也可以直接在 /etc/ftpaccess 当中设置喔!
    • /etc/xinetd.d/wu-ftpd:这个是用来启动 FTP 的 daemon 设置文件~当然啦,主要是挂在 xinetd 这个 daemon 下的,如果是挂在 inetd 这个 daemon 时,就有可能是 /etc/inet.d 底下的文件啰!
     
    运行档:除了上面提到的这些设置档之外,还有一些运行档也需要了解一下:
    • ftpcount :主要用来计算『目前连接的人数』,可以计算出各种身份的连接人数啊!
    • ftpwho:可以显示出『目前连接的用户是那个 User ?使用那个 PID?动作多久了?』等等的信息呢!
    • ftprestart:重新启动 ftp 啊!
    • ftpshut:指定时候关闭 FTP 的一个指令喔!
    • in.ftpd:这个就是主要的 Wu FTP 的 daemon 啰!我们启动的 wu ftp 就是他的工作呢!
     
    用户端的使用运行档:这个部分的指令并不是 wu ftp 所提供的,但是粉重要,所以先提出说明喔!
    • ftp:就是最阳春的 client 端软件啰!
    • ncftp:可以使用在匿名 FTP 网站喔!相当棒的软件!可以支持整个目录的下载呢!
     
    呵呵!接下来就是那个主要的 FTP 设置档的设置部分啦!
     

    最简单的 ftpaccess 设置档
     
    事实上,与 Wu FTP 关系最大的就是 /etc/ftpaccess 这个文件啦!只要他设置好,其他的地方相对都不成问题的!而其实 Wu FTP 一开始已经帮我们设置好一个最简单的 ftpaccess 文件,我们先来谈一谈这个文件的几个主要的设置项目,然后再来继续其他的设置项目呢!
     
    [root@test root]# vi /etc/ftpaccess
    # 1. 设置人物群组名称
    #   设置这个 FTP 服务器的人物身份设置,使用 class 来设置的!他的语法是:
    #   class <人物群组名称> <用户身份1,用户身份2,..> <允许连接的来源>
     
    class   all   real,guest,anonymous  *
     
    # 上面的意思是说,我设置一个类别群组为 all ,这个 all  里面就包含了
    # 三种身份的用户,就是 FTP 缺省的 real, guest 与 anonymous 这三个,
    # 需要注意的是,这三个类别的用户之间是以逗号『,』隔开的,并没有空白字符
    # 而这个 class 允许的来源来自任何地方『*』。
    # 这个 class 可以多重设置,并且,万一重复设置时,以第一个出现的 class 类别
    # 为准!举个例子,假如我的 FTP 里面的 real 仅允许学术网络登录,至于其他
    # 的 guest 与 anonymous 则虽然可以由任何地方登录,但是不可以由 chinait.com
    # 这个网域以及 61.141.0.0/16 这个网域登录时,那我可以这样设置两个 class 喔:
    # class allone real,guest,anonymous *.edu.tw
    # class alltwo guest,anonymous  !*.chinait.com !61.141.0.0/16 *
    # 请注意到,惊叹号『!』有代表『否,不允许』的意思存在,而星号『*』则代表
    # 任何地方的意思,则如上面所设置时,如此一来,学术单位可以连到我的 FTP ,
    # 至于 guest 与 anonymous 则可以任何地方连进,当然,除了上面的两个网域之外
    # 所以说,经由这个 class 的设置,就可以轻易的将三种身份是否可以登录主机的
    # 状态搞定了! ^_^
     
    # 2. 设置系统的 FTP 管理员的 e-mail 信箱地址,与主机名称!
    #   单纯的就是显示出系统当中 FTP 服务器管理员的网址啦!缺省的设置如下:
     
    email root@localhost
    hostname vbird.adsldns.org
     
    # 一般来说,我会将这个 e-mail 后面的地址写上可以被用户发信的信箱,例如:
    # email testing@test.adsldns.org
    # 这样的格式!这个 email 可能会出现在进出网站时的欢迎画面当中!
    # 最大的任务是:当用户发现问题的时候,可以跟系统的管理员联系啊!
    # 所以当然要写下『可以收信』的正常 email 啰!
    # 至于那个 hostname 则仅与欢迎画面时的变量有关!
     
    # 3. 允许同一次连接当中,错误登录的次数
    #   为了避免被不明攻击者的『暴力攻击』法,所以在一次连接当中,
    #   仅允许对方最多有 5 次的登录机会,如果密码或 ID 一直发生错误,
    #   则会将该连接『踢』掉的啦!
     
    loginfails 5
     
    # 当然啰!如果您想将登录的次数改小一点的话,也可以使用『loginfails 3』
     
    # 4. 向用户显示『README, 读我』文件的内容消息!
    #  当用户登录或者变换目录时,若目的端目录有 README 这个文件时
    #  (可以附加文件名),则向用户显示该文件的内容!语法为:
    #  <readme> <README*> <动作>
    #  一般来说,动作有『登录』与『变换目录』,代号为 login 与 cwd=*
     
    readme  README*    login
    readme  README*    cwd=*
     
    # 举个例子来说,我是 testing 这个身份的用户,在我的家目录内有个文件:
    # /home/testing/data/README.important
    # 那么当我使用 FTP 软件连进我的家目录 (/home/testing) 然后切换目录到
    # /home/testing/data 后,我的屏幕就会出现『请读取 README.important』
    # 的字样啰!以提醒用户之用!
     
    # 5. 与 readme 的意义蛮相同的!不过这个 message 却会将后面所接的文件的
    #  内容直接显示在屏幕上面,而不仅是告知用户去读取而已~
     
    message /welcome.msg            login
    message .message                cwd=*
     
    # 上面的意思是说,当我 login 或者切换到任何有文件名为 .message 的目录时,
    # 该文件的内容就会显示到屏幕上面!一般来说,那个 /welcome.msg 就是
    # 『进站欢迎画面』啰!这个等一下我们在底下会独立出一小节来介绍他!
     
    # 6. 是否提供用户在线立即运行的指令!
    #  一般的格式为:
    #  <指令名称> <是否允许/yes/no> <针对的对象是谁>
     
    compress        yes             all
    tar             yes             all
    chmod           no              guest,anonymous
    delete          no              anonymous
    overwrite       no              anonymous
    rename          no              anonymous
    umask           no              all
     
    # 以上面的例子来说,我允许任何成功登录我主机的用户(all)使用我的
    # FTP 主机来运行压缩这个指令的动作!但是我不许匿名者(anonymous)
    # 使用我的 FTP 主机进行删除(delete)以及改名(rename)的动作!
    # 你当然还可以增加自己所想要提供,或者减少提供用户使用的指令!
    # 当然啦,既然 FTP 主要是针对『文件』,所以指令以文件的删除、移动、
    # 更改与压缩为主!
     
    # 7. 将用户运行的部分指令历程记录到 /var/log/xferlog 这个文件
    #  FTP 进行上传、下载或者其他用户动作时,可以将过程消息记录下来,
    #  记录的文件就是 /var/log/xferlog 这个文件啰!语法为:
    #  <log> <欲登录的项目> <记录的用户身份> <何种动作>
     
    log transfers anonymous,guest,real inbound,outbound
     
    # 上面说明的是『针对文件传输(transfers)进行记录,而针对所有人均纪录,
    # 分别记录上传与下载(inbound,outbound)』,请注意,身份如果有多种,要以
    # 逗号『,』隔开,不要加空白喔!所以,当你的 FTP 用户连上主机,
    # 并且有任何文件传输的动作时,则文件大小以及文件数等信息,就会被纪录
    # 到 /var/log/xferlog 里面去啦!而除了文件传输之外,还有什么可以纪录的呢?
    # 基本上,那个『欲登录的项目』内容就包含了下面几项数据:
    # a. log commands <身份> :例如『log commands real,anonymous』,表示
    #  real 与 anonymous 这两种身份的人,在 FTP 上面所下达的任何指令君会
    #  被纪录在 /var/log/xferlog 里面
    # b. log security <typelist> :例如『log security guest,anonymous
    #  表示当 guest 与 anonymous 用户『违反安全机制』时,则会将当时
    #  用户所下达的指令或者其他动作纪录下来!
     
    # 8. 关闭 FTP 的设置档!
    #  我们可以设置关闭 FTP 这个服务的时间,就利用 shutdown 后面接的文件!
     
    shutdown /etc/shutmsg
     
    # 如果 /etc/shutmsg 不存在,则 FTP 服务就不会被关闭!所以不存在没关系!
    # 而如果 /etc/shutmsg 存在的话,他的内容包含有底下这些数据(注意:
    # 第一行为时间参数,共有七个时间参数,用空白键分隔,而提示文本可以随便
    # 编写内容喔!也可以使用变量啊!):
    # <年> <月> <日> <时> <分> <抵挡新连接> <删除已连接> 
    # <提示文本>
    # 年:任何大于 1970 年的年份;月:0-11!请注意啊!是由 0-11 喔!
    # 0 代表 1 月、 1 代表 2 月!
    # 日:当然就是 1-31 啰!  ;时:由 0-23 ;分:0-59
    # 抵挡新连接与删除已连接:格式是 HHMM 例如 90 分钟则是 0130 ,在关机前的
    # 设置时内,会拒绝新连接与将以连接之信道切除喔!例如:
    # 『2003 5 30 12 0 0230 0030
    I will shutdown my FTP server !sorry!
    # 在 2003/6/30 的 12:00 要关闭 FTP ,而 12:00 之前的两小时30分内(09:30)
    # 就不许新的尝试登录的连接,而在 30 分钟前(11:30)就切掉已经已经连接之
    # 用户连接!事实上,这个 shutdown 蛮有趣的!因为实际上,您的 FTP
    # 服务并没有关掉,仅只是让他人无法使用 FTP 而已啊!那么如何重新启动呢?
    # 很简单啊!将 /etc/shutmsg 杀掉,或者里面的时间更动一下即可!
     
    # 9. 匿名者的密码验证:
    #  如果您的 FTP 允许 anonymous 的话,那么还是需要让匿名者输入密码的,
    #  不过就是密码的设置比较松散就是了!目前的密码格式为:
    #  <passwd-check> <no|trivial|rfc822> <动作>
     
    passwd-check rfc822 warn
     
    # 上面说的是,以匿名者登录的用户也需要输入密码,而密码的格式为 rfc822,
    # 如果用户的密码不合格,那么就警告(warn)用户,但仍允许用户登录!
    # 密码的格式方面目前有两种(no是不需要密码确认,所以不讨论!)
    # trivial:密码当中必须含有 @ 这个 e-mail 的字符;
    # rfc822 :密码必须符合 frc822 的规范!
    # 通常我们使用的是 rfc822 即可!至于动作主要有两种动作:
    # warn   :用户输入错误的密码时,仅显示警告消息,仍允许其登录;
    # enforce:用户若输入错误密码,储显示警告消息,并中断连接喔!
    # 注意:
    # 如果你不想让某个 email 的型态通过认证时,可以使用 deny-email 这个
    # 项目来抵挡!举个例子来说,你不想让 IE 的缺省邮件地址通过认证,可使用
    # deny-email IE?0User@
    # deny-email mozilla@
    # 上面这两个项目可以同时存在,如果还有不想让他通过的 email address 
    # 可以持续上面的设置多行!这有什么用途呢?如果您不想让 web browsers 
    # 通过密码的确认,而仅想让类似一般的 FTP client 来连接,那么这个
    # 限制项目就有用的很了!因为他可以将 IE 之类的 browsers 挡下来啊!
     
    # 10. 设置允许与不许登录 FTP 服务器的用户与群组
     
    deny-uid %-99 %65534-
    deny-gid %-99 %65534-
    allow-uid ftp
    allow-gid ftp
     
    # 这个是在 Red Hat 系统上面添加出来的设置啦!在一般正常的系统当中,
    # UID 小于 100 通常是系统帐号,而 UID 大于 65534 可能有安全上的问题,
    # 所以,我们就直接将这两段 UID 与 GID 切掉啊!让他们无法登录,也就可以
    # 拒绝某些不当的入侵攻击了!那就是 deny-uid 与 deny-gid 的功效!
    # 所以,上面的意义是,小于99与大于65534 的UID/GID都予以抵挡连接;
    # 而开放的 UID 与 GID 则仅有 ftp 这个群组与用户喔!
    # deny-uid 后面除了接数字外,也可以直接接帐号名称,例如要挡住 testing 
    # 与 testqq 这个用户时,可以设置:
    # deny-uid testing testqq 
    # 后面可以接多个 UID 或帐号或者使用范围,例如抵挡 100 到 1000 之间的 UID 
    # deny-uid 100-1000
    # 至于 allow-uid 则恰好相反啊!就是允许的意思~
     
    事实上,上面的设置并不麻烦,只有几行而已,只是我们需要了解一下每个项目之间的相关性,所以鸟哥我加注了一些说明而已~您可以参考参考的啦!这样就完成了一个最最简单的 ftpaccess 这个设置档啰!准备来去启动 FTP 啰!
     

    使用 Super daemon 管理 FTP 的情况
     
    目前一般常见的 FTP 服务器(除非是大型的 FTP 主机)大多是使用 super daemon 来进行统一管理的,而由于目前多半的 super daemon 都使用 xinetd 这个 super daemon ,所以底下我们仅针对这个 xinetd 来进行说明喔!事实上,由于 FTP 是挂在 super daemon 底下的一个服务,所以我们仅需要设置好 xinetd 里面关于 wu-ftpd 的设置档,然后『重新启动 xinetd 』就可以启动 FTP 啰!在一般的情况下,我们可以发现 /etc/xinetd.d/wu-ftpd 这个主要设置档内容为:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
            disable = yes  <==就是他,将他改为 no 即可!
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    在上面粗体的地方将 yes 改为 no 即可!因为 disable 是『取消』的意思,那 disable = no 当然就表示『不取消』的意思~这是一个相当简单的 xinetd 的设置档,如果要进行多重控制的话,例如:我的主机有两块适配器,一块对内一块对外,对内与对外的『开放时间』与『开放网域』及『相关权限』都不相同时,就可以使用其他额外的设置来控制这些参数!由于相关的说明我们已经在『鸟哥的 Linux 私房菜 -- 基础学习篇』里面的『认识服务』谈过多次,而且,在架站篇里面的 Telnet 服务器当中也提过一个简单的范例,所以这里就不再多作赘述,请自行前往查阅!
     
    好了,那么最终终于要来启动 FTP 啰!赶紧动手重新启动 xinetd ,并且使用 netstat 来察看一下 port 喔!
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart

    [root@test root]# netstat -tl 
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 *:ftp                   *:*                     LISTEN

    [root@test root]# ftp localhost 
    Connected to localhost (127.0.0.1).
    220 localhost.localdomain FTP server (Version wu-2.6.1-20) ready.
    Name (localhost:testing): testing  <==输入登录者帐号
    331 Password required for testing.
    Password:  <==输入你的密码
    230 User testing logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> exit<==离开 FTP

     
    这样就 OK 的啦!( 注:还是得注意一下你的防火墙机制与 /etc/hosts.deny 里面是否将 in.ftpd 这个服务关掉了?!会造成无法连接的原因有很多都是因为没有将防火墙的机制打开的缘故!请再回头详细看一下简易防火墙设置一文)。如果要关闭 FTP 的话,那就将上面 disable = no 改成 disable = yes 然后再重新启动 xinetd 即可!相当的简单吧! ^_^
     

    欢迎画面的创建、 Readme 文件与关闭 FTP 消息内容
     
    欢迎画面的创建:
    呵呵!创建进站欢迎画面可就快乐的很了!可以让大家知道您这位 FTP 主机管理员所下达的『公告』事项喔!我们刚刚在前头已经设置了进站欢迎画面(login)的文件是 /welcome.msg ,注意喔!是放在『根目录, root』底下,那么到底 / 是怎么定义的?是与 Linux 的文件系统相同还是有其他的规定!?是这样的:
     
    • 如果您的用户可以到达系统的根目录,那么他将取用 /welcome.msg 这个文件;
    • 如果用户只能在自己的家目录内活动时,那么此时他的『根目录』会变成他的『家目录』!因为这样他才离不开自己目前所在的目录啊!例如 test 这个用户被限制在自己的家目录内活动,那么他的进站欢迎画面则是取用 /home/test/welcome.msg 喔!
    • 至于如果是匿名者登录的话,由于匿名者一定都会被限制在匿名者登录的目录,所以您也必需要将该文件放置在他们的根目录喔!
     
    那么由于 welcome.msg 里面其实包含有相当多的可用变量,包括目前的主机、远程主机名称、FTP 管理员的 email 以及目前时间等等的变量,我们先来谈一谈有哪些变量吧:
     
    %T  本地端的主机时间(格式为 Fri Mar 21 11:28:50 2003)
    %F  用户目前所在目录之 partition 所剩空间(不一定支持所有系统)
    %C  用户目前所在的目录
    %E  系统管理员的 email ,这个就是刚刚设置 ftpaccess 内的 email 值
    %R  远程主机的 IP 或 hostname !
    %L  本地端主机的名称或 IP
    %U  用户的登录帐号名称
    %M  FTP 主机所能允许的用户最大连接数量
    %N  FTP 主机目前已经连接的用户数量
    %B  关于硬盘容量的限额
    %Q  目前的 block 数量
    %I  最大的可用 inodes 
    %i  针对 inodes 的限额
    %H  当过度使用硬盘空间时的时间限制
    %h  当使用过度文件时的时间限制
    %s  预计关闭 FTP 的时间(与 /etc/shutmsg 有关)
    %r  预计关闭 FTP 前禁止再连接的时间(与 /etc/shutmsg 有关)
    %d  预计关闭 FTP 前已连接的中断时间(与 /etc/shutmsg 有关)
     
    上面的表格是用在显示欢迎的消息的,我们可以创建一个这样的文件喔!
     
    [root@test root]# vi /welcome.msg
    Welcome to my FTP site.
    Now is the time ==> %T
    The host name is %L
    You are %U and from %R
    There are %N person in my site, now.
    If you have any problem please call me
    %E
     
    是的!内容只要上面这样即可!,马上来测试一下设置的结果
     
    [root@test root]# ftp localhost
    Connected to localhost (127.0.0.1).
    220 vbird.adsldns.org FTP server (Version wu-2.6.1-20) ready.
    Name (192.168.1.100:test): test
    331 Password required for test.
    Password:  <==输入密码
    230-Welcome to my FTP site.
    230-Now is the time ==> Fri Mar 21 12:03:49 2003
    230-The host name is vbird.adsldns.org
    230-You are vbird and from 192.168.1.100
    230-There are 1 person in my site, now.
    230-If you have any problem please call me
    230-root@localhost
    230-
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> bye
     
    欢迎画面已经进入啰! ^_^!就是这么简单即可创建一个漂漂亮亮的欢迎画面呢!甚至您也可以自行设计中文消息,以辅助中文阅读啊!此外,您也可以在不同的目录下编辑『.message』这个文件,则也可以在用户进入该目录时,可以显示出该目录当中需要注意的事项喔!这些都是可以使您的 FTP 网站更佳的人性化的工具啦!
     
    关闭 FTP 喔!
    在某些特殊的情况下,可能您会要让您的 FTP 服务关闭!例如:已经预先知道时间的停电通知、已经规划好的硬件维护时间、已经设置好的系统停机时间等等,这些时候都需要关闭 FTP 。在这种情况下,通知用户关机的时间就是一个相当好的设置啦!这个时候您就可以使用 /etc/shutmsg 这个文件啰!( 注:某些情况当中,用户可能会希望一天之中某些时候启动 FTP 而某些时刻关闭 FTP ,例如 8-16 点启动 FTP 而 16-隔天8点关闭 FTP ,这种情况下,您可以借由 xinetd 这个 super daemon 的功能来达到这个目的!而不是使用这个 shutmsg 喔!切记 )
     
    我们假设这样的情况:假设我在 2003/03/30 的 12:00 要关机,并且在关机前的 60 分钟不许新的连接登录,至于已创建的连接则在关机的 30 分钟前切断连接,那么我就可以这样编辑 /etc/shutmsg 啰!(特别注意其格式!)
     
    [root@test root]# vi /etc/shutmsg
    2003 2 30 12 00 0100 0030
    我将要关闭连接、请不要再进行连接啦!
    即将关机的时间:%s
    新连接失败的时间:%r
    已连接关闭的时间:%d

    注:上面的内容格式为两段,第一段就是时间的参数,分别是:
    年 月 日 小时 分钟 HHMM HHMM (最后两个分别是新连接与已连接的断线时间)
    第二行以后则是一些文本的叙述!可以参考 message 里面的变量!

     
    如此一来,则当 2003/03/30 的 11:00 以后,新的 FTP 要求封包将不会被连接,至于已经连接的 FTP 则在 11:30 分时,会自动的被系统踢出去喔!此外,上面这一段文本会在你登录 FTP 时显示在屏幕上面呢!可以让您很清楚的知道什么时候主机会终止 FTP 的连接啊! ^_^!特别留意:这个文件并不会自动的消除,并且,如果设置错误,您可能无法连上 FTP ,因此,在过了那个关闭 FTP 的时间点之后,以上面的例子来说,就是 2003/03/30 ,您最好将该文件删除啊!不然可能会查不出来『到底是那个环节造成我的 FTP 无法连接』的窘境喔! ^_^
      

    限制最大在线人数
     
    如果由于自己本身的硬件设备问题或者是带宽的问题,所以不想提供太多的同时连接用户数量时,可以使用『最大在线人数限制』的项目来规范呢!规范的内容很简单,同样的仅要编写 /etc/ftpaccess 即可!加入底下这一段:
     
    [root@test root]# vi /etc/ftpaccess
    # 规范的格式为:
    # <limit> <人物群组名称> <最大连接数> <时间> <被拒绝时显示的文档文件>
     
    limit all       20 Any      /etc/ftpmaxnumber
    limit guest     10 Any      /etc/ftpmaxnumber
    limit anonymous 5  Any0800-2000 /etc/ftpmaxnumber
     
    由上面的限制当中,我们知道,在 all 这个人物群组当中,最大的同时上线
    人数为 20 人,并且,这个设置是任何时刻均有效(Any),如果你是第 21 个
    连接进来我的 FTP 的人,那么您的屏幕将会出现 /etc/ftpmaxnumber 这个文件
    的内容,并且『无法连接进入我的 FTP 』!请特别留意 Any 的大小写,若
    写错时,这个设置将不会生效!
     
    [root@test root]# vi /etc/ftpmaxnumber
    这里已经太多人啦!请您等一下再进入! ^_^

    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    这样就设置完成啦!记得重新启动 xinetd 喔!我们可以针对不同身份的用户进行连接数目的限制呢!如同上面的设置,(请注意,那个 Any 大小写不要搞错了!另外, Any 后面没接数据,表示『任何时间』的意思,否则需要以 HHMM 的格式来书写时间的样式!)所有的连接最多只能有 20 个,至于 guest 则最多有 10 个,但是 anonymous 则在每天的 8:00 到 20:00 时限制只能有 5 个连接而已~这样就可以分别限制 OK 啦! ^_^
     

    限制与取消用户的家目录规范
     
    这个设置仅对 real users 有用啦!在早期的 Wu FTP 服务器中,由于没有考虑到一般用户可能会胡搞的问题,所以缺省所有 real users 登录 FTP 主机后,可以到达任何用户权限范围内的所有目录!例如我是 /home/test 这个用户,那我可以进入 /etc, /var, /tmp, ... 等等目录来下载数据,无形之中对于系统的安全性有点『危险』啰!这个时候,如果我们能够将用户『局限』在个别的家目录当中,例如 /home/test 就成为我 test 这个人的根目录 / ,由于已经被设置为根目录啦,自然也就无法去到其他的目录啰!我们可以这样做:
     
    [root@test root]# vi /etc/ftpaccess
     
    restricted-uid *
    restricted-uid 200-400 test testing

    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    上面是两个例子喔!不要搞错了!可以分别设置,不要同时设置的啦!如果是星号『*』表示『任何身份 UID』都予以限制其家目录!如果是底下的设置,则是限制 200-400 以及 test testing 这两个用户,让他们的家目录变成根目录,这也就是所谓的 chroot 啰! ^_^!同时可以设置的就是限制 GID 啰!那就是 restricted-gid 啦!
     
    那如果反过来呢?目前较新的版本(例如 Red Hat 7.3 及以后的版本)缺省情况下就是设置为 restricted-uid * 的!不过,我就是要让某几个用户可以到处浏览啊!那就使用 unrestricted-uid 以及 restricted-gid 即可!例如
     
    [root@test root]# vi /etc/ftpaccess
    unrestricted-uid test testing
     
    可以理解吗?加油喔! ^_^
     

    时间相关的设置项目
     
    或许有的时候你会发现一件事情,那就是『怎么我几分钟没有动作,我的 FTP 主机就将我踢出来咯?』就是说,当我们登录 FTP 主机后,如果隔了一段时间没有动作 ( 这个没有动作的时间我们叫做 idle ,也就是停顿的意思 ),那么 FTP 主机会主动的认为 client 端可能用户忘记注销了!因此会自动的将用户踢出系统!不止如此喔!有的时候,如果您下载一个大型的文件,例如 100 MB 的数据档好了,偏偏您是使用拨接 (理论最大下载速度 8KBytes/second ),所以应该会下载粉久粉久!但是偏偏就是 20 分钟后, FTP 主机却主动的将这个持续下载的连接关闭!这又是为什么?这是顾虑到可能有恶意者在『盗连』网站,所以才会有这样的设置!
     
    这些时间的设置是蛮重要的啦!如果您不希望才离开一下子怎么 FTP 就踢人~那么就可以修改一下这些缺省的数值啰!我们来看看底下的这些设置吧!您都可以自行修改这些设置喔!不过,请依您的需求来考量!
     
    [root@test root]# vi /etc/ftpaccess
    # 时间参数缺省都是以 秒 为单位的!

    timeout accept 120
    # FTP 这个 daemon 会等待一个 PASV 的连接多久?由于 client 端的连接可能
    # 受限于一些网络带宽或者其他的因素,导致无法立即连上时,我们的 daemon
    # 缺省就会等待 120 秒来期待 client 端的连接成功!

    timeout connect 120
    # 与 accept 有点类似,不过 accept 是在等待 client 端的要求之回应,而 
    # connect 则是在等待确认的回应!亦即三向交握内的 client 端回应 ACK 的
    # 封包啰!

    timeout data 2400
    # 当我们下载文件的时候,最多 FTP 可以让我们下载或上传一个文件多久?
    # 一般来说,由于目前大家都使用 ADSL 来传输,所以数据发送不算慢,
    # 不过,万一您的文件太大了,导致发送速度很慢,那就比较麻烦啦!
    # 通常这个设置的默认值是 1200 ,不过,建议可以大一点,例如 2400 可达 40
    # 分钟,对于传输速度较慢的用户会比较好一点!

    timeout idle 1800
    # 就是我们上面提到的,多久没有动作会被踢掉?缺省是 900 ,你可以改大一点!

    timeout maxidle 1800
    # 与 idle 类似!不过由于 Client 端可以要求延长 idle 的时间,因此,
    # 还会有所谓的 maxidle 喔!您大可将这两个咚咚都设置一样即可!

    limit-time anonymous 30
    limit-time guest    100
    # 这个项目在设置『一次连接内,多久会被强制断线?』以上面的例子来说,
    # anonymous 每次登录之后,可以取得 30 分钟的工作时间,如果超过 30 分钟,
    # 系统会主动的将他踢出去!(强制断线!)这个项目对于 real user 没有效果!

     
    这样就算是设置完毕啦!记得重新启动 xinetd 喔!这样子您就比较不用担心 idle 的问题啦! ^_^
      

    流量与上传下载的限制项目
     
    关于流量上下传的限制与总体流量的限制方面, wu ftp 也提供了许多的设置来规范! 我们分别来谈一谈几个常见的流量控制方法:
     
    整体文件数目与文件容量的限额:
    如果你要限制整组人员每次登录时,在该次登录可以上下传输的文件数量或容量的限额时,就需要使用到 file-limit 与 data-limit 了!可以这样使用的啦:
     
    [root@test root]# vi /etc/ftpaccess
    # 给予的限制情况:
    # <file-limit> <in|out|total> <数目或 bytes 数> <身份群组>
     
    file-limit out 32   alltwo
    data-limit in  10240 alltwo
     
    # 上面的设置说明是这样的, alltwo 是一个 class 群组,这个在最前头
    # 规定出来的啦!而 in 代表上传、out 代表下载, total 则代表总量!
    # 第一个范例是说, alltwo 这个群组当中的任何用户,在一次登录当中,
    # 可以下载的文件总数,这是以文件数量来计算的!至于第二个范例,则是说
    # 在 alltwo 这个群组中的任何用户,均仅可『上传 10KB 的容量』!
    # 注意喔!那个数字代表的是 Bytes 的,要换算成 KBytes 则需要除以 1024 
     
    这个东西可以限制的有趣啦!不过他仅针对整个群组来进行限额的设置!这个群组是由 class 的项目来规范出来的!而且,这个规定是针对『一次登录』来规范的,也就是说,以第一个范例来说,你这次登录可以下载 32 个文件,然后就无法下载了,没关系,脱机,再连接,又可以下载 32 个文件,这样应该可以理解吧?!这样也可以优化你的带宽喔!
     
    限制流量的方法 throughput:
    使用 throughput 可以限制用户在不同的目录底下的传输速率喔!查看一下方式:
     
    [root@test root]# vi /etc/ftpaccess
    # 给予的限制情况:
    # <throughput> <根目录> <次目录> <文件名> <bytes/s> <倍数> <地址>
     
    throughput /var/ftp   *       * 10240 - *
    throughput /home/test  /public_html  * 51200 - *
    throughput /home/test  /realdown   * oo   - *.vbird.org
     
    # 上面我设置了两个有被限制的下载目录,分别是 /var/ftp 这个目录,以及
    # /home/test/public_html 这个目录,需要注意的是, 10240 代表 10Kbytes 
    # 喔!设置错误会让用户下载到疯掉啊!此外,那个 /home/test/realdown
    # 则是『全速』开放给用户下载喔!
     
    这个指令对于想要优化自己主机网络带宽的朋友真是太有用了!我们可以限制用户(不论任何身份,均有效)在不同的目录底下,具有不一样的下载速度,如此一来,可以让主机的带宽花在该花的地方,而不至于被其他不明用户占用了太多的带宽去呢!我就蛮喜欢的说~一般来说,如果您将您所提供的文件放置在一个下载目录,而这个目录里面又分为多个次目录,那么可以使用上面第二个范例的例子,将根目录与次目录分开来书写,然后可以指定不同次目录底下的传输速度,例如第二与第三个范例的样式啊!另外,特别留意的是:
    • 如果想要开放全部的带宽 (就是全速、不限制下载的速度) 那就需要使用 oo 才行!注意喔!不是数字的零,而是英文本母小写的 o 喔!
    • 那么什么是倍数呢?倍数就是下载的速度乘上的一个倍数值,举个例子好了,如果我的下载速度是 51200 (50KBytes),而我想要开放到 1000KBytes ,那么那个倍数的地方就写上 20 就对了!但是,如果是 1.0 倍呢?这个时候可以写 1 也可以写『 - 』这个减号!
    • 最后一个是 Client 端的主机名称或地址 (IP)。
     
    上传、下载的比例 ratio 设置:
    如果想要使用上传、下载比例的用处时,那很有可能需要重新编译你的 wu-ftp 喔!因为他需要额外的参数来加入这个功能!无论如何,我们先介绍如何使用这个设置,有兴趣的朋友可以自行研究编译的问题啊!
     
    [root@test root]# vi /etc/ftpaccess
    # 给予的限制情况:
    # ud-dl-rate <数字> <用户身份群组>
     
    ul-dl-rate 2 all
     
    # 这表示 所有的人物 可以上传 1M 下载 2M 的意思!
     
    请特别留意的是,这个设置项目要『Wu FTP 有支持才行』,所谓的有支持就是他必需要被编译到运行程序当中!一般来说,缺省的 distribution 是有支持这个项目的,所以您可以发现这个设置是可以生效的!不过,要注意的是,由于最后面接的是『用户群组身份』而不是 real, guest 与 anonymous 的设置,这个与 class 的相关设置有关!因此,在设置之初,最好就已经将这三组人物分别归类于三个群组当中,会比较妥当一点啦! ^_^!也就是说,这个设置项目不能使用 real, guest 与 anonymous 等!
     
    而如果想让用户知道『他的上下传数据』,可以使用底下的变量功能喔!
     
    %xu  可上传的 bytes 数
    %xd  可下载的 bytes 数
    %xR  上传与下载的比例 (1:n)
    %xc  剩下的可用 bytes 数
    %xT  时间限制 (分钟)
    %xE  由开始登录到目前的时间预估(分钟)
    %xU  上传限制 (与 file-limit 及 data-limit 的 in  有关)
    %xD  下载限制 (与 file-limit 及 data-limit 的 out 有关)
     
    例如编辑一个文件名称为 .message 在用户常常下载的目录底下,让他一登录该目录就会显示该文件内容啊!内容有点像这样:
     
    [root@test root]# vi .message
    您可以上传/下载的比例为 1:%xR
    您此次登录至目前剩下的时间:%xT
    由登录到目前为止使用的时间:%xE
    您可以上传的最大容量(KBytes):%xU
    您可以下载的最大容量(KBytes):%xD
     
    是不是很方便呢?! ^_^
     

    创造 guest user 与 guest user 的家目录问题
     
    什么是 guest 呢?刚刚我们上面谈了这么多的信息,还是没能提到这个 guest 是什么咚咚?事实上,在 Wu FTP 当中,这个 guest 也必须要存在 /etc/passwd 当中的!他的密码也是经由比对 /etc/shadow 来达成的!那不就是『Real Users』吗?怎么会是访客?是这样的,由于担心某些用户会使用其他的系统资源,因此,仅让这个 User 可以使用被限制住很多权限的帐号,也就是说,我们将他的权限『压缩』成为访客而已,而不是让他以 real user 的身份登录我们的系统啦!
     
    那么什么时候会用到 guest 呢?举个例子来说,如果我的主机是 WWW 服务器,而且我有开放给外部电脑 (例如我的好朋友啊等等的) 来使用时,那么我的朋友自然需要将网页数据发送上来对吧!然而我又不希望他会使用我主机里面其他的功能,此时,我就可以将他的帐号里面关于 shell 的部分设置成为怪怪的 shell !例如 /sbin/nologin!这样他就无法登录主机,但是还是可以进行 FTP 的连接的啦!
     
    假如我有一个用户帐号为 test ,虽然他的家目录是 /home/test ,但是我仅想要让他可以在 /home/test/public_html 这个目录下活动,而且还可以在他进入主机给予一些消息,此外,我也不许他可以登录系统,那该怎么作呢?
     
    1. 修改一下该帐号的 shell 部分字段,举个例子来说,假如我的帐号是 test ,那么在 /etc/passwd 里面应该就会变成:
    2. [root@test root]# vi /etc/passwd
      .... 略 ....
      test:x:511:100:testacount:/home/test:/sbin/nologin
      .... 略 ....
      修改一下该用户,让他的 shell 成为 /sbin/nologin 吧!
       
    3. 再来将上面使用的怪怪 shell 加入到 /etc/shells 当中:
    4. [root@test root]# vi /etc/shells
      /bin/sh
      /bin/bash
      /bin/tcsh
      /bin/csh
      /bin/zsh
      /sbin/nologin
      最底下一行是我们加入的喔!为了让 FTP 能被使用的啦!
       
    5. 修改一下 ftpaccess 里面相关的设置啰:
    6. [root@test root]# vi /etc/ftpaccess
      # 几乎就是添加两行即可: guestuser 与 guest-root 
       
      guestuser test
      guest-root /home/test/public_html test
       
      # 第一行说的是要将 test 这个用户变成 guest 啦!
      # 第二行则是说, test 这个用户的家目录是在 /home/test/public_html 
       
    7. 重新启动 xinetd 即可!
     
    作一个简易的 guest user 真的不难喔!此外,这个用户的 FTP 家目录就是 /home/test/public_html ,并且,无法离开这个目录到其他的 Linux 下的目录喔!比较安全的啦!^_^!与此同时,需要来强调的是,既然 guestuser 比较安全,那么可以将我整个系统里面的 User 都变成是 guest user ,而仅有一两个帐号是 real user 吗?当然可以啰!假设我的 test1, test2 这两个是实体用户,其他的都将成为访客,那我就给他:
     
    [root@test root]# vi /etc/ftpaccess
     
    guestuser *
    realuser  test1 test2
     
    # test1 与 test2 中间用空格隔开!这样就成功啦!
     
    很简单不是吗?!
     

    anonymous 的根目录与创建可上传目录
     
    了解了 guest 的家目录设置之后,那么我们再来谈到更为麻烦的,就是那个 anonymous 啦!我们晓得在 Red Hat 7.2 当中缺省的 anonymous 家目录是在 /var/ftp 当中,那么是否可以使用其他的目录来取代这个目录呢?确实是可以的,假设我们以 /home/ftp/public 做为 FTP 缺省的 anonymous 家目录时,我可以加入一行设置使得这个家目录生效:
     
    [root@test root]# vi /etc/ftpaccess
     
    anonymous-root /home/ftp/public
     
    不论您是否多么不愿意相信,这一行就可以让您的 anonymous 家目录的所在生效啰!不过,在缺省的状态中, anonymous 是『不许上传数据』的!怎么办?没关系,我们可以设置 upload 这个参数来允许用户上传数据到主机端呢!假设我的 anonymous 可以发送数据(文件与目录)到 /home/ftp/public/upload ,而且发送到主机的文件所属人为 ftp 所属群组则是 sys ,不过,却仅能发送文件到 /home/ftp/public/upfiles 但是不可以在这个目录当中创建其他目录!此时可以这么做:
     
    [root@test root]# vi /etc/ftpaccess
    # 格式很简单,就是:
    # upload <家目录> <次目录> <yes|no> <文件所属人> <群组> <权限> <目录>
     
    anonymous-root /home/ftp/public
    upload /home/ftp/public /upload  yes ftp sys 0666
    upload /home/ftp/public /upfiles yes ftp sys 0666 nodirs

    # 第二行显示的是,我的 /home/ftp/public/upload 可以允许匿名者上传数据,
    # 并且上传到主机的文件所属人与群组为 ftp/sys ,此外,文件的权限为 0666 
    # 至于 /home/ftp/public/upfiles 这个目录当中则仅能上传文件,不能创建目录

     
    由于登录者为匿名者 ( anonymous ) ,所以缺省是『没有身份』的,这个时候我们就必须要让上传的文件具有『身份』才行,所以才会要指定目录之外,还需要指定文件的身份啊!此外,要『真正可以让 anonymous 上传数据』还需要 Linux 文件权限的配合,举个例子来说,在 Linux 当中,我们就必须要让 /home/ftp/public/upload 这个目录可以让 ftp 用户与 sys 群组来进行写入的工作才行!
     

    针对人物(real, guest, anonymous)的限制设置项目
     
    除了缺省的一些设置值之外,我们还可以针对各个不同身份的用户进行『文件权限』的控制喔!那就是跟文件权限有关的以及进程运行顺序有关的 umask 以及 nice 值啦!在设置之前,请先了解一下什么是 umask 与 nice 喔!请再次的拿出『基础学习篇』读一下里面的内容吧!底下我们就实际来介绍一下啰!
     
    [root@test root]# vi /etc/ftpaccess
    # nice   <数值> <用户群组或身份>
    # defumask <数值> <用户群组或身份>
     
    nice 10 anonymous
    nice -5 real
    defumask 022 real
    defumask 002 anonymous
     
    # 请务必搞懂什么是 nice 与 umask 喔!上面的 defumask 就是 default umask 
    # 的意思!不难理解吧?!
     
    需要注意的是, nice 值只有 root 可以设置为负值,而且 nice 值越小表示这个运行进程『越快』被运行!而 umask 则是缺省取消的权限,相关的说明请务必了解!(这是很重要的观念!)
     

    拒绝某些用户与开放某些用户的登录
     
    拒绝不良的 IP 或网域或 domain :
    如果您发现恶意的用户来自于某些 IP 或者是主机名称时,而想将他抵挡住的时候,当然最好的方法还是以 iptables 将他整个踢出系统之外。但是,如果您发现的情况是,某些用户暂时的使用方式让您的 FTP 产生了困扰,例如大量下载某些文件,或者是不当的使用 FTP 所提供的资源时,所以想暂时让他无法使用 FTP 。您想让他了解一下『为何会被取消使用 FTP 的权力』的情况下,可以使用下列的参数来进行这样的设置信息:
     
    [root@test root]# vi /etc/ftpaccess
    # 准备抵挡啰!就以 <deny> <地址或主机名称> <回复给用户消息的文档>
     
    deny 192.168.0.100  /etc/ftpdeny.msg
    deny *.adsldns.org  /etc/ftpdeny.msg
     
    # 上面的设置当中,当 192.168.0.100 这个 IP 来的 FTP 要求封包时,
    # 不仅不提供其 FTP 的连接,并且会显示 /etc/ftpdeny.msg 这个文件的内容!
    # 同样的,只要来自 .adsldns.org 的网域的电脑也都会被抵挡啊!

    [root@test root]# vi /etc/ftpdeny.msg
    您无法直接登录这部主机,请与您的 FTP 管理员联系!
    管理员 E-Mail 地址为: %E

     
    如此一来,则当 192.168.0.100 这个来源 IP 的任何用户来连接 FTP 时,在他们的 FTP 软件上面,就会显示出问题的所在啦!至于联系人则是以 %E 这个 email 变量做为联系的!
     
    拒绝某些危险的帐号:
    在我们的 Linux 系统上面,由于主机套件上面的需求,所以都会缺省有一些基本的帐号存在的!例如常见的 adm, bin, sys, 以及 mail 上面常见的 mail !同时,也有一些常见的群组存在的!要注意的是,这些帐号通常仅有系统工作的时候才会用到,其他一般身份用户不太会使用这些帐号的啦!此外,由于系统帐号常常会局限在 UID 1~499 以内,而大于 65000 以上的帐号应该不常见的!所以,我们可以拒绝使用这些 UID 与 GID 来登录 FTP 主机的!这就需要用到 deny-uid 与 deny-gid 的设置项目啦!此外,事实上,如果您也发现某些可疑的帐号时,也可以先以这个设置项目将他拒绝在您的系统之外喔!使用的方法如下:
     
    [root@test root]# vi /etc/ftpaccess
    # 就直接使用最初的设置 deny-uid <帐号、UID或范围>
     
    deny-uid %-499 %65000-
    deny-gid %-499 %65000-
    allow-uid ftp
    allow-gid ftp
     
    这样的方式也可以用来抵挡一些不合法的 UID 啊!
     
    使用额外文件来抵挡:/etc/ftphosts
    我们也可以使用 /etc/ftphosts 来进行用户仅可以用来连接的主机喔!这个文件的设置方法有点像底下这样:
     
    [root@test root]# vi /etc/ftphosts
    # 格式为 <deny> <用户帐号> <不许连接的IP或主机名称>
    # 格式为<allow> <用户帐号> <不许连接的IP或主机名称>
     
    deny test   192.168.0.0/24
    allow testing 192.168.1.0:255.255.255.0
    # 注意上面这两种书写方式的不同的!

    deny test2    192.168.5.10 allow test2 *

     
    上面说明的是,我不许 test 由 192.168.0.0/24 这个网域来!但是允许 testing 这个用户来自 192.168.1.0/24 !请注意这两种方式!当以 bit 书写时,就直接加上 / ,至于如果是以 netmask 来书写时,则是加上冒号『:』。需要特别注意的是,如果同时存在两条同一个人的设置,例如:
      deny  test *
      allow test *
    这样的情况下『最后出现的那一条规则为缺省的规则!』所以结果就是 test 可以由任何地方进来 FTP 主机喔!这里还请特别留意啊!此外,进行完上面的设置后,请记得重新启动 xinetd 啊!
     
    使用 PAM 模块的机制来抵挡:
    上面的几个案例都是在 FTP 的设置档里面规定的,也就是说,上面的设置都是您的 Client 端已经进入在 FTP 里面之后再来进行抵挡的动作的!那么有没有还不需要动到 FTP 就抵挡的机制呢?除了我们后面才会提到的 iptables 以及 TCP_Wrappers 之外,我们还有个 PAM 密码验证模块可以利用呢!首先来看一下 PAM 模块里面关于 FTP 的基本内容:
     
    [root@test 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_stack.so service=system-auth
    auth       required     /lib/security/pam_shells.so
    account    required     /lib/security/pam_stack.so service=system-auth
    session    required     /lib/security/pam_stack.so service=system-auth
     
    仔细的看一下上面的文件喔!粗体的部分那一行里面的 sense 是 deny 喔!这表示写到 /etc/ftpusers 里面的用户名代表『无法登录 FTP 系统的用户』!哈哈!所以说,只要是这个文件里面的任何用户就无法通过密码验证 (由 PAM 模块管理的 ) 这一关,自然也就无法使用 FTP 了!因此,当您不想让某个 User 进入你的 FTP 用户,只要将他的名字写入这个 /etc/ftpusers 当中,那该用户就无法使用 FTP 了!但是不会影响到其他的 daemons 的服务喔!还不错吧! ^_^
     
    让 root 可以使用 FTP 功能:
    除了上面提到的之外, /etc/ftpusers 里面的内容大部分的帐号都是来自于系统帐号,这包括每个 Linux 都会存在的 root 这个帐号!所以 root 自然也就无法登录系统的 FTP 服务了。如果我真的想要让 root 可以使用 FTP 的功能,我需要怎么作呢?
    1. 首先,请先将 /etc/ftpusers 里面的 root 拿掉;
    2. 确认 /etc/ftphosts 没有挡掉欲登录的主机的 IP 或者是 hostname;
    3. 确认 /etc/ftpaccess 里头关于 deny-uid 与 deny-gid 没有 0 这个数字存在!
    4. 重新启动 /etc/rc.d/init.d/xinetd 这个 daemon !
    这样大概就可以让 root 登录啦!不过『强烈建议不要这么做!』
     

    目录与链接档的问题
     
    除了使用链接档之外,我们可以直接让用户以『 cd {某目录名称} 』进入到该目录下!而且是不论在任何目录下均可进行这个动作喔!这样一来有个好处啦,就是如果很多 real user 的文件当是集中在某个目录底下的,那么直接使用这个功能就不需要到每个用户的家目录里面创建链接档啰!
     
    [root@test root]# vi /etc/ftpaccess
    # alias <你想要给这个目录起的名字> <实际 Linux 系统的目录>
     
    alias  anonymousdir  /var/ftp
     
    如同上面的设置,当用户在任何地方只要下达『 cd anonymousdir 』就可以进入到 /var/ftp 这个目录当中啦!请注意,这个 alias 『仅针对 cd 这个指令有用』!您可以将这个 anonymousdir 目录定义写在 /welcome.msg 当中,让用户可以知道有什么功能呢!还不错吧!但是有个问题必须要了解的,那就是我们知道了 restricted-uid 可以限制住某个用户让他仅能在『家目录』当中活动,而无法移动到其他目录去!现在想像一个案例,如果我的 test 这个用户被限制在家目录 /home/test 里面,那么如果我在 /home/test 里面创建一个链接档,链接到 /home/ftp 这个目录,那么是否 test 就可以利用这个链接档移动到 /home/ftp 去呢?还有,这个 alias 所创建的目录是否可以让用户离开自己的家目录呢?『很抱歉』答案是否定的!也就是说,不论是创建链接档或者使用 alias ,您都无法离开被限制住的目录喔!
     
    此外,为了避免 anonymous 这些匿名者上传的时候发送一些奇怪的文件名,例如发送 windows 里面的文件名称,那就有可能包含了很多怪异的特殊字符,这些特殊字符可能会造成我们 Linux 系统的一些困扰。为了避免这些问题,我们可以『指定』anonymous 不能上传某些怪异的文件名称的文件,使用下面的过滤机制:
     
    [root@test root]# vi /etc/ftpaccess
    # path-filter <群组> <消息文件> <允许字符> <不许字符1> <不许字符2> ...
     
    paht-filter anonymous /etc/pathmsg ^[-A-Za-Z0-9._]*$ ^\. ^-
     
    [root@test root]# vi /etc/pathmsg
    请注意,您的文件名称不符合本站的限制,请检查:
    1. 文件名起始字符需为英文或数字或底线;
    2. 文件名起始字符不可为 . 或者减号 - 
     
    在上面的设置当中,我们可以发现,在 /etc/pathmsg 后面除了第一个是『允许』的字符外,其他后续接的都是『不允许的字符!』至于这些字符的规格则与正规表示法『Regular Expression』有关喔!上面的意思是说,文件名开头(^符号表示开头)只能是英数字,而不能是小数点与减号!这里请特别注意正规表示法喔!他是很重要的!请再次的劳驾到『基础学习篇』察看正规表示法吧!而万一用户上传的文件文件名是『错误的,主机不允许的』情况时,则会将 /etc/pathmsg 这个文件里面的消息告知用户!当然,这个文件名是可以变动的!
     

    创建 passive port 提供 client 端登录
     
    创建 passive port 给 client 端使用是有其必要性的!这个我们在前言的部分已经提过了!但是,又由于可能会导致『难以追踪入侵者』的问题,让这个 passive 变的棘手~此时, passive ports 这个可以指定 port number 的设置就可以让我们定义出少量的 port 来做为 passive 之用啰!那该怎么作呢?更加的简单!只要几个设置就可以搞定啦!
     
    [root@test root]# vi /etc/ftpaccess
    # passive ports <CIDR 地址> <最小 port> <最大 port>
    # pasv-allow   <人员身份> <地址>
     
    passive ports 0.0.0.0/0 65501 65505
    pasv-allow all *
     
    # 这代表来自任何地方的 IP 在要求 passive 连接模式时,将以 65501 ~ 65505 
    # 之间的 port 来做为他们 PASV 连接的要求啦!如此一来,则 passive ports
    # 将仅会随机选取 65501 ~ 65505 之间的 5 个 port 来做为 PASV 之用,
    # 其他的 port 将不会使用到 FTP 的 passive 模式!如此一来还可以建置
    # 防火墙上面的 port mapping 呢!很不错吧! ^_^
     
    就这样一个设置就可以让您的 passive 模式的连接当中,限制他的相关的 ports 啰!此外,如果您的 FTP 是在 NAT 内部的话,那么就可以就由 firewall 的 port mapping 的动作来进行 PASV 的转 port 作用来达成内部 FTP 主机的被动连接喔! ^_^
     

    修改 FTP 缺省的 port 21 的连接
     
    在约略了解了大部分常用的 Wu FTP 功能之后,咦!如果我不想使用 21 这个 port 做为我 FTP 缺省的指令信道,那么是否有办法修改这个 port 号码呢?举个例子来说,我希望我的 FTP port 为 3366,有的!就是利用两个文件,分别是:
     
    • Xinetd 这个 Super daemon 的设置档:/etc/xinetd.d/wu-ftpd
    • Port 对应 daemon 名称的文件:/etc/services
     
    修改的方法很简单!我们先来看一下 wu-ftpd 这个文件的内容之后,再来进行进一步的说明:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service ftp
    {
            disable = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    事实上,重要的地方就是那个 service ftp 的地方!这个 ftp 的 port 就是写在 /etc/services 当中的啦!所以说,如果我将 /etc/services 里面的 ftp port 修改一下,那就可以改 port number 啦!不过,这还不是个好主意~我还可以通过自行给予的 daemon name 来进行设置喔!举个例子来说,如果我要创建一个名为 vbftp 的 daemon 名称,那我可以这样做:
     
    1. 修改 wu-ftpd 这个里面关于 daemon 的名称:
     
    [root@test root]# vi /etc/xinetd.d/wu-ftpd
    service vbftp <==修改这里就对啦!
    {
            disable = no
            socket_type             = stream
            wait                    = no
            user                    = root
            server                  = /usr/sbin/in.ftpd
            server_args             = -l -a
            log_on_success          += DURATION USERID
            log_on_failure          += USERID
            nice                    = 10
    }
     
    2. 修改 /etc/services 的 daemon 相关设置内容
    [root@test root]# vi /etc/services
     
    vbftp    3366/tcp
     
    # 上面这一行可以加在这个 /etc/services 里面的最后一行!自己设置的啦!

    3. 重新启动 xinetd
     
    [root@test root]# /etc/rc.d/init.d/xinetd restart

     
    这样就可以修改您的缺省 FTP port 啰!加油是看看!
     

    一个多样化的实例
     
    好了,大致上 Wu FTP 的设置您应该可以理解了吧!那么现在出个例题给大家思考一下,假如我需要达成底下的规范,那么应该如何设置 Wu FTP 相关的文件呢?
     
    1. 将群组设置成为 real, guest, anonymous 这三个群组分别控制!(用 class 来区分喔!);
    2. 用户身份有 real, guest, anonymous,其中, real 仅允许来自 140.116.0.0/16 这个 B class 的网域,其他两者虽可来自于所有网域,但不允许来自 61.141.0.0/16 这个 B Class 的网域;
    3. 允许使用 passive ports ,port number 设置为 65501 - 65510 这 10 个 ports ;
    4. 系统里面小于 499 以及大于 65000 的 UID 与 GID 都被拒绝登录;
    5. 任何时刻,最大在线人数限制为 30 人,其中, guest 最多 10 人,而 anonymous 最多为 5 人;
    6. 实体用户 mysiteuser 被限制他仅能在他的家目录当中工作,无法离开其家目录,至于其他实体用户则不在此限;
    7. 我有两个 WWW 的个人用户 wwwuser1 与 wwwuser2 ,我将这两个用户订为 guest 身份,为使他的网页数据传输方便,将他的 FTP 主机的家目录设置为他的 WWW 家目录,亦即为 /home/wwwuser1/public_html ,并且设置传输速度最大为 100 Kbytes/second。注意,我的 ftp 用户缺省的群组为自行创建的 myftpusers;
    8. 我有一个 FTP 交换链接用户 ftpuser,我与他交换链接,连上下传都需要注意!上下传比例为 1.0 ,并且限制他传输的速度为 64 Kbytes/second ;
    9. 其他的匿名登录者的家目录设置为 /var/ftp 这个目录当中,并且限制 anonymous 一次连接最久 10 分钟,而且最多仅能下载 20 个文档,以及 10MB 的数据量,此外,传输速度最快仅能到达 32 Kbytes/second。至于上传的设置方面,仅允许上传到 /var/ftp/upload 这个文件,此外,缺省文件拥有者为 ftp 群组是 sys,上传速度最快为 16 Kbytes/second;
     
    似乎很麻烦,那我们就来一个一个的设置吧!
     
    1. 先设置用户的帐号:

    2. 上面的案例中,我们共有 wwwuser1, wwwuser2, ftpuser 与 mysiteuser 这四个人,由于 mysiteuser 为实体用户,所以不要去改他的登录 shell ,至于 wwwuser1, wwwuser2 与 ftpuser 由于他的群组需创建成为 myftpusers ,所以需要设置一下啦!假设 myftpusers 尚未创建,所以得先创建群组才能创建用户!并且这两个用户单纯的想要使用 FTP 而已,所以直接加上 shell 为 /sbin/nologin:
      [root@test root]# groupadd myftpusers
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser1
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin wwwuser2
      [root@test root]# useradd -m -g myftpusers -s /sbin/nologin ftpuser
      [root@test root]# passwd wwwuser1  <==不要忘记给三个人密码!
       
    3. 开始设置我们的 /etc/ftpaccess 内容:

    4. 设置的项目我们将他分为(1)主机设置(2)实体用户设置(3)访客(4)匿名者等部分来设置啰:
      [root@test root]# vi /etc/ftpaccess
      # 底下的数据为 VBird 的 FTP 主机设置范例
      #
      ########################################################################
      # 1.  针对 Server 的设置项目:
      ########################################################################
      # 1.1 针对群组的设置项目
      class           all             real,guest,anonymous    140.116.0.0/16
      class           allreal         real                    140.116.0.0/16
      class           allguest        guest                   !61.141.0.0/16  *
      class           allanonymous    anonymous               !61.141.0.0/16  *

      # 1.2 其他主机相关的设置项目
      email           vbird@tsai.adsldns.org
      hostname        tsai.adsldns.org
      shutdown        /etc/shutmsg
      loginfails      3
      log             transfers       anonymous,guest,real    inbound,outbound
      passwd-check    rfc822          warn

      # 1.3 消息管理
      readme          README*         login
      readme          README*         cwd=*
      message         /welcome.msg    login
      message         .message        cwd=*

      # 1.4 指令管理
      compress        yes             all
      tar             yes             all
      chmod           no              guest,anonymous
      delete          no              anonymous
      overwrite       no              anonymous
      rename          no              anonymous

      # 1.5 人物登录管理
      deny-uid        %-499           %65000-
      deny-gid        %-499           %65000-
      allow-gid       myftpusers

      # 1.6 时间相关的设置值
      timeout data    2400
      timeout idle    1800
      timeout maxidle 1800

      # 1.7 主机最大连接人数设置
      limit   all             30      Any     /etc/ftpmaxnumber

      # 1.8 被动的 port 设置
      passive ports   0.0.0.0/0       65501   65510
       

      ########################################################################
      # 2.  针对实体用户的设置
      ########################################################################
      restricted-uid  mysiteuser
       

      ########################################################################
      # 3.  针对 guest 用户的设置
      ########################################################################
      limit           allguest        10      Any     /etc/ftpmaxnumber
      guestuser       wwwuser1        wwwuser2        ftpuser

      # 3.1 www users
      guest-root      /home/wwwuser1/public_html      wwwuser1
      guest-root      /home/wwwuser2/public_html      wwwuser2
      throughput      /home/wwwuser1/public_html      *   *   102400  -       *
      throughput      /home/wwwuser2/public_html      *   *   102400  -       *

      # 3.2 FTP users
      guest-root      /home/ftpuser                   ftpuser
      ul-dl-rate      1       allguest
      throughput      /home/ftpuser   *       *       64000   -       *
       

      ########################################################################
      # 4.  针对 anonymous 用户的设置
      ########################################################################
      limit           allanonymous    5       Any     /etc/ftpmaxnumber
      anonymous-root  /var/ftp
      limit-time      anonymous       10
      file-limit      out             20              allanonymous
      data-limit      out             10000000        allanonymous
      throughput      /var/ftp        *       *       32000   -       *
      throughput      /var/ftp        /upload *       16000   -       *
      upload          /var/ftp/upload yes ftp sys 0666 

       
    5. 创建可上传目录与用户家目录:

    6. 由于我们设置了 /var/ftp/upload 为可上传的目录,所以需要动手设置一下啰:
      [root@test root]# mkdir /var/ftp/upload
      [root@test root]# chown ftp:sys /var/ftp/upload
      [root@test root]# mkdir /home/wwwuser1/public_html
      [root@test root]# mkdir /home/wwwuser2/public_html
      [root@tset root]# chown wwwuser1:myftpusers /home/wwwuser1/public_html
      [root@tset root]# chown wwwuser2:myftpusers /home/wwwuser2/public_html
       
    7. 修订一下 /etc/shells:

    8. 必须要确认 /sbin/nologin 在这个文件内
      [root@test root]# vi /etc/shells
      /bin/bash
      ....(略)...
      /sbin/nologin
       
    9. 修改一下欢迎画面文件:

    10. 你可以创建一下欢迎画面喔!文件有这些:
        /welcome.msg
        /home/wwwuser1/public_html/.message
        /home/wwwuser2/public_html/.message
        /var/ftp/welcome.msg
      如果想要一劳永逸,那么将 /welcome.msg 这个文件拷贝到 /etc/skel/welcome.msg 以及 /etc/skel/public_html/.message 则是一个不错的主意!
       
    11. 重新启动 xinetd 啰!
     
    大致的流程就是这样啦! ^_^

Client 端的使用 FTP 软件

事实上,我们在网络常用指令那个章节当中已经介绍过了 ftp 与 ncftp 这两个很好用的 client 端软件了,在这里我们再次的强调一下这两个软件,其中,比较重要的是强调传输的模式。在 Server 与 Client 传输的过程中,数据的流动主要分为 binary 与 ascii 两种模式,需要注意的是:
  • Binary 的发送方式当中,FTP Server 并不会去改变文件的内容,所以数据得以完整的呈现;
  • 但在 ASCII 传输模式当中,主要将数据视为一般的纯文本档,例如:原代码或者是设置档等等,在这种传输模式当中,Server 会将文件以一行一行来发送,所以如果您以 ASCII 发送经过编译过的 binary program 时,将可能导致无法运行的问题(因为被转成文本档啦!)
底下我们就来介绍两个软件吧!
 

  • ftp

  • 远程发送数据当中,速度最快的协定之一
    语法
    [root @test /root]# ftp [-p] host [port]
    参数说明:
    -p :启动 PASSIVE 模式!
    范例:
    [root @test /root]# ftp localhost     <==缺省是以 port 21 来进行连接
    [root @test /root]# ftp localhost 1354   
    如果你设置的 ftp 的 port 非正规的 21 ,则可以这样!

    [root @test /root]# ftp localhost  <==连接到远程主机
    Connected to localhost (127.0.0.1).
    220 localhost FTP server (Version wu-2.6.1-20) ready.
    Name (127.0.0.1:test): test
    331 Password required for test.
    Password: <==输入密码
    230 User test logged in.
    Remote system type is UNIX.
    Using binary mode to transfer files.
    ftp> dir          <==显示远方主机的内容
    ftp> cd           <==变换远程主机的目录
    ftp> close or bye or exit <==离开远程主机
    ftp> get file       <==取得远程主机的文件
    ftp> mget file       <==取得所有的文件,例如 mget .bash* !
    ftp> put file       <==将本地端文件 file 丢到远程主机上
    ftp> mput file       <==与 mget 差不多意思啦!
    ftp> delete file      <==杀掉远程主机的 file 文件
    ftp> help         <==显示求救指令!
    ftp> mkdir dir       <==在远程主机上面创建目录
    ftp> lcd          <==变换本地端路径!
    ftp> ascii or binary    <==重要的很!上面提过的!

     

  • ncftp

  • 登录匿名主机最好用的文本接口 FTP 软件!
    语法
    [root @test /root]# ncftp [host]
    [root @test /root]# ncftp [ftp://domain.name/path]
    参数说明:
    可以直接连接到 host 主机,也可以直接连接到主机的某个路径之下,相当的方便
    范例:
    [root @test /root]# ncftp ftp.nsysu.edu.tw   <==连接到中山大学 FTP 站
    [root @test /root]# ncftp ftp://ftp.nsysu.edu.tw/Linux
    直接连接到 Linux 底下的 Linux 目录下!

    远程主机的一些服务指令:
    ncftp /pub/Linux > cd Redhat      <==变换目录
    ncftp /pub/Linux > dir         <==显示目前目录下的文件与目录信息
    ncftp /pub/Linux > get file1       <==将 file1 的数据存到本地端
    ncftp /pub/Linux > get -z file1 file2  <==将 file1 存到本地改文件名为 fill2
    ncftp /pub/Linux > get -A file1 file2  
    将 file1 以累积的方式(append)增加到 file2 这个文件
    ncftp /pub/Linux > pub file       <==将文件由本地端上传至远程!
    ncftp /pub/Linux > rename file1 file2  <==将远程的主机之 file1 更名为 file2
    ncftp /pub/Linux > rm file       <==删除文件
    ncftp /pub/Linux > rmdir directory   <==删除目录
    ncftp /pub/Linux > mget directory  <==可以下载『整个目录』的数据!很棒吧!

    本地端主机的一些指令功能:
    ncftp /pub/Linux > lcd      <==变更本地端目前所在的目录
    ncftp /pub/Linux > lls      <==显示目前本地端所在目录的文件与目录信息
    ncftp /pub/Linux > lmkdir    <==在本地端创建目录
    ncftp /pub/Linux > lpwd     <==显示目前本地端主机的所在目录
    ncftp /pub/Linux > lrm     <==删除本地端的文件
    ncftp /pub/Linux > lrmdir    <==删除本地端的『目录』


    Server 端的安全设置项目:

      事实上,由近年来公布的安全漏洞信息来看,这个 Wu FTP 所造成的漏洞真的是不少,所以,在架设 Wu FTP 时,一定要注意到安全性的设置项目上面,这个真的很重要!因为由网络上朋友回报的信息来看,目前最大宗的 Linux distribution (7.x 版本) 连上 Internet 之后,被入侵的最热门 port 就是 Wu FTP 啰!所以,我们才会一再地强调『非必要,不要架设 FTP 』。一般来说,我们会这样建议大家:
       
      1. 除非真的必要,否则尽量将 FTP 的 port 21 关掉;
      2. 如果真的要架设 Wu FTP ,请『一定要』将 Wu FTP 更新到最新的版本;
      3. 更新完毕之后,在架设之前,一定要考虑清楚,是否要开放 anonymous 的连接?除非必要,否则仅开放 Real 以及 guest 用户登录即可;
      4. 设置时,最好在 /etc/ftpaccess 就限制连接者的地址,以杜绝可能的入侵者的尝试;
      5. 尽量将用户限制在他们自己的家目录内;
      6. 将不想让他连接的帐号以 PAM 模块来抵挡,亦即将用户帐号写入 /etc/ftpusers 里面即可;
      7. 可以的话,以 iptables 以及 TCP_Wrappers 架设两层防火墙,限制住开放的网域即可。
       
      由设置、PAM 模块、TCP_Wrappers、iptables 共有四层防火墙,这样会比较安全一些,不能说就『高枕无忧』啦,但是会比较放心一些!我们约略的提一下防火墙的相关设置吧!
       

      iptalbes
       
      最外层的防火墙可以说就是这样 iptables 了,在设置之前,我们就必需要了解的是,我的 port 是几号?一般来说, port 至少有 21 以及 20 两个,但是不要忘记了,还有 passive ports 喔!这里我们假设 FTP 仅允许来自 140.116.0.0/16 这个 B Class ,而 passive ports (假设我们没有使用 related 那个防火墙设置项目)开放 65501 至 65505 共五个,那么我就应该在我的防火墙规则加入这几段:
       
      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 20:21   \
        -j ACCEPT
      /sbin/iptables -A INPUT -p TCP -i eth0 -s 140.116.0.0/16 --dport 65501:65505\
        -j ACCEPT 
       
      这样就限制了 FTP 仅可以使用的 ports ,其他更多的防火墙规划,请参考『简易防火墙』那个章节吧!
       

      TCP_Wrappers
       
      TCP_Wrappers 的设置我们在『简易防火墙』那一章节已经提过了,这里仅针对 FTP 提出设置项目:
       
      [root@test /root]# vi /etc/hosts.allow
      in.ftpd : 140.116.0.0/255.255.0.0

      [root@test /root]# vi /etc/hosts.deny
      in.ftpd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \
      /bin/echo; /usr/sbin/safe_finger @%h ) | \
      /bin/mail -s "%d -%h security" root@localhost & \
      : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允许登录,您的连接将会被纪录,并且作为以后的参考\n\n ". )

       
      这样一个小型的防火墙就建置起来啦!而且,只要有人 scan 你主机的 ftp port ,就会立刻被记录下来喔!
       

      pam 模块与 /etc/ftpusers 的关系
       
      要登录 FTP 之前需要输入密码对吧!输入密码就可以利用 PAM 模块来进行过滤啰!目前我们使用的 PAM 模块是放置在 /etc/pam.d 这个目录中,而 ftp 则是 /etc/pam.d/ftp 这个文件,在前头我们也约略提过这个文件啦,主要就是将要被抵挡的用户帐号写入到 /etc/ftpusers ,那么该帐号想要登录 FTP 时,就会被 PAM 模块的过滤系统挡掉!相当简易吧!而且还很有效呢! ^_^
       

      FTP 本身提供的抵挡 username 或 host 的控制项目
       
      除此之外, FTP 的设置档里面 /etc/ftpaccess 也有 deny 与 deny-uid 等等的抵挡机制,您也可以使用 /etc/ftphosts 来抵挡,关于这些文件的设置在本章前面都提过了,请翻阅参考啰! ^_^

    重点回顾

    • FTP 是 File Transfer Protocol 的简写,主要的功能是进行 Server 与 Client 端的文件管理、传输等事项;
    • Wu FTP 是很常见的一个 FTP 软件,不过由于安全性,建议务必升级到最新版本,此外,他的主要设置档是 /etc/ftpaccess 这一个;
    • 除了 Wu FTP 这个 FTP 软件之外,其实可以使用 SSH 提供的 sftp 功能来取代 FTP;
    • FTP 这个 daemon 比较常以 super daemon 来管理,亦即 xinetd 或者是 inet 这两个 super daemon ;
    • FTP 这个 daemon 所打开的正规的 port 为 20 与 21 ,其中, 21 为指令信道, 20 为数据传输信道;
    • FTP 的传输路线主要分为主动与被动(Passive, PASV),如果是主动的话,则 ftp-data 以 20 发送,否则则以 /etc/ftpaccess 规定的 passive ports 或者随机选取大于 1024 的 port 来进行被动式连接模式;
    • 一般来说, FTP 上面共有三个群组,分别是实体用户、访客与匿名登录者(real, guest, anonymous);
    • 可以借由修改 /etc/passwd 里面的 Shell 字段,来让用户仅能使用 FTP 而无法登录主机;
    • 可以使用 guestuser 及 guest-root 来限制实体用户,使成为访客用户;
    • 需要以 upload 来设置可以让 anonymous 上传的目录,并设置好其权限喔!
    • FTP 的指令、与用户活动所造成的注册表是放置在 /var/log/xferlog 里面;
    • 在 Client 端使用 ftp 这个程序时,可以加上『 ftp -p hostname』来让连接变成 passive 模式。

    参考资源


    本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看)

    • FTP 在创建连接以及数据传输时,会创建哪些连接?
    • FTP 主动式与被动式连接有何不同?
    • 有哪些动作可以让您的 FTP 主机更为安全 ( secure ) ?
    • 我们知道 ftp 会激活两个 ports ,请问这两个 port 在哪里规范的?而且,一般正规的 port 是几号?
    • Wu FTP 的主要设置档在哪里?
    • 在 Wu FTP 的设置档当中,那个 log transfer 是干嘛用的?
    • 在 Wu FTP 的设置档当中,那个 passive ports 是干嘛用的?
    • 那一个文件可以用来抵挡类似 root 这种系统帐号的登录 FTP?
    • 在 FTP 的 server 与 client 端进行数据传输时,有哪两种模式?为何这两种模式影响数据的传输很重要?

    • 前往参考用解答
    修改历史:
    2003/03/26:第一次完成 2003/09/13:修改部分内容,增加了详细说明 chroot 的地方去!
    2003/03/26以来统计人数
    其他链接
    环境工程模式篇
    鸟园讨论区
    鸟哥旧站

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