在TCP/IP网络应用中,文件传输协议FTP专门用于文件传输服务,主要提供文件下载、WEB网站维护、文件交换与共享等服务,它是目前最重要的、应用最多的Internet服务之一。
FTP服务器可以基于多种操作系统平台(Windows、RedHat Linux、SUSE Linux、CentOS、SUN Solaris10)进行搭建与配置。
一、FTP服务概述 1、FTP服务器功能
FTP 服务器的功能除了单纯的进行文件的传输与管理之外,依据服务器软件的设定架构, 他还可以提供几个主要的功能:
不同等级的用户身份:
FTP 服务器在预设的情况下,依据使用者登入的情况而分为三种不同的身份,分别是
l 实体账号,real user;
l 访客, guest;
l 匿名登录者, anonymous
这三种身份的用户在系统上面的权限差异很大。例如实体用户取得系统的权限比较完整,所以可以进行比较多的动作;至于匿名登录者,一般情况下就仅提供他下载一下资源而已,并不许匿名者使用太多服务器的资源。
在Linux平台下,其还具有
命令记录与登录文件记录:
FTP 可以利用系统的 syslogd 这个 daemon 来进行数据的纪录, 而记录的数据包括了用户曾经下达过的命令与用户传输数据(传输时间、文件大小等等)的纪录呢。所以你可以很轻松的在 /var/log/ 里面找到各项登录信息。
限制或解除用户家目录所在(change root, 简称 chroot)
为了避免用户在的Linux 系统当中随意改变登录路径。所以将使用者的工作范围『局限』在用户的家目录底下,这种环境称之为 change root ,简称 chroot 。
2、FTP工作流程
FTP 的传输使用的是可靠的 TCP 协议,TCP 这种封包格式在建立联机会话前会先进行三次握手。不过 FTP 服务器是比较麻烦一些,因为 FTP 服务器使用了两个联机会话会话,分别是控制信道与数据流通道 (ftp-data) 。这两个联机会话会话都需要经过三次握手。
clip_p_w_picpath002
简单的联机会话就如上图所示,联机会话的步骤如下所示:
1. 建立控制信道的联机会话
如上图一所示,客户端会随机取一个大于 1024 以上的端口与 FTP 服务器端的 port 21 建立联机会话, 这个过程当然需要三次握手。达成联机会话后客户端便可以通过这个联机会话来对 FTP 服务器下达指令, 包括查询文件名、下载、上传等等指令都是利用这个通道来下达的;
2. 通知 FTP 服务器端使用 active 且告知连接的端口号
FTP 服务器的 21 端口号主要用在命令的下达,但是当牵涉到数据流时,就不是使用这个联机会话了。 客户端在需要数据的情况下,会告知服务器端要用什么方式来联机会话,如果是主动式 (active) 联机会话时, 客户端会先随机启用一个端口,且通过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的联机会话;
3. FTP 服务器主动向客户端联机会话
FTP 服务器由命令通道了解客户端的需求后,会主动的由20这个端口号向客户端的随机端口联机会话, 这个联机会话当然也会经过三次握手。此时 FTP 的客户端与服务器端共会建立两条联机会话,分别用在命令的下达与数据的传递。 而预设 FTP 服务器端使用的主动联机会话端口号就是 port 20。
如此一来则成功的建立起“命令”与“数据传输”两个信道。不过,要注意的是, “数据传输信道”是在有数据传输的行为时才会建立的通道。并不是一开始连接到 FTP 服务器就立刻建立的通道。
在 FTP 服务器与客户端之间具有防火墙的联机会话问题:
一般来说,很多的局域网络 (LAN) 都会使用防火墙 (iptables) 的 NAT 功能,那么在 NAT 主机后端的 FTP 用户如何连接到 FTP 服务器呢? 我们可以简单的以下图来说明:
clip_p_w_picpath004
1. 命令通道的建立:
因为 NAT 主机会主动的记录由内部送往外部的联机会话信息,而由于命令信道的建立是由客户端向服务器端联机会话的, 因此这一条联机会话可以顺利的建立起来的;
2. 数据信道建立时的通知:
同样的,客户端主机会先启用端口 ,并通过命令通道告知 FTP 服务器,且等待主机端的主动联机会话;
3. 主机的主动联机会话问题:
但是由于通过 NAT 主机的转换后,FTP 服务器只能得知 NAT 主机的 IP 而不是客户端的 IP , 因此 FTP 服务器会以 port 20 主动的向 NAT 主机的 port BB 发送主动联机会话的要求。 但你的 NAT 主机并没有启动 port BB 来监听 FTP 服务器的联机会话。
了解问题的所在,在 FTP 的主动式联机会话当中,NAT 主机将会被视为客户端,但 NAT 主机其实并非客户端啊, 这就造成问题了。如果你曾经在 IP 分享器后面连接某些 FTP 服务器时,可能偶尔会发现明明就连接上 FTP 服务器了 (命令通道已建立),但是就是无法取得文件名的列表,而是在超过一段时间后显示“Can't build data connection: Connection refused,无法进行数据传输”之类的讯息, 那肯定就是这个原因所造成的困扰了。
目前有两个简易的方法可以克服这个问题:
使用 iptables 所提供的 FTP 侦测模块:
其实 iptables 早就提供了许多好用的模块了,这个 FTP 当然不会被错过。你可以使用 modprobe 这个指令来加载 ip_conntrack_ftp 及 ip_nat_ftp 等模块,这几个模块会主动的分析“目标是 port 21 的联机会话”信息, 所以可以得到 port BB 的资料,此时若接受到 FTP 服务器的主动联机会话,就能够将该封包导向正确的后端主机了。
客户端选择被动式联机会话模式
clip_p_w_picpath006
1. 建立命令通道:
同样的需要建立命令通道,通过三次握手就可以建立起这个通道了。
2. 发出 PASV 的联机会话要求:
当有使用数据信道的指令时,客户端可通过命令通道发出 PASV 的被动式联机会话要求 (Passive 的缩写), 并等待服务器的回应;
3. FTP 服务器启动数据端口口,并通知客户端联机会话:
如果你的 FTP 服务器是能够处理被动式联机会话的,此时 FTP 服务器会先启动一个端口在监听。 这个端口号码可能是随机的,也可以自定义某一范围的端口,端口看你的 FTP 服务器软件而定。 然后你的 FTP 服务器会通过命令通道告知客户端该已经启动的端口 (图中的 port PASV), 并等待客户端的联机会话。
4. 客户端随机取用大于 1024 的端口进行连接:
然后你的客户端会随机取用一个大于 1024 的端口号来对主机的 port PASV 联机会话。 如果一切都顺利的话,那么你的 FTP 数据就可以通过 port BB 及 port PASV 来传送了。
二、VSFTP 1、概述
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP 从此名称可以看出来,编制者的初衷是代码的安全。
提高安全性是编写VSFTP的初衷,除了这与生俱来的安全特性以外,高速与高稳定性也是VSFTP的两个重要特点。
在速度方面,使用ASCII代码的模式下载数据时,VSFTP的速度是Wu-FTP的两倍,如果Linux主机使用2.4.*的内核,在千兆以太网上的下载速度可达86MB/S。
在稳定方面,VSFTP就更加的出色,VSFTP在单机(非集群)上支持4000个以上的并发用户同时连接,根据Red Hat的Ftp服务器(ftp.redhat.com)的数据,VSFTP服务器可以支持15000个并发用户
VSFTP有它以下9种特点:
l 它是一个安全、高速、稳定的FTP服务器;
l 它可以做基于多个IP的虚拟FTP主机服务器;
l 匿名服务设置十分方便;
l 匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件;
l 不执行任何外部程序,从而减少了安全隐患;
l 支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置;
l 可以设置从inetd中启动,或者独立的FTP服务器两种运行方式;
l 支持两种认证方式(PAP或xinetd/ tcp_wrappers);
l 支持带宽限制;
VSFTP市场应用十份广范,很多国际性的大公司和自由开源组织在使用,如:Red Hat, Suse,Debian,OpenBSD。
vsftpd 所需要的套件只有一个,CentOS 默认情况下是没有安装的, 请利用 yum install vsftpd 来安装;
2、文件结构 /etc/vsftpd/vsftpd.conf 主配置文件
严格来说,整个 vsftpd 的配置文件就只有这个文件。这个文件的设定是以 bash 的变量设定相同的方式来处理的, 也就是“参数=设定值”来设定的,可以使用“man vsftpd.conf ”来详查。
/etc/pam.d/vsftpd 认证文件
这个是 vsftpd 使用 PAM 模块时的相关配置文件。主要用来作为身份认证之用,还有一些用户身份的抵挡功能, 也是通过这个文件来达成的。你可以察看一下该文件:
clip_p_w_picpath008
/etc/vsftpd/ftpusers禁止使用VSFTPD的用户列表文件
与上一个文件有关系,也就是 PAM 模块 (/etc/pam.d/vsftpd_ 所指定的那个无法登入的用户配置文件。 这个文件的设定很简单,你只要将“不想让他登入的账号”写入这个文件即可。一行一个账号,看起来像这样:
clip_p_w_picpath010
/etc/vsftpd/user_list 禁止或允许使用VSFTPD的用户列表文件
这个文件是否能够生效与 vsftpd.conf 内的两个参数有关,分别是“userlist_enable, userlist_deny”。
如果说 /etc/vsftpd/ftpusers 是 PAM 模块的设定项目,那么这个 /etc/vsftpd/user_list 则是 vsftpd 自定义项目。事实上这个文件与 /etc/vsftpd/ftpusers 几乎一模一样, 在预设的情况下,你可以将不希望可登入 vsftpd 的账号写入这里。不过这个文件的功能会依据 vsftpd.conf 配置文件内的 userlist_deny={YES/NO} 而不同,这得要特别留意。
/etc/vsftpd/chroot_list
这个文件预设是不存在的,所以你必须要手动自行建立。这个文件的主要功能是可以将某些账号的使用者 chroot 在他们目录下。但这个文件要生效与 vsftpd.conf 内的”chroot_list_enable, chroot_list_file “两个参数有关。 如果你想要将某些实体用户限制在他们的目录下而不许到其他目录去,可以启动这个设定项目。
/usr/sbin/vsftpd VSFTPD的主程序
这就是 vsftpd 的主要执行文件。不要怀疑, vsftpd 只有这一个执行文件而已。
/var/ftp/
这个是 vsftpd 的预设匿名者登入的根目录。
3、vsftpd.conf文件参数
事实上,/etc/vsftpd/vsftpd.conf 本身就是一个挺详细的配置文件,且使用“man 5 vsftpd.conf”则可以得到完整的参数说明。下面是常用选项参数说明。
与主机较相关的设定值
l connect_from_port_20=YES (NO)
这就是 ftp-data 的端口号;
l listen_port=21
vsftpd 使用的命令通道端口号,如果想要使用非正规的埠号,在这个设定项目修改!
l dirmessage_enable=YES (NO)
当用户进入某个目录时,会显示该目录需要注意的内容,显示的文件默认是 .message ,你可以使用底下的设定项目来修订!
l message_file=.message
当 dirmessage_enable=YES 时,可以设定这个项目来让 vsftpd 寻找该文件来显示讯息!
l listen=YES (NO)
若设定为 YES 表示 vsftpd 是以 standalone 的方式来启动的!
l pasv_enable=YES (NO)
启动被动式联机模式(passive mode),一定要设定为 YES !
l use_localtime=YES (NO)
是否使用本地时间?vsftpd 预设使用 GMT 时间(格林威治),建议设定为 YES 吧!
l write_enable=YES (NO)
如果你允许用户上传数据时,就要启动这个设定值;
l connect_timeout=60
单位是秒,在数据连接的主动式联机模式下,我们发出的连接讯号在 60 秒内得不到客户端的响应,则不等待并强制断线咯。
l accept_timeout=60
当用户以被动式 PASV 来进行数据传输时,如果主机启用 passive port 并等待 client 超过 60 秒而无回应, 那么就给他强制断线!这个设定值与 connect_timeout 类似,不过一个是管理主动联机,一个管理被动联机。
l data_connection_timeout=300
如果服务器与客户端的数据联机已经成功建立 (不论主动还是被动联机),但是可能由于线路问题导致 300 秒内还是无法顺利的完成数据的传送,那客户端的联机就会被我们的 vsftpd 强制剔除!
l idle_session_timeout=300
如果使用者在 300 秒内都没有命令动作,强制脱机!
l max_clients=0
如果 vsftpd 是以 stand alone 方式启动的,那么这个设定项目可以设定同一时间,最多有多少 client 可以同时连上 vsftpd。
l max_per_ip=0
与上面 max_clients 类似,这里是同一个 IP 同一时间可允许多少联机?
l pasv_min_port=0, pasv_max_port=0
上面两个是与 passive mode 使用的 port number 有关,如果您想要使用 65400 到 65410 这 11 个 port 来进行被动式联机模式的连接,可以这样设定 pasv_max_port=65410 以及 pasv_min_port=65400。 如果是 0 的话,表示随机取用而不限制。
l ftpd_banner=一些文字说明
当使用者联机进入到 vsftpd 时,在 FTP 客户端软件上头会显示的说明文字。不过,这个设定值数据比较少! 建议你可以使用底下的设定值来取代这个项目;
l banner_file=/path/file
这个项目可以指定某个纯文本档作为使用者登入 vsftpd 服务器时所显示的欢迎字眼。
与实体用户较相关的设定值
l guest_enable=YES (NO)
若这个值设定为 YES 时,那么任何非 anonymous 登入的账号,均会被假设成为 guest (访客)。 至于访客在 vsftpd 当中,预设会取得 ftp 这个使用者的相关权限。但可以透过 guest_username 来修改。
l guest_username=ftp
在 guest_enable=YES 时才会生效,指定访客的身份而已。
l local_enable=YES (NO)
这个设定值必须要为 YES 时,在 /etc/passwd 内的账号才能以实体用户的方式登入vsftpd 主机;
l local_max_rate=0
实体用户的传输速度限制,单位为 bytes/second, 0 为不限制。
l chroot_local_user=YES (NO)
将用户限制在自己的家目录之内(chroot)!这个设定在 vsftpd 当中预设是 NO,因为有底下两个设定项目的辅助! 所以不需要启动他!
l chroot_list_enable=YES (NO)
是否启用将某些实体用户限制在他们的家目录内?预设是 NO ,不过,如果您想要让某些使用者无法离开他们的家目录时, 可以考虑将这个设定为 YES ,并且规划下个设定值
l chroot_list_file=/etc/vsftpd.chroot_list
如果 chroot_list_enable=YES 那么就可以设定这个项目了! 他里面可以规定那一个实体用户会被限制在自己的家目录内而无法离开!(chroot) 一行一个账号即可!
l userlist_enable=YES (NO)
是否藉助 vsftpd 的抵挡机制来处理某些不受欢迎的账号,与底下的设定有关;
l userlist_deny=YES (NO)
当 userlist_enable=YES 时才会生效的设定,若此设定值为 YES 时,则当使用者账号被列入到某个文件时, 在该文件内的使用者将无法登入 vsftpd 服务器!该文件文件名与下列设定项目有关。
l userlist_file=/etc/vsftpd.user_list
若上面 userlist_deny=YES 时,则这个文件就有用处了!在这个文件内的账号都无法使用 vsftpd。
匿名者登入的设定值
l anonymous_enable=YES (NO)
设定为允许 anonymous 登入vsftpd 主机!预设是 YES ,底下的所有相关设定都需要将这个设定为 anonymous_enable=YES 之后才会生效!
l anon_world_readable_only=YES (NO)
仅允许 anonymous 具有下载可读文件的权限,预设是 YES。
l anon_other_write_enable=YES (NO)
是否允许 anonymous 具有写入的权限?预设是 NO!如果要设定为 YES, 那么开放给 anonymous 写入的目录亦需要调整权限,让 vsftpd 的 PID 拥有者可以写入才行!
l anon_mkdir_write_enable=YES (NO)
是否让 anonymous 具有建立目录的权限?默认值是 NO!如果要设定为 YES, 那么 anony_other_write_enable 必须设定为 YES !
l anon_upload_enable=YES (NO)
是否让 anonymous 具有上传数据的功能,默认是 NO,如果要设定为 YES , 则 anon_other_write_enable=YES 必须设定。
l deny_email_enable=YES (NO)
将某些特殊的 email address 抵挡住,不让那些 anonymous 登入! 如果以 anonymous 登入主机时,不是会要求输入密码吗?密码不是要您 输入您的 email address 吗?如果你很讨厌某些 email address , 就可以使用这个设定来将他取消登入的权限!需与下个设定项目配合:
l banned_email_file=/etc/vsftpd.banned_emails
如果 deny_email_enable=YES 时,可以利用这个设定项目来规定哪个 email address 不可登入我们的 vsftpd !在上面设定的文件内,一行输入一个 email address 即可!
l no_anon_password=YES (NO)
当设定为 YES 时,表示 anonymous 将会略过密码检验步骤,而直接进入 vsftpd 服务器内!所以一般预设都是 NO 的!
l anon_max_rate=0
这个设定值后面接的数值单位为 bytes/秒 ,限制 anonymous 的传输速度,如果是 0 则不限制(由最大带宽所限制),如果您想让 anonymous 仅有 30 KB/s 的速度,可以设定“anon_max_rate=30000”
l anon_umask=077
限制 anonymous 的权限!如果是 077 则 anonymous 传送过来的文件 权限会是 -rw------- !
关于系统安全方面的一些设定值
l ascii_download_enable=YES (NO)
如果设定为 YES ,那么 client 就可以使用 ASCII 格式下载文件。
l ascii_upload_enable=YES (NO)
与上一个设定类似的,只是这个设定针对上传而言!预设是 NO
l one_process_model=YES (NO)
这个设定项目比较危险一点~当设定为 YES 时,表示每个建立的联机都会拥有一支 process 在负责,可以增加 vsftpd 的效能。不过, 除非您的系统比较安全,而且硬件配备比较高,否则容易耗尽系统资源!一般建议设定为 NO !
l tcp_wrappers=YES (NO)
当然我们都习惯支持 TCP Wrappers !所以设定为 YES 吧!
l xferlog_enable=YES (NO)
当设定为 YES 时,使用者上传与下载文件都会被纪录起来。记录的文件与下一个设定项目有关:
l xferlog_file=/var/log/vsftpd.log
如果上一个 xferlog_enable=YES 的话,这里就可以设定了!这个是登录日志名
l xferlog_std_format=YES (NO)
是否设定为 wu ftp 相同的登录档格式?!预设为 NO ,因为登录档会比较容易读! 不过,如果您有使用 wu ftp 登录文件的分析软件,这里才需要设定为 YES
l nopriv_user=nobody
我们的 vsftpd 预设以 nobody 作为此一服务执行者的权限。因为 nobody 的权限 相当的低,因此即使被***,***者仅能取得 nobody 的权限!
l pam_service_name=vsftpd
这个是 pam 模块的名称,我们放置在 /etc/pam.d/vsftpd 即是这个!
上面这些是相当常见的 vsftpd 的设定参数,还有很多参数我没有列出来,您可以使用 man 5 vsftpd.conf 查阅!不过,基本上上面这些参数已经够我们设定 vsftpd 。
3、vsftpd 启动的模式
vsftpd 可以拥有两种启动的方式,分别是一直在监听的 stand alone ,一种则是透过 xinetd 这个 super daemon 来管理的方式,两种方式所使用的启动程序不太相同,而RedHat linux平台则预设是以 stand alone 来启动的。 那什么时候应该选择 stand alone 或者是 super daemon 呢?如果你的 ftp 服务器是提供给整个因特网来进行大量下载的任务,例如各大专院校的 FTP 服务器,那建议你使用 stand alone 的方式, 服务的速度上会比较好。如果仅是提供给内部人员使用的 FTP 服务器,那使用 super daemon 来管理即可。
利用系统提供的 script 来启动 vsftpd
clip_p_w_picpath012
自行设定以 super daemon 来启动
如果你的 FTP 是很少被使用的,那么可以利用 super daemon 来管理。 不过若你想要使用 super daemon 管理的话,那就得要自行修改一下配置文件了。
clip_p_w_picpath014
clip_p_w_picpath016
接下来修改一下 super daemon 的配置文件,需要创建此文件。
clip_p_w_picpath017
然后尝试启动,查看服务状态
clip_p_w_picpath019
4、基于RedHat 系统平台配置VSFTPD
安装VSFTP
clip_p_w_picpath021clip_p_w_picpath023
启动VSFTP服务
clip_p_w_picpath025
其它的功能配置可以参照上面的文件参数进行配置,在这里需要提示一下IPv6的支持,如果想使用VSFTP支持IPv6需要修改配置文件。
使用编辑器打开FTP的配置文件,使用下面的命令,如下图所示。
clip_p_w_picpath026
在配置文件中将listen=YES前加入#号,注释掉,将listen_ipv6=YES前面的#号去掉,使其生效。如下图所示。
clip_p_w_picpath030clip_p_w_picpath027clip_p_w_picpath028
需要启动FTP服务,使用下面的命令,如下所示。
clip_p_w_picpath031
4、基于CentOS 系统平台配置VSFTPD
未完待续。。。。。。