1.简介

FTP,File Transfer Protocol,文件传输协议,基于该协议FTP客户端与服务端可以实现共享文件、上传文件、下载文件。FTP基于C/S模式,FTP客户端与服务器端有两种传输模式,分别是FTP主动模式、FTP被动模式,主被动模式均是以FTP服务器端为参照。

2.FTP两种传输模式

1)FTP主动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器,FTP服务器以数据端口(20)连接到客户端指定的数据端口(N+1)。
2)FTP被动模式:客户端从一个任意的端口N(N>1024)连接到FTP服务器的port 21命令端口,客户端开始监听端口N+1,客户端提交PASV命令,服务器会开启一个任意的端口(P >1024),并发送PORT P命令给客户端。客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。
注意

  • centos 7默认是没有开启FTP服务的,必须手动开启。
  • 安装服务修改配置文件之后,需要重启服务,使配置生效。

    3.安装vsftpd

    1. rpm -qa |grep vsftpd
    2. yum list installed|grep vsftpd
    以上查询均无任何信息,说明vsftpd没有安装。现在通过命令“yum -y install vsftpd”直接在线安装,需要联网才可以正常进行,命令中的“-y”表示不用输入确定,直接一路安装到底。
    1. yum -y install vsftpd
    image.png

    4.设置开机启动vsftpd

    1. systemctl enable vsftpd.service
    image.png

    5.启动vsftpd

    1. systemctl start vsftpd.service

    6.查看ftp是否启动

    1. ps -e |grep ftp
    2. systemctl status vsftpd.service
    image.png

    7.开启防火墙,开放21端口

    1. firewall-cmd --permanent --zone=public --add-port=21/tcp
    2. firewall-cmd --permanent --zone=public --add-service=ftp
    3. firewall-cmd --reload
    4. firewall-cmd --list-all
    启动、关闭、重启防火墙
    1. # 1.启动防火墙
    2. systemctl start firewalld
    3. # 2.禁用防火墙
    4. systemctl stop firewalld
    5. # 3.设置开机启动
    6. systemctl enable firewalld
    7. # 4.停止并禁用开机启动
    8. sytemctl disable firewalld
    9. # 5.重启防火墙
    10. firewall-cmd --reload
    image.png
    特别说明:
    如果是云服务器,需要再云服务器安全策略中开启端口。
    image.png

    8.安装vsftpd虚拟用户需要的软件和认证模块

    1. yum -y install pam* libdb-utils libdb* skip-broken

    9.创建虚拟用户临时文件

    1. vi /etc/vsftpd/ftpusers.txt
    添加如下内容:
    文件中奇数行为用户名,偶数行为上一行用户对应的密码。
    1. vsuser01
    2. 123456
    3. vsuser02
    4. 123456
    5. vsuser03
    6. 123456

    10.生成虚拟用户数据认证文件

    1. db_load -T -t hash -f /etc/vsftpd/ftpusers.txt /etc/vsftpd/login.db

    11.设置认证文件的权限为755

    1. chmod 755 /etc/vsftpd/login.db

    12.配置pam认证文件

    1. vi /etc/pam.d/vsftpd
    在文件中注释掉原来的内容,然后加入下面两行内容:
    1. auth required pam_userdb.so db=/etc/vsftpd/login
    2. account required pam_userdb.so db=/etc/vsftpd/login
    image.png

    13.新建一个系统用户(ftpuser)作为虚拟用户的映射,这个用户不用密码、登录

    1. useradd ftpuser -s /sbin/nologin

    14.创建虚拟用户配置文件所放置的目录

    1. mkdir -p /etc/vsftpd/user_conf

    15.设置vsftpd配置文件

    1. vi /etc/vsftpd/vsftpd.conf
    在配置文件中将“anonymous_enable=YES”改为:
    1. anonymous_enable=NO
    2. listen=YES
    将“listen_ipv6=YES”改为:
    1. listen_ipv6=NO
    在文件末尾加入以下内容:
    1. # 启用虚拟用户
    2. guest_enable=YES
    3. # 映射虚拟用户到系统用ftpuser
    4. guest_username=ftpuser
    5. # 设置虚拟用户配置文件所在的目录
    6. user_config_dir=/etc/vsftpd/user_conf

    虚拟用户拥有本地用户的权限将“xferlog_file=/var/log/xferlog”之前的“#”删除;并修改以下内容:

    1. virtual_use_local_privs=YES
    2. # 锁定用户目录
    3. chroot_local_user=YES
    4. # 禁止用户列表功能virtual_use_local_privs=YES
    5. # 锁定用户目录
    6. chroot_local_user=YES
    7. chroot_list_enable=YES
    8. chroot_list_file=/etc/vsftpd/chroot_list
    9. allow_writeable_chroot=YES
    建立根目录锁定的帐户文件
    1. touch /etc/vsftpd/chroot_list

    16.为每个虚拟用户创建配置文件

    创建第一个虚拟用户
    1. vi /etc/vsftpd/user_conf/vsuser01
    加入内容为:
    1. # 虚拟用户家目录路径
    2. local_root=/home/ftpuser/vsuser01
    3. # 允许虚拟用户有写得权限
    4. write_enable=YES
    5. # 允许匿名用户可以下载和读取的权限
    6. anon_world_readable_only=YES
    7. # 允许匿名用户有上传文件权限,在write_enable=YES时有效
    8. anon_upload_enable=YES
    9. # 允许匿名用户有创建目录权限write_enable=YES时有效
    10. anon_mkdir_write_enable=YES
    11. # 允许匿名用户有其他权限,在write_enable=YES时有效
    12. anon_other_write_enable=YES
    添加第二个虚拟用户:
    1. vi /etc/vsftpd/user_conf/vsuser02
    加入内容为:
    1. local_root=/home/ftpuser/vsuser02
    2. write_enable=YES
    3. anon_world_readable_only=YES
    4. anon_upload_enable=YES
    5. anon_mkdir_write_enable=YES
    6. anon_other_write_enable=YES
    添加第三个虚拟用户:
    1. vi /etc/vsftpd/user_conf/vsuser03
    加入内容为:
    1. local_root=/home/ftpuser/vsuser03
    2. write_enable=YES
    3. anon_world_readable_only=YES
    4. anon_upload_enable=YES
    5. anon_mkdir_write_enable=YES
    6. anon_other_write_enable=YES

    17.创建虚拟用户各自的家目录

    1. mkdir -p /home/ftpuser/vsuser01
    2. mkdir -p /home/ftpuser/vsuser02
    3. mkdir -p /home/ftpuser/vsuser03

    18.设置权限

    1. chown -R ftpuser:ftpuser /home/ftpuser

    19.配置selinux允许ftp访问home和外网访问

    1. setsebool -P allow_ftpd_full_access on
    2. setsebool -P tftp_home_dir on

    20.重启vsftpd服务

    1. systemctl restart vsftpd

    21.客户端测试

    浏览器测试

    直接在浏览器中输入:ftp://vsuser01:123456@IP
    image.png

    命令行测试

    在命令行中输入:ftp IP
    然后依次输入:账号和密码。
    image.png

    ftp攻击测试

    image.png

    可能遇到问题记录

    问题一:500 OOPS: vsftpd: refusing to run with writable root inside chroot() 错误的解决方式

    解决方案:
    在/etc/vsftpd/vsftpd.conf配置文件中添加了以下两句终于解决了问题。
    1. chroot_local_user=YES ## 原本就有,取掉注释就好
    2. allow_writeable_chroot=YES ## 添加
    修改后重启ftp服务器:
    1. systemctl restart vsftpd.service

    问题二:425 Failed to establish connection

    解决方案:
    登录成功但是无法获取目录,可以尝试设置被动PASV连接。
    在vim /etc/vsftpd/vsftpd.conf
    添加三行代码,启用PASV,开放6000-7000端口。
    1. pasv_enable=YES
    2. pasv_min_port=6000
    3. pasv_max_port=7000
    如果是对外网开放,在路由器的转发规则中,将6000-7000端口写入到iptables中白名单中。
    1. sudo iptables -A INPUT -p tcp --dport 6000:7000 -j ACCEPT
    重启vsftpd服务 ``` systemctl restart vsftpd

此外如果还是不行 1.检查端口规则,如果是云服务器在对应的控制台上开放相应的端口, 如阿里云的安全组。

  1. ![image.png](https://cdn.nlark.com/yuque/0/2022/png/12591990/1650434308680-6812da99-ee61-4ccb-bf04-ad033e0a8744.png#clientId=u8fede95a-5d4a-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=315&id=uda9df596&margin=%5Bobject%20Object%5D&name=image.png&originHeight=425&originWidth=1673&originalType=binary&ratio=1&rotation=0&showTitle=false&size=45804&status=done&style=none&taskId=u41f1313e-87d0-4d91-9a6c-c95133b65ce&title=&width=1239.2593468036896)
  2. <a name="VgjPR"></a>
  3. # 拓展信息
  4. <a name="itCTC"></a>
  5. ## vsftpd用户多目录配置
  6. 通过命令挂载实现
  7. ```basic
  8. mount --bind /home/qingfeng/ /home/ftpuser/vsuser03/

取消挂载

  1. umount /home/ftpuser/vsuser02/aa