红联Linux门户
Linux帮助

CentOS 6.4安装vsftpd

发布时间:2015-04-02 22:19:59来源:linux网站作者:zyx1990zm

Vsftpd原理

vsftpd是linux发行版中的一款ftp服务器程序,它的全称是“very secure ftp daemon”,号称是最安全的ftp服务器。它工作在21,20号端口,主要提供文件传输服务,可以跨越网络提供服务,非常好用。

本文主要内容:
一,ftp的工作原理:
二,vsftpd的配置文件:
三,vsftpd的安装
四,vsftpd的启动与关闭:
五,vsftpd的配置文件/etc/vsftpd/vsftpd.conf解析:
六,用tcp_wraper来控制vsftpd:
七,创建ftp虚拟用户
八,启用ssl,建立安全的传输


一,ftp的工作原理:
ftp的两种工作模式:
1,主动模式
工作原理:客户端从一个任意的非特权端口(大于1024)N连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并发送FTP 命令“portN+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)
2,被动模式
工作原理:当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(大于1024)N和N+1。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会 提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(大于1024)P ,并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据

主动模式与被动模式的比较:
主动FTP对FTP服务器的管理和安全很有利,但对客户端的管理不利,因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端 的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。目前,ftp服务器一般工作在被动模式。

Last login: Wed Sep 11 19:46:41 2013 from192.168.2.2

[root@linux ~]# rpm -qa | grep vsftpd

[root@linux ~]# yum -y install vsftpddb4-devel db4 db4-utils pam-devel pam pam_pkcs11 ftp

[root@linux ~]# service vsftpd start

为 vsftpd 启动 vsftpd:[确定]

[root@linux ~]# chkconfig vsftpd on

第二步:配置vsftpd服务的宿主
#useradd vsftpdadmin -s /sbin/nologin
这个vsftpdadmin只是用来替换root的,并不需要登录

第三步:建立ftp虚拟宿主帐户
#useradd ftpuser-s /sbin/nologin
这ftpuser只个虚拟帐户的宿主,本身是不用登录的

[root@linux ~]# cp -rf /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak //备份一下,就算最后vsftpd搭建坏了,也可以恢复

[root@linux ~]# grep -v "#"/etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf//去除#号重定向到/etc/vsftpd/vsftpd.conf文件中。

注:筛选目录一定和重定向目录不能相同,否则里面是空的。

[root@linux ~]# cat /etc/vsftpd/vsftpd.conf

anonymous_enable=YES//允许匿名访问

local_enable=YES//允许本地用户访问,默认就是YES,不用改

write_enable=YES//允许写入,默认是YES,不用改

local_umask=022//上传后文件的权限掩码,不用改

dirmessage_enable=YES//开启目录标语,默认是YES,开不开无所谓,我是默认就行

xferlog_enable=YES//开启日志,默认是YES,不用改

xferlog_file=/var/log/vsftpd.log//设定vsftpd的服务日志保存路径。注意,该文件默认不存在。必须要手动touch出来

connect_from_port_20=YES//设定连接端口20

xferlog_std_format=YES//设定vsftpd的服务日志保存路径,不用改

listen=YES//如果设置为YES,则vsftpd将以独立模式运行,由vsftpd 自己监听和处理连接请求

local_root=/var/ftp 锁定ftp访问目录

pam_service_name=vsftpd//PAM认证文件名。PAM将根据/etc/pam.d/vsftpd进行认证

userlist_enable=YES//拒绝登录用户名单,不用改

tcp_wrappers=YES//限制主机对VSFTP服务器的访问,不用改(通过/etc/hosts.deny和/etc/hosts.allow这两个文件来配置)

以上除了日志那项外都是系统默认存在的

chroot_list_enable=YES//不允许FTP用户离开自己主目录,默认是被注释掉的。

chroot_list_file=/etc/vsftpd/chroot_list//如果开启了chroot_list_enable=YES,那么一定要开启这个,这条是锁定登录用户只能家目录的位置,如果不开启用户登录时就会报500 OOPS的错。

注意:/etc/vsftp/chroot_list

本身是不存在的,这要建立vim/etc/vsftp/chroot_list,然后将帐户输入一行一个,保存就可以了

[root@linux etc]# vi /etc/vsftpd/chroot_list

virtual

这步如果不写的话,会报500 OOPS: could notread chroot() list file:/etc/vsftpd/chroot_list

idle_session_timeout=600//会话超时,客户端连接到ftp但未操作,默认被注释掉,可根据个人情况修改

#async_abor_enable=YES//支持异步传输功能,默认是注释掉的

#ascii_upload_enable=YES//支持ASCII模式的下载功能,默认是注释掉的

#ascii_download_enable=YES//支持ASCII模式的上传功能,默认是注释掉的

#ftpd_banner=Welcometo blah FTP service//FTP的登录欢迎语,本身是被注释掉的,去不去都行

#chroot_local_user=YES//禁止本地用户登出自己的FTP主目录,本身被注释掉

以上都是配置文件里有,但都是被注释掉的……

还可以增加:

guest_enable=YES //设定启用虚拟用户功能。
guest_username=ftpuser //指定虚拟用户的宿主用户。
virtual_use_local_privs=YES //设定虚拟用户的权限符合他们的宿主用户。
user_config_dir=/etc/vsftpd/vconf //设定虚拟用户个人Vsftp的配置文件存放路径

建立日志文件
#touch /var/log/vsftpd.log //日志文件
#chown vsftpdadmin.vsftpdadmin /var/log/vsftpd.log //属于vsftpdadmin这个宿主

第六步:建立虚拟用户文件
#mkdir /etc/vsftpd/vconf/
#touch /etc/vsftpd/vconf/vir_user

第七步:建立虚拟用户
#vim/etc/vsftpd/vconf/vir_user
virtualuser //用户名
123456 //密码

注意:第一行用户名,第二行是上一行用户名的密码,其他人的以此类推

第八步:生成数据库
#db_load -T -t hash -f /etc/vsftpd/vconf/vir_user/etc/vsftpd/vconf/vir_user.db

第九步:设置数据库文件的访问权限
#chmod 600 /etc/vsftpd/vconf/vir_user.db
#chmod 600 /etc/vsftpd/vconf/vir_user

第十步:修改/etc/pam.d/vsftpd内容
authrequired/lib/security/pam_userdb.so db=/etc/vsftpd/vconf/vir_user

account required/lib/security/pam_userdb.so db=/etc/vsftpd/vconf/vir_user

第十步:创建用户的配置文件
注意:用户配置文件的名字要和创建的“虚拟用户”名字对应
#touch/etc/vsftpd/vconf/virtualuser
#vim /etc/vsftpd/vconf/virtualuser
输入:
local_root=/home/virtualuser //虚拟用户的个人目录路径
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=1048576 //本地用户的最大传输速度,单位是Byts/s,我设定的是10M

第十一步:建立虚拟用户目录
如果不建立虚拟用户的个人目录,那么所有的虚拟用户登录后所在的目录都是同一个目录下
# mkdir /home/virtualuser
# chown ftpuser.ftpuser ./virtualuser
# chmod 600 /home/virtualuser
配置就此完成,如果想增加新的用户,只要按照上面的第七步、第十步进行就可以了。

注意:我的selinux是关闭的……

重起


FTP 数字代码的意义

110 重新启动标记应答。

120 服务在多久时间内ready。

125 数据链路埠开启,准备传送。

150 文件状态正常,开启数据连接端口。

200 命令执行成功。

202 命令执行失败。

211 系统状态或是系统求助响应。

212 目录的状态。

213 文件的状态。

214 求助的讯息。

215 名称系统类型。

220 新的联机服务ready。

221 服务的控制连接埠关闭,可以注销。

225 数据连结开启,但无传输动作。

226 关闭数据连接端口,请求的文件操作成功。

227 进入passive mode。

230 使用者登入。

250 请求的文件操作完成。

257 显示目前的路径名称。

331 用户名称正确,需要密码。

332 登入时需要账号信息。

350 请求的操作需要进一部的命令。

421 无法提供服务,关闭控制连结。

425 无法开启数据链路。

426 关闭联机,终止传输。

450 请求的操作未执行。

451 命令终止:有本地的错误。

452 未执行命令:磁盘空间不足。

500 格式错误,无法识别命令。

501 参数语法错误。

502 命令执行失败。

503 命令顺序错误。

504 命令所接的参数不正确。

530 未登入。

532 储存文件需要账户登入。

550 未执行请求的操作。

551 请求的命令终止,类型未知。

552 请求的文件终止,储存位溢出。

553 未执行请求的的命令,名称不正确。


常见FTP命令及其功能
 

FTP命令

功能

FTP命令

功能

ls

显示服务器上的目录

ls [remote-dir][local-file]

显示远程目录remote-dir,并存入本地文件local-file

get remote-file [local-file]

从服务器下载指定文件到客户端

mget remote-files

下载多个远程文件(mget命令允许用通配符下载多个文件)

put local-file [remote-file]

从客户端上传指定文件到服务器

mput local-file

将多个文件上传至远程主机(mput命令允许用通配符上传多个文件)

open

连接FTP服务器

mdelete [remote-file]

删除远程主机文件

close

中断与远程服务器的ftp会话(与open对应)

mkdir dir-name

在远程主机中创建目录

open host[port]

建立指定的ftp服务器连接,可指定连接端口

newer file-name

如果远程主机中file-name的修改时间比本地硬盘同名文件的时间更近,则重传该文件

cd directory

改变服务器的工作目录

rename [from][to]

更改远程主机的文件名

lcd directory

在客户端上(本地)改变工作目录

pwd

显示远程主机的当前工作目录

bye

退出FTP命令状态

quit

同bye,退出ftp会话

ascii

设置文件传输方式为ASCII模式

reget remote-file [local-file]

类似于get,但若local-file存在,则从上次传输中断处续传

binary

设置文件传输方式为二进制模式

rhelp [cmd-name]

请求获得远程主机的帮助

![cmd [args]]

在本地主机中交互shell后退回到ftp环境,如:!ls *.zip

rstatus [file-name]

若未指定文件名,则显示远程主机的状态,否则显示文件状态

accout [password]

提供登录远程系统成功后访问系统资源所需的密码

hash

每传输1024字节,显示一个hash符号(#)

append local-file [remote-file]

将本地文件追加到远程系统主机,若未指定远程系统文件名,则使用本地文件名

restart marker

从指定的标志marker处,重新开始get或put,如restart 130

bye

退出ftp会话过程

rmdir dir-name

删除远程主机目录

case

在使用mget命令时,将远程主机文件名中的大写转为小写字母

size file-name

显示远程主机文件大小,如:
size idle 7200

cd remote-dir

进入远程主机目录

status

显示当前ftp状态

cdup

进入远程主机目录的父目录

system

显示远程主机的操作系统

delete remote-file

删除远程主机文件

user user-name [password][account]

向远程主机表明自己的身份,需要密码时,必须输入密码,如:user anonymous my@email

dir [remote-dir][local-file]

显示远程主机目录,并将结果存入本地文件

help [cmd]

显示ftp内部命令cmd的帮助信息,如help get


常见错误:

1.500 OOPS: vsftpd: refusing to run withwritable anonymous root

vsftpd是对安全性要求较高的ftp server,所以不允许匿名写ftp主目录。基本是因为对ftp的主目录执行过chmod 777导致。所以,再用chmod命令改变权限即可,一般chmod 750就可以,亦或解决的方法是: chown root ftp; chmod -w ftp 。如果想创建一个允许匿名访问可读写的,就在主目录下再创建一个文件夹,设置成777的权限,修改vsftpd.conf就ok了。

2.ftp:connect:链接被拒绝

原因:服务没启动

解决:chkconfig vsftpd on

3.could not open chroot() listfile:/etc/vsftpd.chroot_lis

这个问题挺简单,纯属我没有好好动脑,对vsftpd.conf中的个别选项没有比较清楚的理解导致……解决办法把chroot_list_enable=YES 改成no或者comment掉就可以。

4.530 permission denied

Login failed

原因:“/etc/vsftpd.user_list” 文件中不存在当前登录用户

解决:echo virtual >> /etc/vsftpd/virtual_user

5.530 Login incorrect

login incorrect

原因:你的CentOS是64位,所以要在pam的那个位置把lib改成lib64

auth required /lib/security/pam_userdb.so db=/etc/vsftpd/ftpusr

account required /lib/security/pam_userdb.so db=/etc/vsftpd/ftpusr

改为:

auth required pam_userdb.so db=/etc/vsftpd/ftpusr

account required pam_userdb.so db=/etc/vsftpd/ftpusr

5.500 00PS:unrecognized variable in configfile

Connection closed by remote host

原因:参数前有空格

解决:将参数前空格删除