2012.10.11更新,增加 vsftpd 配置文件说明。
2013.07.03更新,对文中一些字符被代码插件转义的错误。
我的电脑系统是win7 64bit,用virtualbox安装了一个最小化版的centos 6.3 64位的系统。最近特意想搭建一个FTP的服务器,所以,就有了如下的过程。备忘,方便你我他。
注:文章最后会附上 vsftpd 服务器配置文件的选项说明。
关于vsftpd介绍如下:
vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开发源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。
OK !现在进入安装配置。
1、安装vsftp
因为,我采用的yum命令安装,不是源码包安装。所以,安装和配置都非常的方便。
在这里,我要架设的是虚拟用户。所谓虚拟用户就是没有使用真实的账户,只是通过某种技术手段达到映射账户和设置权限的目的。
执行如下代码进行安装vsftpd:
yum -y install vsftpd
如果,你不确定自己的系统是否已经安装vsftpd,请用以下命令检测:
rpm -qa | grep vsftpd
如果输出类似以下内容:
vsftpd-2.2.2-11.el6.x86_64
说明你当前的系统已经安装了。这是基于yum命令进行安装的检测方法,使用源码包编译安装的检测方法不知道是不是这样,如果你知道,请留言告诉我。谢谢。
如果,什么都没有输出,说明你的系统没有安装。
因为,接下来配置 vsftpd 的需要,所以,要事先创建一个文件,命令如下:
touch /var/log/vsftpd.log
2、启动/重启/停止 vsftpd 服务器
刚才我们安装了vsftpd 服务器,但是,这个时候,还没有启动 vsftpd 服务。以下命令启动:
service vsftpd start
会出现一行启动成功的提示信息:
Starting vsftpd for vsftpd: [ OK ]
如果,你与我一样是安装的中文语言的Centos,那么提示信息将是中文的。如果,提示信息里面没有OK出现,也没有“确定”这样的字眼出现,说明启动失败了。反正,按照我的方式,不会出现失败。
vsftpd 的 重启命令:
service vsftpd restart
vsftpd 的 停止命令:
service vsftpd stop
如果,你希望下次系统启动的时候,自动启动 vsftpd 服务器,执行以下命令:
chkconfig vsftpd on
3、与 vsftpd 服务器有关的文件和文件夹
vsftpd服务器的配置文件的是: /etc/vsftpd/vsftpd.conf
vsftpd服务器的根目录,即FTP服务器的主目录:/var/ftp/pub
4、添加FTP本地用户(即虚拟用户,简单方案)
FTP大家可能都用过,通过给定的HOST、账号、密码就可以访问服务器对应的目录空间了。但是,这个FTP账号只能访问FTP服务,不能登录服务器系统,只能访问自己的目录。这样的用户就叫虚拟用户,本质上这不叫虚拟用户,仅仅只是不能通过终端等一系列途径登录服务器系统而已。
创建一个FTP用户的命令如下:
adduser -d /opt/ftp_dir/ftp001 -g ftp -s /sbin/nologin ftp001
此命令的含义:
使用shell命令adduser添加一个ftp001的系统账户,但是,不能登录系统(-s /sbin/nologin),该账户的主目录在(-d /opt/ftp_dir/ftp001),属于ftp这个用户组(-g ftp)。
我们创建了一个FTP账户,现在来设置账户的密码,命令如下:
passwd ftp001
接着会要求你输入两次密码确认。为了避免出现不要求的错误,请尽量保证自己的密码长度大于6个字符,且是字母与数字的混合的字符串。如我的密码是:ftp123456。
5、vsftpd 配置文件的调整
anonymous_enable=NO 设定不允许匿名访问
local_enable=YES
设定本地用户可以访问。注:如使用虚拟宿主用户,在该项目设定为NO的情况下所有虚拟用户将无法访问。
chroot_list_enable=YES 使用户不能离开主目录
xferlog_file=/var/log/vsftpd.log
设定vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来。我们已经一开始就已经创建了。
ascii_upload_enable=YES
ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能。
pam_service_name=vsftpd PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证
chroot_list_file 将这个配置前面的#号去掉。
以下这些是关于Vsftpd虚拟用户支持的重要CentOS FTP服务配置项目。
默认vsftpd.conf中不包含这些设定项目,需要自己手动添加CentOS FTP服务配置。
guest_enable=YES 设定启用虚拟用户功能。
guest_username=ftp 指定虚拟用户的宿主用户。-CentOS中已经有内置的ftp用户了
user_config_dir=/etc/vsftpd/vuser_conf
设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名)
这个目录可以这样理解,针对每一个FTP账号,我们可以在此目录下创建一个与账号同名的文件(必须同名,这是规定)。然后,在里面配置一些特殊的信息。比如:这个账号是否能上传文件,是否能下载文件,所能访问的目录空间是什么等。
6、创建chroot list,将FTP用户加入其中:
我们有了FTP账号,但是,这个时候 vsftpd 服务器并不知道。所以,我们要告诉它。
执行如下命令:
touch /etc/vsftpd/chroot_list echo ftp001 >> /etc/vsftpd/chroot_list
如果,你有多个FTP账户,那么请将这些账户以每行一个的方式配置在此文件中即可。
7、账户认证:
首先,我们要安装Berkeley DB工具,很多人找在接下来执行db_load命令的时候,会发生找到不此命令的错误就是因为没有安装这个包。
首先查看系统中是否已经安装,命令如下:
rpm -qa|grep db4
安装即会输出类似以下的信息:
db4-4.7.25-17.el6.x86_64 db4-utils-4.7.25-17.el6.x86_64
反之,则没有安装。执行以下命令进行安装:
yum -y install db4 db4-utils
安装完毕。然后我们创建用户密码文本,命令如下:
vi /etc/vsftpd/vuser_passwd.txt
将我们的FTP账号密码配置进去。注意奇行是用户名,偶行是密码。如:
ftp001
ftp123456
接着,生成虚拟用户认证的db文件,执行如下命令:
db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db
随后,编辑 vsftpd 认证文件:/etc/pam.d/vsftpd.
将此文件中所有代码注释掉,注释请用#号。然后,在文件最后增加如下两句:
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd account required pam_userdb.so db=/etc/vsftpd/vuser_passwd
以上两句是32位系统的添加内容,64位的系统是如下:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser_passwd
8、最后配置每个FTP用户的配置文件
因为,我们要将所有与用户FTP配置文件放到如下目录下,所以,我们要创建它:
mkdir /etc/vsftpd/vuser_conf/
然后,在此目录中为每个FTP用户创建一个配置文件,以我们创建和ftp001账户为例:
vi /etc/vsftpd/vuser_conf/ftp001
在文件中配置如下内容:
local_root=/opt/ftp_dir/ftp001 write_enable=YES anon_world_readable_only=NO anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES local_umask=022
local_root是告诉FTP账户只能访问此目录。
以上配置完成之后,记得关闭系统防火墙。
————————-以下是常见错误与解决方案—————–
安装完以后,可能发现连接ftp服务器,一般是由于SELinux的问题,原因如下:
CentOS系统是Rad Hat派系的,把vsftpd安装配置OK之后,但客户端访问提示如下错误:
500 OOPS: cannot change directory:/opt/ftp_dir/ftp001
原因是CentOS系统安装了SELinux,因为默认下是没有开启FTP的支持,所以访问时都被阻止了。
查看SELinux设置,命令如下:
getsebool -a|grep ftp
Centos6系列以前的版本在输出的结果中会有如下信息:
ftpd_disable_trans --> off ftp_home_dir-->off
Centos 6系列是没有ftpd_disable_trans的。
通过查看得到,ftp是关掉了。
使用setsebool命令开启,Centos 6不需要执行第一句shell命令:
setsebool ftpd_disable_trans 1 setsebool ftp_home_dir 1
由于操作系统一旦重启后,这种设置需要重新设置,这里使用-P参数实现.
setsebool使用-P参数,无需每次开机都输入这个命令,Centos 6版本不需要执行第一句shell命令:
setsebool -P ftpd_disable_trans 1 setsebool -P ftp_home_dir 1
查看当前状态是否是on的状态,命令如下:
getsebool -a|grep ftp
结果如下:
ftpd_disable_trans –> on
ftp_home_dir–>on
这时候重启 vsftpd 服务器,命令如下:
service vsftpd restart
1.553 Could not create file
一般都是SELinux的问题,设置SELinux的一个值,重启服务器即可。
setsebool -P ftpd_disable_trans 1
service vsftpd restart
还有可能是所设置的目录,FTP账户没有权限访问。我在亲测的过程中就遇到过这样的问题。
2.500 OOPS: bad bool value in config file for: write_enable
注意你的CentOS FTP服务文件中保证每一行最后没有任何空格,一般出错就是在多余的空格上。
打开/etc/selinux/config
将selinux=enforcing 改成permissive 或disabled。
•enforcing强制模式,只要SELinux不允许,就无法执行;
•permissive警告模式,将该事件记录,依然允许执行;
•disabled关闭SELinux;
•停用、启用需要重启计算机;
•使用setenforce切换enforcing与permissive模式不需要重启计算机;
•getenforce及sestatus查看执行模式;
——————————————– vsFTPd 配置选项说明 ——————————————-
在默认的配置文件中,并不会列出所有的配置项。所以,接下来可能会碰到一些在默认配置文件中没出现的配置选项,你可以根据需要自行配置使用。
anonymous_enable=NO
#设定本地用户是否可以访问。注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问。
local_enable=YES
#设定可以进行写操作。
write_enable=YES
#设定上传后文件的权限掩码,默认值是077。
local_umask=022
#匿名用户是否可以上传:YES可以 NO不可以。
anon_upload_enable=NO
#匿名用户是否可以建目录:YES可以 NO不可以。
anon_mkdir_write_enable=NO
#匿名用户其它的写权利(更改权限?)
anon_other_write_enable=NO
#匿名登入者是否允许下载可阅读的档案:YES允许、NO拒绝。
anon_world_readable_only=YES
#所有非匿名登陆的用户名是否被切换成guest_username指定的用户名。
guest_enable=NO
#所有匿名上传的文件的所属用户将会被更改成chown_username
chown_uploads=YES
#匿名上传文件所属用户名
chown_username=lightwiter
#如果启动这项功能,则所有列在chroot_list_file之中的使用者不能更改根目录,一般情况下,我们都不会允许用户更改根目录。
chroot_list_enable=YES
#允许使用"async ABOR"命令,一般不用,容易出问题,最好设置为NO。
async_abor_enable=YES
#是否可用ASCII 模式上传。默认值为NO,即不允许。
ascii_upload_enable=YES
#是否可用ASCII 模式下载。默认值为NO,即不允许。
ascii_download_enable=YES
#定义匿名登入的使用者名称。默认值为ftp。
ftp_username=ftp
#本地用户主目录,当前用户必须具有此目录的操作权限,否则会连接FTP会提示没有权限操作。
local_root=(none)
#空闲连接超时,单位(秒)。
idle_session_timeout=600
#数据传输超时,单位(秒)。即传输超过2分钟即超时断开。如果是上传大文件,请将此值设置得更大一些即可。如:3600秒。
data_connection_timeout=120
#PAVS请求超时。
accept_timeout=60
#PROT模式连接超时。
connect_timeout=60
#开启日记功能。
xferlog_enable=YES
#使用标准格式。
xferlog_std_format=YES
#当xferlog_std_format关闭且本选项开启时,记录所有ftp请求和回复,当调试比较有用。
log_ftp_protocol=NO
#允许使用pasv模式。
pasv_enable=YES
#关闭安全检查。
pasv_promiscuous=NO
#允许使用port模式。
port_enable=YES
#开启tcp_wrappers支持。
tcp_wrappers=YES
#定义PAM 所使用的名称,预设为vsftpd。
pam_service_name=vsftpd
#当服务器运行于最底层时使用的用户名。
nopriv_user=nobody
#是否能使用ls -R命令以防止浪费大量的服务器资源。
ls_recurse_enable=YES
#是否使用单进程模式。
one_process_model=NO
#绑定到listen_port指定的端口,既然都绑定了也就是每时都开着的,就是那个什么standalone模式。
listen=YES
#当使用者登入后使用ls -al 之类的指令查询该档案的管理权时,预设会出现拥有者的UID,而不是该档案拥有者的名称。若是希望出现拥有者的名称,则将此功能开启。
text_userdb_names=NO
#显示目录清单时是用本地时间还是GMT时间,可以通过mdtm命令来达到一样的效果
use_localtime=NO
#测试平台优化
#use_sendfile=YES
#login时显示欢迎信息.如果设置了banner_file则此设置无效。不知道怎么回事,我设置中文会乱码。知道的朋友留言告诉我一下。谢谢!
ftpd_banner=PHP初学者网站欢迎您使用FTP。
#允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
dirmessage_enable=YES
#显示会话状态信息。
setproctitle_enable=YES
#定义不能更改用户主目录的文件。
chroot_list_file=/etc/vsftpd/chroot_list
#定义限制/允许用户登录的文件。
userlist_file=/etc/vsftpd/vsftpd.user_list
#定义登录信息文件的位置。
banner_file=/etc/vsftpd/banner
#禁止使用的匿名用户登陆时作为密码的电子邮件地址。
banned_email_file=/etc/vsftpd.banned_emails
#日志文件位置。
xferlog_file=/var/log/vsftpd.log
#目录信息文件。
message_file=.message
#定义用户配置文件的目录。
user_config_dir=/etc/vsftpd/vuser_conf
#定义本地用户登陆的根目录,注意定义根目录可以是相对路径也可以是绝对路径.相对路径是针对用户家目录来说的。
local_root=/opt/ftp_dir/ftp001
#匿名用户登陆后的根目录。
anon_root=/var/ftp
#可接受的最大client数目。
max_clients=100
#每个ip的最大client数目。
max_per_ip=5
#使用标准的20端口来连接ftp。
connect_from_port_20=YES
#绑定到某个IP,其它IP不能访问。
listen_address=10.0.2.15
#绑定到某个端口。
#listen_port=2121
#数据传输端口。
#ftp_data_port=2020
#pasv连接模式时可以使用port 范围的上界,0 表示任意。默认值为0。
pasv_max_port=0
#pasv连接模式时可以使用port 范围的下界,0 表示任意。默认值为0。
pasv_min_port=0
#匿名用户的传输比率(b/s)。
anon_max_rate=51200
#本地用户的传输比率(b/s)。
local_max_rate=5120000
登陆FTP后,不难发现,我们可以进入用户目录更上层的目录,虽然无法修改读取文件,但是也造成一定的安全问题。我们可以如下设置:
以下两种方法可以实现。
修改 /etc/vsftpd/vsftpd.conf 文件,增加:
1
2
3
|
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
|
这样配置,凡是写在/etc/vsftpd/chroot_list中的用户都是不受限制的用户。
因此我们还需要创建一个空白的文件,否则FTP登陆不上
1
|
touch/etc/vsftpd/chroot_list
|
或
1
|
cat/dev/null>/etc/vsftpd/chroot_list
|
另外还有这样的配置方法:
1
2
3
|
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
|
这样配置, 凡是写在/etc/vsftpd/chroot_list中的用户都是受限制的用户。
chroot_list文件的格式很简单,一行一个用户名。
推荐使用第一种方法。
————————————————————————————————————————————————————————————————————————
以上部分都是转载的,非常详细,按步骤来就可以了,但是你可能会做完上面的任务的时候,ftp依然用不了
我列举自己遇到的几个问题
1.就是你输入密码后,拒绝你的登录,你查看/var/log/vsftpd.log里面什么都没,怎么办呢?你查看/var/log/secure,你会发现“PAM unable to dlopen(/lib64/security/pam_userdb.so): /lib64/security/pam_userdb.so: cannot open shared object file: No such file or directory”因为你根据上面vsftpd 认证文件来设置的 /lib64 可能你的电脑是/lib,你自己查看下就知道了。把这个改好就可以登录了
2.可是你发现登录后你上传不了,ftp报出553 Could not create file.这样的错误
那么你就要改变ftp的用户目录/opt/ftp_dir/ftp001 权限改写“rwxrwxrwx”可能你还要把ftp目录改写成只有ftp001专用 应该是“drwxrwxrwx. 4 ftp001 ftp 4096 11月 21 20:13 ftp001”
可能到这步你还是不能上传,那么这可能还是由于selinux引起的,通过命令 getsebool -a|grep ftpd 查看。
![](http://up.2cto.com/2013/0201/20130201082948237.jpg)
![](http://up.2cto.com/2013/0201/20130201082958200.jpg)
![](http://up.2cto.com/2013/0201/20130201083008162.jpg)
通过这些,应该不会有问题了吧?