CentOS7环境搭建部署 vsftpd 并实现虚拟用户登录ftp(修订版)
准备环境:
# 查看是否已安装 方法一
[root@localhost ~]# rpm -q vsftpd
vsftpd-3.0.2-21.el7.x86_64
# 查看是否已安装 方法二
[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2
# 安装 vsftpd
[root@localhost ~]# yum -y install vsftpd
关闭firewall和SELinux
setenforce 0 # 设置SELinux 成为permissive模式 (关闭SELinux)
setenforce 1 # 设置SELinux 成为enforcing模式 (开启SELinux)
# 或者修改配置
vi /etc/selinux/config
修改:
SELINUX=enforcing
改为:
SELINUX=disabled
#停止firewall:
systemctl stop firewalld.service
#禁止firewall开机启动:
systemctl disable firewalld.service
如果你不愿意关闭防火墙,需要防火墙添加FTP服务。
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd --reload
启动vsftpd服务
systemctl start vsftpd.service
开始配置:
1、创建虚拟用户对应的系统用户:
# useradd virftp -s /sbin/nologin
2、创建虚拟用户存放用户名密码文件:
# vim /etc/vsftpd/vusers.list (一行用户名,一行密码,交替写入)
test #用户
123456 #密码
3、将 vusers.list 这个文件生成一个 vsftpd 这个服务能识别的一个二进制的库文件:
#安装db4工具
# yum installdb4 –y
# db_load -T -t hash -f /etc/vsftpd/vusers.list /etc/vsftpd/vusers.db
然后更改其权限:
# chmod 600 vusers.* #修改权限,保证密码文件安全
4、创建虚拟用户:
(1)创建一个虚拟用户配置文件存放的一个目录:
# mkdir /etc/vsftpd/vsftpd_user_conf
(2)进入到这个目录下进行配置文件的创建:
# cd /etc/vsftpd/vsftpd_user_conf
(3)创建一个跟第2步配置文件中用户名同名的一个配置文件:
# vim test
写入内容:
local_root=/home/virftp/test
anonymous_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=50000
注意:配置文件每行后不要有空格
(4)既然在上面配置文件中我们有限制test的家目录到/home/vsftpd/test下,我们自然要去创建这个目录:
# mkdir /home/virftp/test1
然后更改其属主以及属组为我们的系统用户:
# chown -R virftp:virftp /home/virftp/test
修改权限:
# chmod +rx /home/virftp
(5)当我们限定了用户不能跳出其主目录之后,使用该用户登录FTP时往往会遇到这个错误:
500 OOPS: vsftpd: refusing to run with writable root inside chroot ()
这个问题发生在最新的这是由于下面的更新造成的:
- Add stronger checks for the configuration error of running with a writeable root directory inside a chroot(). This may bite people who carelessly turned on chroot_local_user but such is life.
从2.3.5之后,vsftpd增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。
要修复这个错误,可以用命令# chmod a-w /home/virftp/test 去除用户主目录的写权限,注意把目录替换成你自己的。或者你可以在vsftpd的配置文件中增加一项: allow_writeable_chroot=YES
(6) 可选:设置文件的acl
# setfacl -m u:virftp :rwx /home/virftp/test
(7)编辑vsftpd认证相关配置文件:(告诉配置文件你得用哪种方式去认证,要不然会用系统默认的用户名和密码,现在我们要用虚拟用户的来认证,这时候就需要告诉配置文件他的这些密码库文件这些在哪里,要去用它)
# vim /etc/pam.d/vsftpd
注意: 在最上面添加两行:
# cat /etc/pam.d/vsftpd
#%PAM-1.0
auth sufficient pam_userdb.so db=/etc/vsftpd/vusers
account sufficient pam_userdb.so db=/etc/vsftpd/vusers
保存之前要先确认下 pam_userdb.so 这个文件存在不存在(因为这个关系到系统是32位还是64位的问题,64位操作系统的话是存放在/lib64/security/pam_userdb.so,可以用uname -a查看系统是多少位的操作系统)
(8)编辑vsftpd的配置文件:
# vim /etc/vsftpd/vsftpd.conf
(将一些关于匿名用户信息行的选项打开并将其改成NO;注:local_enable=YES这一行就是默认的YES别去改)
并在配置文件最底下添加一些配置信息:
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
(9)配置文件示例:
[root@localhost vsftpd]# grep -v ^# vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
dirmessage_enable=YES
xferlog_enable=YES
dual_log_enable=YES
vsftpd_log_file=/var/log/vsftpd.log
use_localtime=YES
connect_from_port_20=YES
xferlog_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd #设置 PAM 外挂模块提供的认证服务所使用的配置文件名
userlist_enable=YES
tcp_wrappers=YES
guest_enable=YES #开启虚拟用户
guest_username=virftp #指定虚拟用户映射的系统用户
virtual_use_local_privs=YES #虚拟用户和本地用户有相同的权限;
user_config_dir=/etc/vsftpd/vsftpd_user_conf #不同的虚拟用户创建独立的配置文件分别管理
(10)重启vsftpd服务:
# systemctl restart vsftpd.service
5、接下来就是登陆测试了
[root@localhost vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): test
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,117,249).
150 Here comes the directory listing.
drwxr-xr-x 3 1001 1001 32 Apr 20 15:33 test.txt
226 Directory send OK.
ftp>
6、错误排查
用户登陆失败 可以查看日志: [root@localhost log]# tail -f /var/log/secure
其他问题可以查看 这个日志: [root@localhost log]# tail -f /var/log/vsftpd.log
文件上传下载问题查看日志: [root@localhost log]# tail -f /var/log/xferlog
7.问题一:ftp上传中文文件名乱码
查看是否有中文语言包
# locale
若没有zh_CN.UTF-8相关内容,说明没有安装语言包 安装下:
# yum groupinstall chinese-support
有了中文语言包还不行,需要设置
# vim /etc/sysconfig/i18n
然后添加
LANG="zh_CN.UTF-8"
LC_ALL="zh_CN.UTF-8"
# source /etc/sysconfig/i18n
然后修改本地文字
# vim /etc/locale.conf
LANG="zh_CN.UTF-8"
或者
# echo "LANG="zh_CN.UTF-8"" > /etc/locale.conf
8.问题二:用户不能删除 ftp 上面的文件 的配置方法
在虚拟用户的配置文件中加入 /etc/vsftpd/vsftpd_user_conf/test
cmds_denied=DELE
选项参考文档: https://wiki.archlinux.org/index.php/Very_Secure_FTP_Daemon
9.问题三 vsftp 的windows 客户端 上传文件慢
关掉ip反解域名 reverse_lookup_enable=NO
打开传输速率的限制: local_max_rate=0
注意 :最重要的查看 # man vsftpd.conf
转载于:https://blog.51cto.com/wangqh/1886562