shengmvvb

centos配置vsftpd的一些坑

前些天要给服务器安装一个ftp服务,查询了一下网络资料,准备安装vsftpd,简单的说一下安装过程,很多部分内容都是网上搜索来的。

安装

  1. 通过yum来安装vsftpd

    1
    $ yum -y install vsftpd
  2. 设置为开机启动

    1
    $ chkconfig vsftpd on
  3. 进行相关配置,配置修改在/etc/vsftpd/vsftpd.conf里面

    1
    $ vim /etc/vsftpd/vsftpd.conf

配置

安装好服务之后,之后的配置才是重中之重

因为ftp上传的内容是web前端的内容,放在nginx服务器下运行,需要 www(代码运行的用户就是www) 权限,所以我们这边不创建一个新的ftp用户来运行ftp的服务,而是使用虚拟用户

1
2
3
4
5
6
7
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进行认证

虚拟用户配置

以下这些是关于Vsftpd虚拟用户支持的重要CentOSFTP服务配置项目。默认vsftpd.conf中不包含这些设定项目,需要自己手动添加CentOS FTP服务配置。

1
2
3
guest_enable=YES #设定启用虚拟用户功能。
guest_username=www #指定虚拟用户的宿主用户。
user_config_dir=/etc/vsftpd/vuser_conf #设定虚拟用户个人vsftp的CentOS FTP服务文件存放路径。存放虚拟用户个性的CentOS FTP服务文件(配置文件名=虚拟用户名)

用户数据库生成

首先,安装Berkeley DB工具,很多人找不到db_load的问题就是没有安装这个包。

1
$ yum install db4 db4-utils

然后,创建用户密码文本

1
$ vim /etc/vsftpd/vuser_passwd.txt

注意奇行是用户名,偶行是密码

1
2
test
123456

接着,生成虚拟用户认证的db文件

1
$ db_load -T -t hash -f /etc/vsftpd/vuser_passwd.txt /etc/vsftpd/vuser_passwd.db

随后,编辑认证文件

1
$ vim /etc/pam.d/vsftpd

注释掉原来所有语句,再增加以下两句:

1
2
auth required pam_userdb.so db=/etc/vsftpd/vuser_passwd
account required pam_userdb.so db=/etc/vsftpd/vuser_passwd

最后,创建虚拟用户个性CentOS FTP服务文件

1
2
$ mkdir /etc/vsftpd/vuser_conf/
$ vim /etc/vsftpd/vuser_conf/test(注:文件名等于vuser_passwd.txt里面的账户名,否则下面设置无效)

内容如下:

1
2
3
4
5
6
7
local_root=/data/www/html #虚拟用户的根目录(根据实际修改)
write_enable=YES 可写
anon_umask=022 掩码
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

遇到的一些坑

vsftpd:500 OOPS: bad bool value in config file for: anonymous_enable

这种情况一般是参数配置的时候多加了空格,回去好好检查一下 /etc/vsftpd/vsftpd.conf 文件和 /etc/vsftpd/vuser_conf 下的虚拟个人用户配置文件(ps.前后都不能有空格)

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

新版vsftp的chroot设置问题,为了避免一个安全漏洞,从 vsftpd 2.3.5 开始,chroot 目录必须不可写
使用命令:

1
$ chmod a-w /home/user user 为FTP所连接的目录

本人使用如上方法之后仍然没有解决问题,修改之后虽然可以正常连接ftp服务了,但是上传文件仍然报错,估计是权限的写入问题,一番查找之后,终于查找到最终解决方案:

1
$ vim /etc/vsftpd.conf

添加

1
allow_writeable_chroot=YES

保存退出
重启vsftp服务,即可正常登录.

Restarting vsftpd (via systemctl): Job for vsftpd.service failed because the control 的解决办法

刚刚在搭建ftp服务器时,在配置好一切的参数之后,在我重启时,出现了无法启动的错误,将配置文件改了好多次都更改不好,终于在经过一阵查资料后,终于将问题定位了出来
出现错误的原因是:由于centos7中vsftp的配置文件默认将 listen_ipv6=YES 这一行没有注释掉,而我们目前的网络环境还不支持ipv6,从而导致出现错误无法启动,所以解决方法是将 listen_ipv6=YES更改为:listen_ipv6=NO,或将这一行注释掉
按上面的方法注释掉 listen_ipv6=YES后,成功启动vsftp