020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> LINUX应用 >> LINUX安装 >> 正文
    linux FTP架设

    点击:   发布日期:2013-01-09

    本文来自 www.020fix.com

    FTP 伺服器与用户端程式
    FTP 就是"档案传输协定"(File Transfer Protocol)的简写。 FTP 伺服器允许用户端, 连线与取回(下载)档案的要求。目前 Linux 上存在有多种 FTP 伺服器与用户端程式, 他们通常会放在大部分的 Linux 发行版本中。有文字模式的用户端程式, 也有 GUI 模式的。
    原理:File Transfer Protocol ( FTP ) 是相当古老的网路协定之一,他最主要的功能就是进行 Server 端与 Client 端之间的档案传送的功能啦!FTP 其实是以 TCP 封包的模式进行 Server 与 Client 之间的连线,当连线建立之后,使用者可以在 Client 端连上 Server 端进行档案的下载与上传,此外,还可以直接管理用户在 Server 上面的档案呢,相当的方便!而这个最古老的 FTP 伺服器软体,大概要算是 Wu FTP 了,所以,底下我们将针对 Wu FTP 进行设定的说明喔!
    套件安装: 事实上,使用 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 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 的设定档,如果要进行多重控制的话,例如:我的主机有两块介面卡,一块对内一块对外,对内与对外的『开放时间』与『开放网域』及『相关权限』都不相同时,就可以使用其他额外的设定来控制这些参数! 
    好了,那么最终终于要来启动 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


    [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


    限制最大线上人数
     
    如果由于自己本身的硬体设备问题或者是频宽的问题,所以不想提供太多的同时连线使用者数量时,可以使用『最大线上人数限制』的项目来规范呢!规范的内容很简单,同样的仅要编写 /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


    可以理解吗?加油喔! ^_^