• Centos 7 最小化部署FTP服务


    部署环境

    操作系统:Centos 7.4

    软件版本:vsftpd 3.0

    服务地址:192.168.1.112

     

    工作原理

    vsftpd工作原理分为主动模式与被动模式

    • 主动模式:用来做数据连接,用来上传或者下载数据,不支持ftp命令;
    • 被动模式:用来做命令连接,用来进行客户端与服务端之间进行命令传递;(包括数据的上传及下载)

     

    主动模式(PORT)原理如下

    1. 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;
    2. 当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了'N'端口,你过来连接我”;
    3. 于是服务器从20数据端口向客户端的'N'端口发送连接请求,建立一条数据链路来传送数据。

     

    被动模式(PASV)原理如下:

    1. 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
    2. 当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了'N'端口,你过来连接我”。
    3. 于是客户端向服务器的'N'端口发送连接请求,建立一条数据链路来传送数据。

     

    主动模式与本地用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

     

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

      

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

    4、安装程序

    sh-4.2# yum -y install vsftpd

      

    5、配置程序

    sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    sh-4.2# vi /etc/vsftpd/vsftpd.conf    # 将主配置文件中内容替换成如下内容
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    local_umask=022
    reverse_lookup_enable=NO
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    pasv_enable=NO
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    sh-4.2# useradd -s /sbin/nologin -d /test test
    sh-4.2# echo 'password' | passwd --stdin test

     

    6、启动测试

    sh-4.2# systemctl start vsftpd
    sh-4.2# systemctl enable vsftpd

     

    注解:因为这里是用主动模式,只能进行上传下载,并且不支持被动命令;我这里采用windows 下面的filezlia客户端进行测试;filezlia下载地址:https://filezilla-project.org/download.php?type=client

     

    主动模式与匿名用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

      

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

     

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

    4、安装程序

    sh-4.2# yum -y install vsftpd

     

    5、配置程序

    sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    sh-4.2# vi /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    reverse_lookup_enable=NO
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES  # 匿名登录不能关闭被动模式,即时是主动模式的情况下面;
    #pasv_enable=NO
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    
    sh-4.2# usermod -d /appl/ftp/pub/ ftp    # 匿名用户通过ftp用户来设置
    sh-4.2# mkdir -p /appl/ftp/pub/          # 匿名用户的家目录需要手动创建
    sh-4.2# chown -R ftp.ftp /appl/ftp/pub/  # 手动授权
    sh-4.2# chmod -R a-w /appl/ftp/pub/      # 匿名用户登录,不能设置写入权限
    sh-4.2# useradd -s /sbin/nologin -d /test test    # 匿名用户与本地用户可以同时使用
    sh-4.2# echo 'password' | passwd --stdin test

      

    6、启动测试

    sh-4.2# systemctl start vsftpd.service
    sh-4.2# touch /appl/ftp/pub/test
    sh-4.2# chown -R ftp.ftp /appl/

     

     

    被动模式与本地用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

     

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

     

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

    4、安装程序

    sh-4.2# yum -y install vsftpd

     

    5、配置程序

    sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    sh-4.2# vi /etc/vsftpd/vsftpd.conf
    reverse_lookup_enable=NO
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=NO
    pasv_enable=YES
    pasv_min_port=1024
    pasv_max_port=65536
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    
    sh-4.2# useradd -s /sbin/nologin -d /test test
    sh-4.2# echo 'password' | passwd --stdin test

     

    6、启动测试

    sh-4.2# systemctl start vsftpd.service

     

    被动模式与匿名用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

      

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

     

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

    4、安装程序

    sh-4.2# yum -y install vsftpd

     

    5、配置程序

    sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
    sh-4.2# vi /etc/vsftpd/vsftpd.conf
    reverse_lookup_enable=NO
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    chroot_local_user=YES
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd/chroot_list
    allow_writeable_chroot=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=NO
    pasv_enable=YES
    pasv_min_port=1024
    pasv_max_port=65536
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    
    sh-4.2# usermod -d /appl/ftp/pub/ ftp
    sh-4.2# mkdir -p /appl/ftp/pub/
    sh-4.2# chown -R ftp.ftp /appl/ftp/pub/
    sh-4.2# chmod -R a-w /appl/ftp/pub/
    sh-4.2# useradd -s /sbin/nologin -d /test test
    sh-4.2# echo 'password' | passwd --stdin test

     

    6、启动测试

    sh-4.2# systemctl restart vsftpd.service

     

    主动模式与虚拟用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

      

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

     

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

    4、安装程序

    sh-4.2# yum -y install vsftpd pam* libdb-utils libdb*
    vsftpd:    FTP服务程序
    libdb:     虚拟用户生成程序
    pam:       虚拟用户验证模块

     

    5、配置程序

    sh-4.2# vi /etc/vsftpd/vsftpd
    sh-4.2# cat /etc/vsftpd/vsftpd    
    admin
    admin
    # /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码
    
    
    sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db
    # /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠
    
    sh-4.2# vi  /etc/pam.d/vsftpd
    sh-4.2# cat /etc/pam.d/vsftpd 
    #%PAM-1.0
    auth       sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
    account    sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
    session    optional     pam_keyinit.so    force revoke
    auth       required        pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth       required        pam_shells.so
    auth       include        password-auth
    account    include        password-auth
    session    required     pam_loginuid.so
    session    include        password-auth
    # /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置
    
    sh-4.2# useradd -s /sbin/nologin -M xiao
    
    sh-4.2# vi /etc/vsftpd/vsftpd.conf
    sh-4.2# cat /etc/vsftpd/vsftpd.conf
    reverse_lookup_enable=NO
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    pasv_enable=NO
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    chroot_local_user=YES
    allow_writeable_chroot=YES
    guest_enable=YES
    guest_username=xiao
    virtual_use_local_privs=YES
    user_config_dir=/etc/vsftpd/vsftpd_user_conf
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf    # 目录用来控制虚拟用户的权限及家目录
    sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin
    sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin 
    local_root=/ftp/admin
    write_enable=YES
    anon_world_readable_only=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    
    sh-4.2# mkdir -p /ftp/admin
    sh-4.2# chown -R xiao.xiao /ftp/
    sh-4.2# usermod -d /ftp/ xiao
    # 所有虚拟用户都需要一个本地用户进行映射

     

    6、启动测试

    sh-4.2# systemctl restart vsftpd.service

     

    被动模式与虚拟用户

    1、关闭selinux

    sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config 
    sh-4.2# reboot    # 一定要重启,已经不知道第几次在这个玩意上吃亏了

     

    2、卸载防火墙

    sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps
    sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps

      

    3、配置本地源

    sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/
    sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ;
    sh-4.2# cat /etc/yum.repos.d/GuGe.repo 
    [GuGe]
    name=GuGe
    baseurl=file:///media
    gpgcheck=0
    enable=1
    
    sh-4.2# yum clean all
    sh-4.2# yum makecache all

     

     4、安装程序

    sh-4.2# yum -y install vsftpd pam* libdb-utils libdb*
    vsftpd:    FTP服务程序
    libdb:     虚拟用户生成程序
    pam:       虚拟用户验证模块

     

    5、配置程序

    sh-4.2# vi /etc/vsftpd/vsftpd
    sh-4.2# cat /etc/vsftpd/vsftpd    
    admin
    admin
    # /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码
    
    
    sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db
    # /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠
    
    sh-4.2# vi  /etc/pam.d/vsftpd
    sh-4.2# cat /etc/pam.d/vsftpd 
    #%PAM-1.0
    auth       sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
    account    sufficient   /lib64/security/pam_userdb.so     db=/etc/vsftpd/vsftpd_login    # 被加行
    session    optional     pam_keyinit.so    force revoke
    auth       required        pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    auth       required        pam_shells.so
    auth       include        password-auth
    account    include        password-auth
    session    required     pam_loginuid.so
    session    include        password-auth
    # /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置
    
    sh-4.2# useradd -s /sbin/nologin -M xiao
    
    sh-4.2# vi /etc/vsftpd/vsftpd.conf
    sh-4.2# cat /etc/vsftpd/vsftpd.conf
    reverse_lookup_enable=NO
    anonymous_enable=NO
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=NO
    pasv_enable=YES
    pasv_min_port=1024
    pasv_max_port=1028
    xferlog_std_format=YES
    listen=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    chroot_local_user=YES
    allow_writeable_chroot=YES
    guest_enable=YES
    guest_username=xiao
    virtual_use_local_privs=YES
    user_config_dir=/etc/vsftpd/vsftpd_user_conf
    
    
    sh-4.2# touch /etc/vsftpd/chroot_list
    sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf    # 目录用来控制虚拟用户的权限及家目录
    sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin
    sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin 
    local_root=/ftp/admin
    write_enable=YES
    anon_world_readable_only=YES
    anon_upload_enable=YES
    anon_mkdir_write_enable=YES
    anon_other_write_enable=YES
    
    sh-4.2# mkdir -p /ftp/admin
    sh-4.2# chown -R xiao.xiao /ftp/
    sh-4.2# usermod -d /ftp/ xiao
    # 所有虚拟用户都需要一个本地用户进行映射

     

    6、启动测试

    sh-4.2# systemctl restart vsftpd.service

     

     

    经典错误

    错误一:530 Login incorrect

    通过查看/var/logs/secure发现有如下面的错误:

    pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/vsftpd_login.db': No such file or directory

      到/etc/vsftpd查看下加密过的认证文件,发现为vsftpd.login.db ,错把 "_" 写成了点 ,重命名该文件,问题解决。不过该问题还有可能是因为/etc/vsftpd.conf中没有加入pam_service_name=vsftpd 或 /etc/pam.d/vsftpd文件认证配置不正确引起的,需要在该文件后加入下面的两行。

    auth    required        /lib64/security/pam_userdb.so   db=/etc/vsftpd/vsftpd_login
    account required        /lib64/security/pam_userdb.so   db=/etc/vsftpd/vsftpd_login

    :如果是32位系统,上面的lib64需要换成lib ,最后的认证文件vsftpd_login后面没有".db" ,系统会自动增加的 。如果加上 ".db" 将会出错 。还可以参考这篇文档:https://www.jianshu.com/p/91c7d4a115e0 

     

    错误二:500 OOPS: cannot change directory错误 。

    selinux未关闭

    参考文档:http://www.361way.com/ftp-error/1832.html

    错误三:530 pam_unix(vsftpd:auth): check pass; user unknown

    pam_unix(vsftpd:auth): check pass; user unknown
    pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=anonymous rhost=192.168.10.138
    具体报错信息

    上述内容中明显可以看到是pam验证密码失败了,530基本基本就是密码验证失败的意思,解决办法如下:

    vi  /etc/pam.d/vsftpd
    ession    optional     pam_keyinit.so    force revoke
    auth       required     pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
    #auth       required    pam_shells.so
    # 上面这一行原本是没有注释的,解决的办法就是注释掉这一行
    auth       include      password-auth
    account    include      password-auth
    session    required     pam_loginuid.so
    session    include      password-auth

    这个问题是Centos 7.4以上版本才会出现的,应该是因为vsftpd版本与Centos 7.4以上版本的模块不兼容的原因导致的

    参考文档来自于谷歌搜索:https://www.4spaces.org/ftp-login-error-530-solved/

    错误四:完事具备,就是不行

    试试用明文

    相关日志

    /var/log/xferlog:上传下载日志

    /var/log/secure:验证日志

    /var/log/message:启动运行日志

     

    相关命令

    登录ftp

    sh-4.2# ftp 192.168.21.49
    Connected to 192.168.21.49 (192.168.21.49).
    220 (vsFTPd 3.0.2)
    Name (192.168.21.49:root): Technical
    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 (192,168,21,49,187,163).
    150 Here comes the directory listing.-rw-r--r--    1 1001     1001           21 Jul 16 10:29 readme
    drwxr-xr-x   19 1001     1001         4096 Nov 26 07:22 tm
    ... 226 Directory send OK.

    切换ftp目录

    ftp> cd tm
    250 Directory successfully changed.

    切换ftp本地接收目录

    ftp> lcd /tmp
    Local directory now /tmp

    下载文件

    ftp> get 账户口令台账.xlsx
    local: 账户口令台账.xlsx remote: 账户口令台账.xlsx
    227 Entering Passive Mode (192,168,21,49,78,254).
    150 Opening BINARY mode data connection for 账户口令台账.xlsx (16577 bytes).
    226 Transfer complete.
    16577 bytes received in 0.000662 secs (25040.79 Kbytes/sec)

    多个下载文件

    mget *.xls
    # 我打算下载所有以 .xls 结尾的文件,mget支持通配符

    上传文件

    ftp> put aaa
    local: aaa remote: aaa
    227 Entering Passive Mode (192,168,21,49,135,102).
    150 Ok to send data.
    226 Transfer complete.
    8 bytes sent in 2.9e-05 secs (275.86 Kbytes/sec)

    上传多个文件

    mput *.xls

    关闭连接

    bye
    exit
    quit
    # 这三种都可以安全关闭连接

    配置详解

  • 相关阅读:
    HTTP网页错误代码大全带解释
    记录一下手把手教您做电商网站
    C#中的Attribute
    C#中dynamic的正确用法
    【CSP】最大的矩形
    【CSP】字符与int
    C++数组初始化
    C++中输出字符到文本文档
    C++ 中时钟函数的使用
    各种函数的头文件
  • 原文地址:https://www.cnblogs.com/guge-94/p/10497089.html
Copyright © 2020-2023  润新知