Vsftpd配置(Centos7)
6.1、Vsftpd介绍:
用于上传图片和使用 FTP 协议访问图片服务器。
解决分布式环境的图片访问问题,使用vsftpd对图片做统一管理。
vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个在 UNIX 类操作系统上运行
的服务的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服
务器软件,支持很多其他的FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚
拟用户、支持IPv6、速率高等。vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。在开
源操作系统中常用的FTPD套件主要还有ProFTPD、PureFTPd和wuftpd等。
1、特点:
(1)它是一个安全、高速、稳定的FTP服务器;
(2)它可以做基于多个IP的虚拟FTP主机服务器;
(3)匿名服务设置十分方便;
(4)匿名FTP的根目录不需要任何特殊的目录结构,或系统程序或其它的系统文件;
(5)不执行任何外部程序,从而减少了安全隐患;
(6)支持虚拟用户,并且每个虚拟用户可以具有独立的属性配置;
(7)可以设置从inetd中启动,或者独立的FTP服务器两种运行方式;
(8)支持两种认证方式(PAP或xinetd/ tcp_wrappers);
(9)支持带宽限制;
(10)不支持文件的在线编辑,需要先将文件下载,编辑完成后再上传。
VSFTP市场应用十分广范,很多国际性的大公司和自由开源组织在使用.
2、vsftpd的访问模式:
(1)ftp基于的传输协议:
FTP是仅基于tcp的服务,不支持udp。FTP使用2个端口,一个数据端口和一个命令端口(也可叫做控制端口)。通常来说这两个
端口是21(命令端口)和20(数据端口)。但FTP工作方式的不同,数据端口并不总是20,这就是主动与被动FTP的最大不同之处。
(2)port方式:主动模式:
1)port(主动)方式的连接过程是:
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,服务器从20端口向客户端的空闲端口发送连接请求,建立一条数据链路来传送数据。即当需要传送数据时,客
户端在命令链路上用PORT命令告诉服务器"我打开了***X端口,你过来连接我"。于是服务器从20端口向客户端的***X端口发送连
接请求,建立一条数据链路来传送数据。
2)主动模式的FTP工作流程:
客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始监听端口N+1,并
发送FTP命令"portN+1"到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。针对FTP
服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
A、任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
B、FTP服务器的21端口到大于1024的端口。(服务器响应客户端的控制端口)
C、FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
D、大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)
即、主动FTP:
命令连接:客户端大于1024的端口 --> 服务器 21端口
数据连接:客户端大于1024的端口 <-- 服务器 20端口
(3)pasv方式:被动模式:
1)pasv(被动)方式的连接过程是:
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,客户端向服务器的空闲端口发送连接请求,建立一条数据链路来传送数据。即当需要传送数据时,服务器在命
令链路上用PASV命令告诉客户端"我打开了***X端口,你过来连接我"。于是客户端向服务器的***X端口发送连接请求,建立一条
数据链 路来传送数据。
2)被动模式的FTP工作流程 (有效解决了服务器发起到客户的连接问题) 当客户端通知服务器它处于被动模式时才启用。在被动方式FTP
中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。当开启
一个FTP连接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不
同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特
权端口(P>1024),并发送PORTP命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。对于服务器
端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
A、从任何大于1024的端口到服务器的21端口(客户端初始化的连接)
B、服务器的21端口到任何大于1024的端口(服务器响应到客户端的控制端口的连接)
C、从任何大于1024端口到服务器的大于1024端口(客户端初始化数据连接到服务器指定的任意端口)
D、服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)
即:被动FTP:
命令连接:客户端大于1024的端口 --> 服务器 21端口
数据连接:客户端大于1024的端口 --> 服务器大于1023的端口
(4)主动与被动FTP优缺点:
1)主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。
2)被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器端建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服
务器端的防火墙阻塞掉。
3)随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和
防火墙的配置。通常情况下会选用被动模式的FTP。
3、vsftpd的三种认证模式:
(1)匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登陆,在登录FTP时使用默认的用户名,一般是ftp或anonymous。
(2)本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,在/etc/passwd中,相较于匿名开放模式更安全,而且配置起来简单。
(3)虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些
账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。使用虚拟用户账号可以提供集中管理的FTP根目录,方便了管理员的管理,
同时将用于FTP登录的用户名、密码与系统用户账号区别开,进一步增强了FTP服务器的安全性。某种意义上来说,匿名用户也是系统用户,只是系统用户
的一个映射。公开的FTP都不会使用系统用户作为FTP帐号,而更多的采用了虚拟用户,这样能保证系统的安全性。
4、vsftpd服务常用的参数以及作用
(1)tcp_wrappers=YES
############################################################################
#设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制,默认开启;
#如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的
#主机,是否允许访问该FTP服务器。
#比如:若要仅允许172.16.1.0网段的用户可以连接FTP服务器,则在需要在相应的配置文件中添加以下内容:
#[root@m01 vsftpd]# vim /etc/hosts.deny
#vsftpd:all:deny
#[root@m01 vsftpd]# vim /etc/hosts.allow
#vsftpd:172.16.1.0/255.255.255.0:allow
############################################################################
(2)userlist_enable=YES
#########################################################################
#开启控制用户访问,默认开启;
#当 userlist_enable=NO时user_list列表不生效,此时只有user_list和不在ftpusers里面的系统用户可以访问;
#当 userlist_enable=YES,userlist_deny=YES时此时只有不在ftpusers和user_list的系统用户可以访问(默认);
#当 userlist_enable=YES , userlist_deny=NO时此时只有user_list用户可以访问,只能用命令行进行访问;
#如果用户同时出现在ftpuser和user_list中,ftpuser的优先权大于user_list;
############################################################################
(3)chroot_local_user,chroot_list_enable介绍,默认都是不开启的:
chroot_list_enable=NO
#设置是否启用chroot_list_file配置项指定的用户列表文件。默认值为NO。
chroot_list_file=/etc/vsftpd.chroot_list
#用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录
chroot_local_user=YES
#所有的用户都不能切换到其它的目录,默认是NO;
(4)dirmessage_enable=YES
默认为开启。
在需要访问的目录下创建".message"文件,并写入欢迎语,这样切换到该目录时就会显示
欢迎信息。
6.2、安装Vsftpd服务:
[root@slavenode1 ~]# yum install vsftpd -y
[root@slavenode1 ~]# rpm -qa vsftpd
vsftpd-3.0.2-27.el7.x86_64
6.3、配置文件说明:
/etc/vsftpd/vsftpd.conf
#vsftpd 的核心配置文件。
/etc/vsftpd/ftpusers
#黑名单文件,此文件里的用户不允许访问 FTP 服务器。
/etc/vsftpd/user_list
#是白名单文件,此文件里的用户允许访问 FTP 服务器。
6.4、默认配置参数:
[root@slavenode1 ~]# egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
#备份原配置文件
[root@slavenode1 ~]# cp -a /etc/vsftpd/vsftpd.conf{,.bak}
6.5、Vsftpd匿名用户登陆配置:
1、vsftpd.conf 配置参数:
[root@slavenode1 ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
#启用匿名访问模式
anon_umask=022
#匿名用户上传文件的umask值
anon_upload_enable=YES
#允许匿名用户上传文件
anon_mkdir_write_enable=YES
#允许匿名用户创建目录
anon_other_write_enable=YES
#允许匿名用户重命名、删除等操作
anon_root=/data/anon
#匿名用户的ftp根目录
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen_port=21
#vsftpd服务监听的端口号
listen_address=0.0.0.0
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
#启用ftp的被动模式
pasv_min_port=45000
#PASV模式最小端口号
pasv_max_port=49000
#PASV模式最大端口号
2、创建并授权匿名用户FTP根目录
[root@slavenode1 ~]# mkdir -p /data/anon/pub
[root@slavenode1 ~]# chown -R ftp.ftp /data/anon/pub/
#匿名用户登陆后默认是以ftp用户的权限创建文件的
3、启动vsftpd服务,并加入开机启动
[root@slavenode1 ~]# systemctl start vsftpd
[root@slavenode1 ~]# systemctl enable vsftpd
[root@slavenode1 ~]# netstat -tunlp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 15767/vsftpd
4、使用FileZilla进行测试:
(1)连接Vsftpd服务:
(2)操作测试:
(3)在linux服务器中查看创建的内容:
[root@slavenode1 ~]# ls -l /data/anon/pub/
总用量 112
-rw-r--r-- 1 ftp ftp 110868 5月 28 10:57 lc_picture.jpg
drwxr-xr-x 2 ftp ftp 6 5月 28 10:57 test_dir
6.6、Vsftpd本地用户登陆配置:
1、vsftpd.conf 配置参数:
[root@slavenode1 ~]# cat /etc/vsftpd/vsftpd.conf
#禁止匿名登录FTP服务器
anonymous_enable=NO
#允许本地用户登录FTP服务器
local_enable=YES
#可以上传(全局控制)
write_enable=YES
#允许下载
#download_enable=YES
#本地用户上传文件的umask
local_umask=022
#设置本地用户登录后所在目录
local_root=/var/ftp/test
#全部用户被限制在主目录
chroot_local_user=YES
#允许对FTP根目录执行写入操作
allow_writeable_chroot=YES
#是否在进入新目录时显示 message_file 文件中的内容
dirmessage_enable=YES
#启用日志
xferlog_enable=YES
#vsftpd主动模式下开启的数据端口,在被动模式下不启动
connect_from_port_20=YES
#日志是否进行格式化
xferlog_std_format=YES
#监听的端口号
listen_port=21
#监听本地所有端口,默认监听本地所有端口
listen_address=0.0.0.0
#独立服务
listen=YES
#centos7增加此设置,关闭ipv6本地监听,默认监听ipv4和ipv6地址
listen_ipv6=NO
#认证模式
pam_service_name=vsftpd
#启用用户列表
userlist_enable=YES
#启用tcp_wrappers
tcp_wrappers=YES
#开启被动模式
pasv_enable=YES
#FTP服务器公网IP(也就是当前阿里云服务器的公网 IP)
#pasv_address=120.xx.xx.xx
#设置被动模式下,建立数据传输可使用port范围的最小值
pasv_min_port=10000
#设置被动模式下,建立数据传输可使用port范围的最大值
pasv_max_port=10088
2、创建本地虚拟用户和密码:
[root@slavenode1 ~]# useradd -s /sbin/nologin ftptest
#注意,这里创建ftp虚拟用户时必须要带其家目录,不能带-M参数,否则会报以下两行错误:
#响应: 500 OOPS: cannot change directory:/home/ftptest
#错误: 严重错误: 无法连接到服务器
[root@slavenode1 ~]# echo "ftptest@lc" | passwd --stdin ftptest
3、创建一个所有用户登陆到ftp后被限制在该目录下的目录:
[root@slavenode1 ~]# mkdir -p /var/ftp/test
4、更改/var/ftp/test目录的拥有者为ftptest
[root@slavenode1 ~]# chown -R ftptest:ftptest /var/ftp/test
5、启动服务:
[root@slavenode1 ~]# systemctl start vsftpd
[root@slavenode1 ~]# systemctl enable vsftpd
[root@slavenode1 ~]# netstat -tunlp | grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1401/vsftpd
6、测试:
(1)连接服务器:
(2)操作测试:
(3)查看上传的文件权限:
[root@slavenode1 ~]# ls -l /var/ftp/test/
总用量 176
drwxr-xr-x 2 ftptest ftptest 6 5月 28 13:23 test_dir
-rw-r--r-- 1 ftptest ftptest 176654 5月 28 13:23 test_picture.jpg
7、补充说明:
(1)在以上配置下,以后创建的用户访问ftp服务器都会被控制到/var/ftp/test目录之下(只有查看的权限,
因为,创建的虚拟用户是以/var/ftp/test/目录其它用户的"r-x"权限进入的,如果想要有所有的操作权限,
在创建用户时需要,指定新建用户主组,例如,useradd -g ftptest -s /sbin/nologin liu):
例如:
[root@slavenode1 ~]# useradd -s /sbin/nologin liu
[root@slavenode1 ~]# echo "liu" | passwd --stdin liu
(3)每个本地用户在ftp服务器上都有一个单独的目录:
将/etc/vsftpd/vsftpd.conf配置文件中的"local_root=/var/ftp/test"注释掉。
例如:
[root@slavenode1 ~]# useradd -s /sbin/nologin -M chang
[root@slavenode1 ~]# echo "chang" | passwd --stdin chang
[root@slavenode1 ~]# mkdir -p /chang
[root@slavenode1 ~]# chown chang.chang /chang
[root@slavenode1 ~]# usermod -d /chang chang
6.7、vsftp连接很慢的解决办法
VSFTP连接时很慢,因为默认开启了reverse_lookup(反向解析),然后在vsftpd.conf中加上
reverse_lookup_enable=NO,service vsftpd restart