FTP简介
Ø FTP——File Transfer Protocol,文件传输协议。
Ø 网络中计算机之间实现文件传送的标准协议。
Ø 主要用于软件资源的上传与下载、Web站点的维护与更新。
Ø 在进行通信时,FTP需要建立两个TCP连接:
控制连接:标准端口为21,用于发送FTP命令信息
数据连接:标准端口为20,用于上传、下载数据
服务器端软件vsftpd简介
Ø vsftpd的全称是“very secure FTP daemon”
优点
安全
高速
高稳定性
体积小
可定制强
效率高
Ø vsftpd数据连接的类型
主动模式(PORT):服务器主动向客户端发起数据连接
被动模式(PASV):服务端在指定范围内的某个端口被动等待客户端发起数据连接。
Ø vsftpd的传输模式
文本模式:ASCII模式,以文本序列传输数据
二进制模式:Binary模式,以二进制序列传输数据
Ø vsftpd用户的类型
匿名用户:默认ftp
本地用户:帐号名称、密码等信息保存在passwd、shadow文件中
虚拟用户:使用独立的帐号/密码数据文件
一、安装vsftpd
1. 查看系统是否已安装 vsftpd
[root@mylocalhost桌面]#rpm -qa|grep vsftpd
2. 如果未安装,则安装
[root@mylocalhost桌面]#yum -y install vsftpd
二、重启服务
1. 重启vsftpd服务
[root@mylocalhost桌面]#systemctl start vsftpd
2. 设置vsftpd服务开机自启
[root@mylocalhost桌面]#systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
三、配置vsftpd
1. 配置文件位置
(1)/etc/vsftpd/vsftpd.conf:主配置文件
(2)/etc/vsftpd/ftpusers:在该文件中列出的用户清单将不能访问FTP服务器。
(3)/etc/vstpd/user_list
当/etc/vsftpd/vsftpd.conf文件中的“userlist_enable”和“userlist_deny”的值都为yes时,在该文件中列出的用户不能访问FTP服务器。
当/etc/vsftpd/vsftpd.conf文件中的“userlist_enable”的取值为yes而“userlist_deny”的取值为no时,只有/etc/vstpd.user_list文件中列出的用户才能访问FTP服务器
2. 配置文件内容详解
(1)登录及对匿名用户的设置
anonymous_enable=YES:设置是否允许匿名用户登录FTP服务器。
local_enable=YES:设置是否允许本地用户登录FTP服务器。
write_enable=YES:全局性设置,设置是否对登录用户开启写权限。
ftp_username=ftp:设置匿名用户的帐户名称,默认值为ftp。
no_anon_password=YES:设置匿名用户登录时是否询问口令。设置为YES,则不询问。
local_umask=022:设置本地用户的文件生成掩码为022。则对应权限为755(777-022=755)。
anon_umask=022:设置匿名用户新增文件的umask掩码。
anon_upload_enable=YES:设置是否允许匿名用户上传文件,只有在write_enable的值为yes时,该配置项才有效。
anon_mkdir_write_enable=YES:设置是否允许匿名用户创建目录,只有在write_enable的值为yes时,该配置项才有效。
anon_other_write_enable=NO:若设置为YES,则匿名用户会被允许拥有多于上传和建立目录的权限,还有删除和更名的权限。默认值为NO。
anon_world_readable_only=NO:允许匿名用户下载不具备读权限的文件,需手工添加。
(2)设置欢迎信息
ftpd_banner=Welcome to blah FTP service.:设置登录FTP服务器时显示的信息。
banner_file=/etc/vsftpd/banner:设置用户登录时,将要显示banner文件中的内容,该设置将覆盖ftpd_banner的设置。
dirmessage_enable=YES:设置进入目录时是否显示目录消息。若设置为YES,则用户进入目录时,将显示该目录中由message_file配置项指定文件(.message)中的内容。
message_file=.message:设置目录消息文件的文件名。如果dirmessage_enable的取值为YES,则用户在进入目录时,会显示该文件的内容。
(3)设置用户登录目录
local_root=/var/ftp:设置本地用户登录后所在的目录,默认情况下,没有此项配置。在vsftpd.conf文件的默认配置中,本地用户登录FTP服务器后,所在的目录为用户的主目录。
anon_root=/var/ftp:设置匿名用户登录FTP服务器时所在的目录。若未指定,则默认为/var/ftp目录。
(4)设置是否将用户锁定在指定的FTP目录
默认情况下,匿名用户会被锁定在默认的FTP目录中,而本地用户可以访问到自己FTP目录以外的内容。出于安全性的考虑,可以将本地用户也锁定在指定的FTP目录中。
chroot_list_enable =YES:设置是否启用用户列表文件。
chroot_list_file=/etc/vsftpd/chroot_list:指定用户列表文件。
chroot_local_user=YES:用于指定用户列表文件中的用户,是否允许切换到指定FTP目录以外的其他目录。
(5)设置用户访问控制
userlist_enable=YES:取值为YES时/etc/vsftpd/user_list文件生效,取值为NO时/etc/vsftpd/user_list文件不生效。
userlist_deny=YES:设置/etc/vsftpd.user_list文件中的用户是否允许访问FTP服务器。若设置为YES时,则/etc/vsftpd/user_list文件中的用户不能访问FTP服务器;若设置为NO时,则只有/etc/vsftpd/user_list文件中的用户才能访问FTP服务器。
(6)设置主机访问控制
tcp_wrappers=YES:设置是否支持tcp_wrappers。若取值为YES,则由/etc/hosts.allow和/etc/hosts.deny文件中的内容控制主机或用户的访问。若取值为NO,则不支持。
(7)设置FTP服务的启动方式及监听IP
vsftpd服务既可以以独立方式启动也可以由Xinetd进程监听以被动方式启动。
listen=YES:若取值为YES则vsftpd服务以独立方式启动。如果想以被动方式启动将本行注释掉即可。
listen_address=IP:设置监听FTP服务的IP地址,适合于FTP服务器有多个IP地址的情况。如果不设置,则在所有的IP地址监听FTP请求。只有vsftpd服务在独立启动方式下才有效。
(8)与客户连接相关的设置
anon_max_rate=0:设置匿名用户的最大传输速度,若取值为0,则不受限制。
local_max_rate=0:设置本地用户的最大传输速度,若取值为0,则不受限制。
max_clients=0:设置vsftpd在独立启动方式下允许的最大连接数,若取值为0,则不受限制。
max_per_ip=0:设置vsftpd在独立启动方式下允许每个IP地址同时建立的连接数目。若取值为0,则不受限制。
accept_timeout=60:设置建立FTP连接的超时时间间隔,以秒为单位。
connect_timeout=120:设置FTP服务器在主动传输模式下建立数据连接的超时时间,单位为秒。
data_connect_timeout=120:设置建立FTP数据连接的超时时间,单位为秒。
idle_session_timeout=600:设置断开FTP连接的空闲时间间隔,单位为秒。
pam_service_name=vsftpd:设置PAM所使用的名称。
(9)设置上传文档的所属关系和权限
chown_uploads=YES:设置是否改变匿名用户上传文档的属主。默认为NO。若设置为YES,则匿名用户上传的文档属主将由chown_username参数指定。
chown_username=whoever:设置匿名用户上传的文档的属主。建议不要使用root。
file_open_mode=755:设置上传文档的权限
(10)设置数据传输模式
ascii_download_enable=YES:设置是否启用ASCII码模式下载数据。默认为NO。
ascii_upload_enable=YES:设置是否启用ASCII码模式上传数据。默认为NO。
四、防火墙设置
1. 查看防火墙状态
[root@localhost ~]# systemctl status firewalld.service
注:一般情况下,如果外部无法链接 vsftp ,排除网络的问题,很有可能是防火墙在作祟。
2. 防火墙的开启与关闭
(1)开启防火墙
[root@localhost ~]# systemctl start firewalld.service
(2)关闭防火墙
[root@localhost ~]# systemctl stop firewalld.service
(3)重启防火墙
[root@localhost ~]# systemctl restart firewalld.service
(4)禁止开机启动
[root@localhost ~]# systemctl disable firewalld.service
(5)开启开机启动
[root@localhost ~]# systemctl enable firewalld.service
3. 防火墙添加ftp服务
如果你不愿意关闭防火墙,需要防火墙添加FTP服务。
firewall-cmd --permanent --zone=public --add-service=ftp
firewall-cmd –reload
五、测试登陆ftp服务器
1. windows系统登陆ftp
- 运行cmd
- ftp 192.168.152.131(注:该IP为ftp服务器的地址)
登陆失败,解决办法:
关闭防火墙:systemctl stop firewall.service
清空防火墙规则:iptales -F
再次登陆,成功!
2. Linux系统登陆ftp
- 在客户机安装ftp客户端软件
- ftp 192.168.152.131
登陆失败,解决办法:
关闭防火墙:systemctl stop firewall.service
清空防火墙规则:iptales -F
再次登陆,如下图
又失败,登陆密码错误,注意:匿名登陆的账户名和密码都是ftp,再次登陆,成功!
实例1:配置匿名用户登录的FTP
1. 任务描述
(1)vsftp服务器只允许匿名账号登录
(2)设置匿名用户登录的根目录为/var/ftp
(3)匿名用户在根目录下只能下载
(4)在pub子目录下可以新建文件夹,并可以下载、上传、删除和重命名文件(文件夹)。
(5)设置欢迎信息:“Welcome to Nanyang institute of technology!”
2. 修改配置文件/etc/vsftpd/vsftpd.conf
[root@localhost ~]# /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=NO
write_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_world_readable_only=NO
ftpd_banner=Welcome to Nanyang institute of technology!
建议此处用Xshell或者FinalShell等终端模拟工具连接。可直接复制粘贴上去。
3. 防火墙设置
开启21端口
firewall-cmd --permanent --zone=public --add-port=21/tcp
firewall-cmd –reload
4. SELinux安全设置
设置安全策略:
# setsebool -P allow_ftpd_anon_write=1
修改安全上下文:
# chcon -R -t public_content_rw_t /var/ftp/pub
实例2:配置本地用户访问的FTP
1. 任务描述
(1)某单位有两台服务器,一台FTP和Web服务,FTP的功能主要用于维护学校的Web网站内容,包括上传文件、创建目录、更新网页等。
(2)两个部门负责维护任务,并分别使用user1和user2帐号进行管理。
(3)要求仅允许user1和user2帐号登录FTP服务器,但不能登录本地系统。
(4)这两个帐号的根目录限制为/var/www/html,不能进入该目录以外的任何目录。
2. 服务器端创建两个用户user1、user3,并禁止他们本地登录。
[root@mylocalhost ~]# useradd -s /sbin/nologin user1
[root@mylocalhost ~]# useradd -s /sbin/nologin user2
[root@mylocalhost ~]# passwd user1
dyw18057
[root@mylocalhost ~]# passwd user2
dyw18058
//验证用户user1和user2是否能本地登录
[root@mylocalhost ~]# su user1
This account is currently not available.//不能登录本地系统
[root@mylocalhost ~]# su user2
This account is currently not available. //不能登录本地系统
3. 在服务器端创建上传文件的文件夹并为该文件夹赋予其他用户读的权限
[root@mylocalhost ~]# ls -l /var/www
[root@mylocalhost ~]# chmod -R o+w /var/www/html
[root@mylocalhost ~]# ls -l /var/www
4. 修改安全上下文,使上传根目录具有写入(上传)的功能
[root@mylocalhost ~]# chcon -t public_content_rw_t /var/www/html
5. 修改配置文件
[root@mylocalhost ~]# vim /etc/vsftpd/vsftpd.conf
修改一下选项:
anonymous_enable=NO //禁止匿名用户登录
local_enable=YES //允许本地用户登录
write_enable=YES
local_umask=022
local_root=/var/www/html //设置本地用户的根目录为/var/www/html
chroot_local_user=YES
chroot_list_enable=YES //开启能锁定用户的chroot功能
chroot_list_file=/etc/vsftpd/chroot_list //设置锁定用户在根目录中的列表文件
userlist_enable=YES
6. 建立/etc/vsftpd/chroot_list文件,添加user1和user2帐号
vim /etc/vsftpd/chroot_list
7. 修改SELinux允许本地用户登录
[root@mylocalhost ~]#getsebool -a | grep ftp //查看与ftp有关的所有SElinux的布尔值
[root@mylocalhost ~]#setsebool -P ftp_home_dir on
搜了一下原来是CentOS7开始用 tftp_home_dir 代替了 ftp_home_dir
所以应该修改如下:
8. 重启vsftpd服务使配置生效
[root@mylocalhost ~]#systemctl restart vsftpd
问题原因:
应该是自己前面改的配置文件参数中有错误。
[root@localhost ~]# journalctl -xe
查看日志后提示,有错误的bool值在local_enable参数上。
最后重新找了一行重新写了一遍local_enable=YES
问题解决。
9. 设置防火墙规则
[root@mylocalhost ~]#firewall-cmd --permanent --zone=public --add-port=21/tcp
[root@mylocalhost ~]#firewall-cmd --permanent --zone=public --add-port=20/tcp
10. 测试结果
测试一:在客户端浏览器的地址栏中输入“ftp://ip”测试登陆——用户名和密码
测试二:打开cmd——输入ftp+IP地址——用户名和密码
输入错误的用户名或者密码就会登陆失败。
实例3:配置虚拟用户ftp登录
1. 任务描述
我校为了便于师生员工的教学,计划搭建FTP服务器。对所有互联网用户开放共享目录,提供相关学习资料的下载,但禁止上传;学校内部的教师能够使用FTP服务器进行上传和下载,但不可以删除数据。为保证服务器的稳定性,要对用户访问和下载/上传流量进行控制。
2. 任务分析:要实现
(1)对于不同用户进行不同的权限限制
(2)FTP服务器需要实现用户的审核
(3)服务器的安全性:关闭本地用户登录,使用虚拟用户验证机制,并对不同虚拟用户设置不同的权限。
(4)服务器的性能:根据用户的等级,限制客户端的连接数及下载速度。
3.服务器搭建步骤:
(1)查看是否安装vsftp服务器(如未安装到第二步)
[root@mylocalhost桌面]#rpm -q vsftpd
(2)安装vsftp服务器软件
[root@mylocalhost桌面]#yum install vsftpd
(3)建立虚拟用户的用户名、密码列表的文本文件
[root@mylocalhost桌面]#vim /etc/vsftpd/vusers.list
编辑完后保存退出(:wq)
(4)用db_load转换工具,将文本文件v_user.txt转化为数据库文件v_user.db
[root@localhost ~]# cd /etc/vsftpd/
[root@mylocalhostvsftpd]#db_load -T -t hash -f vusers.list vusers.db
[root@mylocalhostvsftpd]#ls
ftpusers vsftpd.conf vsftpd.conf.rpmsave vusers.list
user_list vsftpd_conf_migrate.sh vusers.db
(5)修改虚拟用户列表文件及数据库文件访问权限。
[root@mylocalhostvsftpd]#chmod 600 /etc/vsftpd/vusers.*
[root@mylocalhostvsftpd]#ls -l vusers.*
(6)创建虚拟用户对应的本地用户,禁止他们本地登录,设置用户主目录的访问权限
[root@mylocalhostvsftpd]#useradd -d /var/ftp/share -s /sbin/nologin ftpuser
[root@mylocalhostvsftpd]#useradd -d /var/ftp/teacherdir -s /sbin/nologin ftpteacher
[root@mylocalhostvsftpd]#tail /etc/passwd
[root@mylocalhostvsftpd]#chmod 500 /var/ftp/share
[root@mylocalhostvsftpd]#chmod 600 /var/ftp/teacherdir
(7)修改安全上下文,允许读写
[root@mylocalhostvsftpd]#chcon -t public_content_rw_t /var/ftp/share
[root@mylocalhostvsftpd]#chcon -t public_content_rw_t /var/ftp/teacherdir
(8)建立支持虚拟用户的PAM认证文件
[[email protected]]#vim /etc/pam.d/vuser.vu
/etc/vsftpd/vusers是存放虚拟用户的数据库文件
编辑结束后保存退出
(9)修改/etc/vsftpd/vsftpd.conf主配置文件
[[email protected]]# vim /etc/vsftpd/vsftpd.conf
……
anonymous_enable=NO
local_enable=YES //使用虚拟用户一定要启用本地用户
chroot_local_user=YES //将所有本地用户限制在家目录中(需添加)
guest_enable=YES //启用用户映射功能,允许虚拟用户登录(需添加)
pam_service_name=vuser.vu //指定对虚拟用户进行PAM认证的文件名vuser.vu
user_config_dir=/etc/vsftpd/vconfig //指定虚拟用户的配置文件的位置(需添加)
allow_writeable_chroot=YES //锁定用户允许写根
……
(10)为虚拟用户ftp、techer建立各自独立的配置文件
[[email protected]]#mkdir /etc/vsftpd/vconfig
[[email protected]]#vim /etc/vsftpd/vconfig/ftp
guest_username=ftpuser //设置ftp对应的本地用户为ftpuser
local_root=/var/ftp/share //用户登录后所在的目录
anon_world_readable_only=NO //允许浏览和下载
anon_max_rate=500000 //限定传输速率为500KB/s
//保存退出
[[email protected]]#vim /etc/vsftpd/vconfig/teacher
guest_username=ftpteacher
local_root=/var/ftp/teacherdir
anon_world_readable_only=NO
write_enable=YES //允许写入
anon_upload_enable=YES //允许上传
anon_mkdir_write_enable=YES //允许创建文件夹
anon_max_rate=1000000 //限定传输速度为1000KB/s
//保存退出
(11)修改SELinux允许本地用户登录和匿名用户具有写入权限
//查询ftp相关的安全项
[[email protected]]#getsebool -a|grep ftp
tftp_home_dir --> 0ff//当前是关闭状态
tftp_anon_write --> off
//设置家目录允许访问,匿名用户能写
[[email protected]]#setsebool -P tftp_home_dir on
[[email protected]]#setsebool -P tftp_anon_write on
[[email protected]]#setsebool -P ftpd_full_access on
[[email protected]]#getsebool -a |grep ftp
tftp_home_dir --> on//打开状态
tftp_anon_write --> on
(12)重新加载vsftpd服务,使配置生效
[[email protected]]#systemctl restart vsftpd.service
(13)使用虚拟用户访问FTP的测试
Windows系统测试cmd
如有错误,欢迎指正。