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

image.png


打开传输速率的限制: local_max_rate=0


image.png



注意 :最重要的查看     # man vsftpd.conf