一、Vsftpd的基本信息
官方网站:http://vsftpd.beasts.org/
作者:Chris Evan
最新版本:vsftpd-2.0.3(我装的版本:vsftpd-2.0.1-5,还蛮新的嘛:P)
FAQ: ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-1.2.2/FAQ
ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/FAQ
在线文档/源代码:ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/
vsftpd是一个符合GPL协议的FTP服务器软件,适合在类UNIX系统中运行,包括Linux,较其他FTP服务器而言,vsftpd在安全性、可靠性以及速度上技胜一筹。采用vsftpd的典型网站有:
ftp.redhat.com 主要出于速度要求而采用vsftpd
ftp.openbsd.org 主要出于安全性而采用vsftpd
vsftpd的典型特点有:
·支持虚拟IP配置
·支持虚拟用户
·standalone或inetd两种模式(区别见后)
·强大的针对单个用户的设置功能
·支持带宽控制
·支持针对单个IP的设置
·支持针对单个IP的限制
·支持IPv6
·集成SSL加密功能
·等等
如果你要配置的FTP服务器追求以下要求:
→安全性
→高性能
→可靠性
那么vsftpd就是你的正确选择。实际上vsftpd适合于大部分的应用,即使有时它可能会缺少某一个你所需要的特性,这也往往可以通过外部如组件PAM或xinetd/tcp_wrappers来提供。在这点上,vsftp很好的符合了UNIX的模块化思想,它自己就是一个模块化的组件。最后,移植到vsftpd上可能会意味着失去某些现有服务器提供的诡异而多余的功能,但是这应该是完全值得的。SAC小组、IBM公司及RedHat公司都推荐vsftpd,就算不信我的话,那么他们的话总该信吧?
还有,你知道为什么它叫vsftpd吗?它的真名是Very Secure FTP Daemon,从名字就可以看出它的特点,当然信不信就由你了。
二、vsftpd的下载安装:
好,假设你已经相信了我前面的话并且从它的官方网站上下了一个vsftpd的RPM安装包。。。哎,其实在Fedora Core release 3的安装盘中就有vsftpd的RPM安装包的,不过下了也没关系,并不比找安装盘也更费时。当然如果你机器上在装系统的时候就已经装了vsftpd的话,那就有点冤了,很简单,用下面的命令来看有没有安装vsftpd:
# rpm –qa | grep vsftpd
如果已经安装上vsftpd了,则会返回其版本信息,否则没有任何信息返回。
推荐一个比较全的关于vsftpd安装及配置的网站:http://www.vsftpdrocks.org/ 英文不太差的兄弟都可以直接去那里,不用浪费时间再往下看了。
还有一个台湾人写的网页,虽然稍早了点,但还是很有参考价值的:
http://linux.vbird.org/linux_server/0410vsftpd.php
剩下来的兄弟,废话不多说,开始安装。Vsftpd有三种安装方式:
√源代码安装
√通过FreeBSD包安装
√通过RPM安装
由于FC3安装盘中自带的是RPM包,从官方网站上也可以方便的下到RPM包,最重要的是RPM包非常容易安装,所以我选择第三种安装方法。
1、 提供vsftpd安装RPM包的网站有:
官方网站:ftp://vsftpd.beasts.org/users/cevans/
Redhat's rpm collection (http://rhn.redhat.com/ )
Rpmfind.net(http://www.rpmfind.net/ )
2、 安装vsftpd
# rpm -ivh vsftpd-2.0.1-5.i386.rpm
3、 附我的安装步骤,你可以略过:
本次安装使用的是FC3安装盘里的RPM包,并且为了节省从服务器端下载RPM包这个步骤,使用本地文件夹直接映射到服务器上ISO文件的方式,使用FTP方式安装(呵呵,有意思的是,这个服务器端使用的FTP服务器也是vsftpd)。
在我的root目录下新建两个文件夹,文件名任意,设为tmp和isotmp,用来映射ftp服务器上的文件夹:
mount -t nfs 202.118.239.46:/ftp tmp/
然后进入tmp目录,进到其中的ISO/FC3目录下,
mount -o loop FC3-i386-DVD.iso /root/isotmp
进入/root/isotmp文件夹中,找到其中的vsftpd安装rpm包,开始安装:
#rpm -ivh vsftpd-2.0.1-5.i386.rpm
三、vsftpd的运行:
上面已经安装好了vsftpd,现在要使它运行起来。其实这很简单,配置FTP服务器的真正有技术含量的工作在于怎么修改好它的配置文件,以使你的服务器的运行效率、安全性及稳定性最高。
运行之前需要先了解守护进程的两种运行模式:standalone 及xinetd,vsftpd也提供了standalone和inetd(inetd或xinetd)两种运行模式。简单解释一下,standalone 模式是指服务器一次性启动,运行期间一直驻留在内存中,优点是对接入信号反应快,缺点是损耗了一定的系统资源,因此经常应用于对实时反应要求较高的专业 FTP服务器。inetd恰恰相反,由于只在外部连接发送请求时才调用FTP进程,因此不适合应用在同时连接数量较多的系统。在最初的vsftpd版本中,为了便于大型服务器限制来自同一个IP的访问数,软件作者推荐使用xinetd模式,但由于下面的两个原因,作者在V1.1.3版本之后推荐 standalone模式:
→xinetd模式不够稳定,据许多网站报告,它有时会统计错误并拒绝合法连接。
→standalone模式的功能得到增强,可以自己统计每个IP的连接数,还可
以通过集成tcp_wrappers来控制连接,乃至可以进行针对单个IP的配置。
1、在这里,先使用standalone模式运行vsftpd,步骤如下:
① 打开配置文件vsftpd.conf,设置成standalone模式:
# vi /etc/vsftpd/vsftpd.conf
找到里面的这句话:listen=YES,默认状态是被注释掉的,把注释取消;如果没找到这句话,那就把它加进去。
② 运行FTP服务器:
# /usr/sbin/vsftpd &
然后试试登录:
[root@mmpire ~]ftp localhost
Connected to mmpire.
220 Welcome to mmpire FTP service.:P:P:P
530 Please login with USER and PASS
530 Please login with USER and PASS
KERBEROS_V4 rejected as an authentication type
Name (localhost:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (127,0,0,1,220,137)
150 Here comes the directory listing
drwxr-xr-x 2 0 0 4096 Oct 04 2004 pub
drwxr-xr-x 2 0 0 4096 Apr 02 10:43 sadf
226 Directory send OK.
ftp> quit
221 Goodbye.
[root@mmpire ~]
如果你收到了类似的返回信息,那么说明你的vsftpd安装成功了。
2、如果你要使用xinetd模式,为节省篇幅,此处仅给出一个连接:
http://www.vsftpdrocks.org/rpm/
在里面你也许应该注意到这句话,然后作出选择:
I recommend running vsftpd out of either inetd or xinetd
四、vsftpd的配置:
到了关键时候了,服务器配置能力的高下在这里见分晓。不敢乱写,在这里仅给出配置文件的基本信息以及软件作者推荐的几个配置单。在进入配置文件之前,先说一下本地用户的概念。其实本地用户就是除匿名用户之外的用户,即在服务器里保存着信息(用户名和密码)的用户。在/etc/下有两个文件: vsftpd.ftpusers和vsftpd.user_list,里面有很多用户名,是用来干什么的呢?
¤vsftpd.ftpusers:FTP黑名单,在这个名单上的用户都无法登录FTP服务器。
¤vsftpd.user_list:这个名单的功能根据配置文件vsftpd.conf里的userlist_deny的值不同而不同,如果userlist_deny=YES,则此名单仍为黑名单,即列在其中的用户不能登录;如果userlist_deny=NO或者 userlist_deny被注释掉,则这个名单为合法用户名单,在此名单之外的用户名(除anonymous外)都是无效用户名,将不能登录。
注意:当第二个名单为合法名单时,考虑这样的情况:有一个用户名同时在两个名单上,结果会怎样?很简单,类似于bbs里被封了权限的账号一样,将无法登录FTP服务器。
1、配置文件vsftpd.conf
一般在/etc/vsftpd目录下,也有可能在/etc下面,自己找找。里面的条目不少,不过都有详细的英文注解,英文不好的可以去网上找译得好的,这里给出我的理解:
# Example config file /etc/vsftpd/vsftpd.conf
示例配置文件 /etc/vsftpd/vsftpd.conf
# The default compiled in settings are fairly paranoid. This sample file
# loosens things up a bit, to make the ftp daemon more usable.
# Please see vsftpd.conf.5 for all compiled in defaults.
这些默认设置是相当宽松的,目的只是让FTP能跑起来,这意味着你需要自己来加一些限制,以达到你对服务器的安全性、性能及稳定性的要求。
vsftpd.conf.5 里有所有编译时刻确定的默认值。
# READ THIS: This example file is NOT an exhaustive list of vsftpd options.
# Please read the vsftpd.conf.5 manual page to get a full idea of vsftpd's
# capabilities.
注意:本示例文件并未包含所有vsftpd的设置选项,如有需要,可以参考vsftpd.conf.5手册,其下载地址为:ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/vsftpd.conf.5
# Allow anonymous FTP? (Beware - allowed by default if you comment this out).
anonymous_enable=YES
允许匿名用户访问则设为YES(注意:如果你仅仅注释掉了这句话,那也等效于允许匿名访问)
注:YES、Yes或者yes都可以,但是等号与YES之间不可以有空格,否则FTP服务器无法正常工作。
错误用法: anonymous_enable= YES (不允许中间有空格)
# Uncomment this to allow local users to log in.
local_enable=YES
允许本地用户访问则设为YES,不允许则设为NO或注释掉这句话。
注:所谓“本地用户”是指在系统中保存有用户信息(用户名及密码)的用户,指所有除匿名用户以外的用户。
# Uncomment this to enable any form of FTP write command.
write_enable=YES
允许写权限则设为YES,注意这是针对所有用户的,即如果设为NO或注释掉这句话,那么所有用户都将没有可能进行写类的操作。注1:这里设为 YES并不意味着所有用户就可以进行写操作了,后面还有对各种用户的特定设置。但如果这里设成了NO或被注释掉,那么后面怎么设也没用,所有用户都不可以进行写操作了。注2:写类操作包括上传、修改、删除、创建目录等。
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
local_umask=022
本地用户的默认umask值是077,你可以在这里把它设为022,大多数ftp使用此umask值。
关于umask值,又可以写好多,这里简单介绍一下:
注:umask大概是user mask的意思,登录到服务器的每个用户都有自己的mask,umask的值决定了这个用户所产生的目录和文件的默认权限。比如mmpire用户的 umask值是022,那么他创建的目录和文件的默认权限分别是755和644,注意目录和文件是被区分开的。这个转化规则很简单,就是利用下面的这个表:umask值 文件属性值 目录属性值
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0
其实在linux系统里也有umask,可以通过umask命令来查看:
[root@mmpire vsftpd]#umask
0022
[root@mmpire vsftpd]#su mmpire
[mmpire@mmpire vsftpd]umask
0002
注意到了吧,root用户和mmpire用户的umask值是不一样的,也就决定了他们俩创建的目录和文件的默认权限是不一样的,你自己算算是多少吧!
# Uncomment this to allow the anonymous FTP user to upload files. This only
# has an effect if the above global write enable is activated. Also, you will
# obviously need to create a directory writable by the FTP user.
anon_upload_enable=YES
允许匿名用户上传则设为YES,不允许则设为NO或注释掉这句话。
注意:这个设置有效的前提是前面的write_enable设为YES,不然谁也没有写权限,更不用说匿名用户了。
# Uncomment this if you want the anonymous FTP user to be able to create
# new directories.
anon_mkdir_write_enable=YES
允许匿名用户新建目录则设为YES,不允许则设为NO或注释掉这句话。
# Activate directory messages - messages given to remote users when they
# go into a certain directory.
dirmessage_enable=YES
意思是激活目录消息,当用户访问特定文件时给出提示消息。具体使用方法是:
1,将此值设为YES,如上所示,然后保存vsftpd.conf,重启FTP服务器。
2,比如要使pub目录提示消息,则在pub目录下增加一个.message文件,里面写上"hi!here are pub!"
3,从用户端登录FTP服务器,进入pub目录时,系统将给出提示:“hi!here are pub!”
# Activate logging of uploads/downloads.
xferlog_enable=YES
需要保存上传/下载的日志则设为YES。日志文件的位置由后面的xferlog_file参数指定,
默认是/var/log/vsftpd.log。
# Make sure PORT transfer connections originate from port 20 (ftp-data).
connect_from_port_20=YES
允许从FTP数据端口20连接则设为YES。
注:一般FTP的数据传输端口都是20,而命令传输端口是21。
# If you want, you can arrange for uploaded anonymous files to be owned by
# a different user. Note! Using "root" for uploaded files is not
# recommended!
#chown_uploads=YES
#chown_username=whoever
这两条命令必须一起用,且第一个为YES时第二个才有效。如果第一个设为YES,且第二个设为root,那么所有由匿名用户上传的文件,其所有者就设为root,当然本地用户上传的文件属性不受影响。
注:比较有意思的是服务器默认有一个系统用户ftp,密码也是ftp,它的权限跟匿名用户差不多,在这里,它所上传的文件的所有者等属性也会变成root。
# You may override where the log file goes if you like. The default is shown
# below.
xferlog_file=/var/log/vsftpd.log
这是日志文件的位置,日志记载了所有的用户活动。
注:不过据我观察这里似乎只有本地用户的记录,而无匿名用户的记录。
# If you want, you can have your log file in standard ftpd xferlog format
xferlog_std_format=YES
如果需要标准格式的日志,则设为YES。
# You may change the default value for timing out an idle session.
idle_session_timeout=60
意思是如果某个用户在60s之内没有活动,则断开这个用户的连接。
注:用户活动包括上传、下载、操作文件、切换目录等。
# You may change the default value for timing out a data connection.
data_connection_timeout=120
意思是如果一个数据通道超时120s以上,则断开这个数据连接。
注:这里跟上面的超时不一样,上面是用户未做任何活动,而这里是用户在下载
或上传数据时,数据连接可能由于网络原因而间断,当超过这里设的时间时服务
器就自动断开这个连接。
# It is recommended that you define on your system a unique user which the
# ftp server can use as a totally isolated and unprivileged user.
#nopriv_user=ftpscure
最好在系统里设置一个单独而且没有任何特权的用户来运行FTP服务器,这样能保证你的系统更安全,不会因为FTP服务器被入侵而损害到整个系统的其他部分。不过我试过更改此选项,但并未成功:设为系统中已有的mmpire用户后,进到mmpire中还是无法启动FTP服务器,可能是由于我装 vsftpd的时候用的是root用户的缘故。
# Enable this and the server will recognise asynchronous ABOR requests. Not
# recommended for security (the code is non-trivial). Not enabling it,
# however, may confuse older FTP clients.
#async_abor_enable=YES
开启支持早期FTP客户端“async ABOR”命令的能力,我不清楚这个命令的具体意思,似乎是异步传输请求?不过软件作者不推荐把这个值设为YES,因为它可能会带来安全上的问题。但禁用它可能会影响到一些用老FTP客户端连接服务器的用户,你自己考虑吧!
# By default the server will pretend to allow ASCII mode but in fact ignore
# the request. Turn on the below options to have the server actually do ASCII
# mangling on files when in ASCII mode.
# Beware that turning on ascii_download_enable enables malicious remote parties
# to consume your I/O resources, by issuing the command "SIZE /big/file" in
# ASCII mode.
# These ASCII options are split into upload and download because you may wish
# to enable ASCII uploads (to prevent uploaded scripts etc. from breaking),
# without the DoS risk of SIZE and ASCII downloads. ASCII mangling should be
# on the client anyway..
#ascii_upload_enable=YES
#ascii_download_enable=YES
这两个值分别控制ASCII模式的上传与下载。系统默认情况下不支持ASCII模式,因为服务器在这种模式下容易受到恶意攻击。你可以仅仅打开ASCII模式的上传功能而不允许ASCII模式的下载,这样也还算是比较安全的。
注:
1.通过FTP传送的文件分为两类:文本文件(ASCII)和二进制文件(BINARY)。文本文件的内容遵循ASCII的定义,由定义好的 ASCII码组成,可以被显示和编辑。二进制文件是指除文本文件以外的所有文件格式。不同操作系统之间的文本文件格式一般会有一些差别,比如Linux下的换行符与Windows的就不一样,所以当FTP在进行ASCII文件的传输时,可能会自动进行一些格式转换,而对于二进制文件来说,ftp不进行任何转换。由此可知,当ASCII文件按二进制方式传输时,至多只是一些换行符未被替换,大致内容还是对的,(128位ASCII码是通用的),使用编辑器如 UltraEdit就可以自动转换,所以问题不大,但决不能将二进制文件按ASCII方式传输,因为二进制文件往往是可执行文件,一旦内容稍被修改就会导致无法使用。
默认情况下,vsftpd会在表面上允许客户使用ASCII传输模式,而实际上忽略了这个请求,仍然以二进制模式传输,从上面可以知道,这并不会造成文本文件无效,最多只会有一些小缺陷而已。
2.关于DoS攻击,参看中国IT认证实验室的文章:
http://www.chinaitlab.com/www/special/ciwddos.asp
# You may fully customise the login banner string:
ftpd_banner=Welcome to mmpire FTP service.:P:P:P
在这里设置你的FTP服务器的进站欢迎词,发挥你的想像力,用字符画画。
# You may specify a file of disallowed anonymous e-mail addresses. Apparently
# useful for combatting certain DoS attacks.
#deny_email_enable=YES
这个email列表列出了所有禁止访问的邮件地址,据作者说可以有效防止DoS攻击,当匿名用户登录时将被要求使用邮件地址来作为密码,而如果使用的是在这个列表里的email地址,服务器将拒绝这个连接要求。
注:
1,如果设为YES,那么下面的banned_email_file也需要设置,用以指向包含所有非法邮件地址的文件。
2,我不知道那些使用vsftpd的网站是怎么实现这个功能的,不过据我测试,一些声称需要匿名用户使用邮件地址作为密码的FTP服务器,实际上输入任意密码都可以,只要不是在拒绝邮址目录的条目,都可以登录进去。
3,在Wu-FTP、Serv-U等FTP服务器中都可以检测匿名用户输入的密码是否为邮件地址格式,即是否含有@字符。更先进的vsftpd理应支持,等我以后知道了再补充,如果你知道,请告诉我,谢谢:mmpire@gmail.com
# (default follows)
#banned_email_file=/etc/vsftpd.banned_emails
这条命令必须在上一条为YES时才有效,它指定了一个非法邮件列表文件。
如果某个匿名用户输入的密码列在这个表里,那么服务器就会拒绝登录。
# You may specify an explicit list of local users to chroot() to their home
# directory. If chroot_local_user is YES, then this list becomes a list of
# users to NOT chroot().
#chroot_list_enable=YES
# (default follows)
#chroot_list_file=/etc/vsftpd.chroot_list
这两个命令必须与chroot_local_user一起使用:
1,当chroot_local_user=NO时,用户名在/etc/vsftpd.chroot_list文件里的用户将被限制在自己的目录里,而无法访问除自己目录以外的目录。本地用户一般在“/home/用户名/”目录下。
2,相反当chroot_local_user=YES时,用户名不在/etc/vsftpd.chroot_list文件里的用户将被限制。
注:匿名用户只能在“/var/ftp/”目录下,不受上面的设定影响。
注:默认情况下没有vsftpd.chroot_list文件,需要自行添加,每行一个用户名即可,
注:vsftpd服务器通过调用chroot()函数来实现用户的目录更改操作,而不是直接调用系统的函数,这样据说可以提高安全性。
# You may activate the "-R" option to the builtin ls. This is disabled by
# default to avoid remote users being able to cause excessive I/O on large
# sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
# the presence of the "-R" option, so there is a strong case for enabling it.
ls_recurse_enable=YES
允许用户以递归方式来显示目录下的内容则设为YES。
注:以递归方式显示对用户来说比较方便,具体命令为:ls -R
用户可以一次性查看当前目录下的文件和子目录,以及子目录里面的文件和子目录,如此递归下去...显然,如果是一个大的FTP服务器,那么这个过程可能会很漫长,很耗资源,所以只推荐小型服务器使用。
pam_service_name=vsftpd
指定PAM身份确认服务的配置文件为vsftpd,指的是/etc/pam.d/vsftpd这个文件。
注:PAM是由SUN公司提出的一种身份认证机制,广泛应用于类UNIX系统中,可用于telnet、login、ftp等服务的用户认证。欲详细了解请看下面这篇文章:
http://blog.chinaunix.net/article.php?articleId=12239&blogId=60
#userlist_enable=YES
与这个选项相关的有userlist_deny和userlist_file,关系很复杂,简单描述一下:
1,userlist_file的值指定一个文件,里面按行存放着一些用户名。
2,首先,如果userlist_enable=NO或被注释掉,那么其他两项无效。
3,否则,再看userlist_deny,如果为YES,则userlist_file文件是一个黑名单;如果为NO,则为白名单(即不在此文件中的用户名无法登录)。
注:均指本地用户。
#enable for standalone mode
listen=YES
如果要使用standalone模式则设为YES。这两个模式前面已经讲过,不再赘述。
#tcp_wrappers=YES
TCP_Wrappers是一种数字过滤工具,可以用来实现访问控制和网络记录。
1,控制对系统提供的由inetd启动的服务的访问;
2,对访问/etc/inetd.conf文件中的服务请求进行记录;
跟前文一致,不推荐使用inextd模式来运行FTP服务器。
注:新版本vsftpd的standalone模式已经支持tcp_wrappers,见后面“针对单个IP的配置”。
2、推荐配置实例
①standalone运行模式下的针对InternetSite应用的配置文件vsftpd.conf:
# Standalone mode
listen=YES
max_clients=200
max_per_ip=4
# Access rights
anonymous_enable=YES
local_enable=NO
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
# Security
anon_world_readable_only=YES
connect_from_port_20=YES
hide_ids=YES
pasv_min_port=50000
pasv_max_port=60000
# Features
xferlog_enable=YES
ls_recurse_enable=NO
ascii_download_enable=NO
async_abor_enable=YES
# Performance
one_process_model=YES
idle_session_timeout=120
data_connection_timeout=300
accept_timeout=60
connect_timeout=60
anon_max_rate=50000
②针对单个IP的配置:
设置过程:
1, 在配置文件vsftpd.conf中加入:
tcp_wrappers=YES
2, 重启FTP服务器,单IP配置功能其实已经启动,试一试?
3, 在/etc/hosts.allow文件中加入这么一句:
vsftpd: 173.26.100.36: DENY
这是msmouse的IP地址,呵呵,他就登不上FTP服务器了。
4, 这还没完全发挥单IP配置的强大功能,再加上下面这条:
vsftpd: 173.26.100.31: setenv VSFTPD_LOAD_CONF /etc/vsftpd_mmpire.conf
这里的意思是:对于从173.26.100.31这个IP发过来的连接请求,使用特定的配置文件,这里指定是/etc/vsftpd_mmpire.conf文件,你预见到它的强大用处了吗?
注:这里使用了tcp_wrappers数字过滤工具。当用户试图登录FTP服务器时,服务器先调用tcp_wrappers, tcp_wrappers可以根据用户的IP进行特定配置,配置文件在/etc/hosts.allow中,注意这是tcp_wrappers的配置文件而不是vsftpd的。由于新版本vsftpd在standalone模式下也支持此工具,xinetd模式就更没有什么优势了。
还有几个配置实例,这里不一一详述,可以到这里下载:
ftp://vsftpd.beasts.org/users/cevans/untar/vsftpd-2.0.3/EXAMPLE/