since2012/04/23

     
 
简易 FTP Server 架设 -- Wu FTP
本文已不再维护,更新文章请参考此处
最近更新日期:2003/09/13
在 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 端进行数据传输时,有哪两种模式?为何这两种模式影响数据的传输很重要?

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

    2003/03/26:第一次完成
    2003/09/13:修改部分内容,增加了详细说明 chroot 的地方去!
     
         
    http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

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