一、基础知识:
1、ftp:file transfer protocal 及文件传输协,工作与应用层。
2、ftp协议的实现:
服务器端实现软件:vsftpd,pureftpd,filezilla server
客户端实现软件:ftp,lftp
3、数据传输格式:
ASCII:ASCII格式传输
binary:二进制文件传输格式
4、ftp传输连接类型:ftp客户端与服务器端通过命令建立连接后,并不适用命令连接通道传输数据,而是新建一个数据连接传输数据
命令连接:传输指令
数据连接:传输数据
5、ftp工作模式:主动模式和被动模式两种。
主动模式:port模式,服务器监听于某一固定端口。服务器端主动向客户端发起连接请求。
被动模式:PASV模式,服务器监端口不固定,客户端向服务器端发起连接请求。
为什么要有两种工作模式?
因为,客户端出于安全因素考虑,一般会禁用大于1024的端口,但是服务器并不知道客户端哪些端口处于禁用状态,所以主动模式难以生效。因此最好使用被动模式。
6、ftp用户类型
匿名用户:所有的农名用户,一般映射为本地魔衣固定的系统用户(一般为用户ftp)。家目录为/var/ftp
本地用户:又称为系统用户,UID一般0~999。存在于/etc/passwd文件中的所有用户
虚拟用户:使用开了中间层(一般为PAM),如使用mysql数据库存储用户名和密码
PAM:plugable authentication modules 插入式认证模块。
二、vsftpdf的安装
1、关闭防火墙:service iptables stop
2、关闭selinux:setenforce 0
3、 先用rpm -q vsftpd命令检查是否已经安装,若ftp没有安装,使用yum -y install vsftpd 安装
4、设置开机自启 :chkconfig vsftpd on 。
5、启动vsftpd: service vsftpd <start |stop|status|restart>
三、vsftpd配置
1、备份配置文件:cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
1、写权限全局配置项:
write_enable=YES ###是否对登录用户开启写权限。属全局性设置。默认NO。
2、匿名用户配置
anonymous_enable=YES ###设置是否允许匿名用户登录FTP服务器。默认为YES。所有匿名用户都会映射至某一固定系统用户,此用户一般问ftp,家目录是/var/ftp。 ftp_username=ftp ###定义匿名用户的账户名称,默认值为ftp。 no_anon_password=YES ###匿名用户登录时是否询问口令。设置为YES,则不询问。默认NO。 anon_world_readable_only=YES ###匿名用户是否允许下载可阅读的文档,默认为YES。 anon_upload_enable=YES ###是否允许匿名用户上传文件。前提是write_enable=YES时,该配置项才有效。而且匿名用户对相应的目录必须有写权限。默认为NO。 anon_mkdir_write_enable=YES ###是否允许匿名用户创建目录。前提是write_enable=YES时有效。且匿名用户对上层目录有写入的权限。默认为NO。 anon_other_write_enable=NO ###除去上传和建立目录的权限,其它写权限如删除和更名权限,依赖于次配置。默认值为NO。
2.1、修改匿名用户上传文件属主
# If you want, you can arrange for uploaded anonymous files to be owned by # a different user. Note! Using "root" for uploaded files is not # recommended! chown_uploads=YES
###是否允许匿名用户上传文件,匿名用户上传文件默认属主为root。允许匿名用户上传文件除了
###write_enable=YES外还需配置匿名用户对家目录(默认为/var/ftp)有写权限。
####示例,我们将智图表格.txt文件上传到默认匿名用户家目录/var/ftp/下,可以看到文件属主为root
![](https://img2018.cnblogs.com/blog/1394693/201811/1394693-20181113160744485-1503657862.png)
chown_username=test ####指定匿名用户上传文件的属主。此处设置为test
###示例,匿名登录FTP然后我们将智图.xls表格上传.可以看到上传后的文件属主就是我们指定的test
![](https://img2018.cnblogs.com/blog/1394693/201811/1394693-20181113165331360-1244093535.png)
此处有个问题:当匿名用户对默认家目录/var/ftp有写权限,而且
chown_uploads=YES,或
chown_username=test 同时使用时会限制匿名用户登录。本次示例是通过先启动服务,匿名登录服务器后再赋予写权限后上传成功的。本人没有研究明白问题所在,希望高人指点。
3、访问控制
(1)基于IP
tcp_wrappers=YES:用来设置vsftpd服务器是否与tcp wrapper相结合,进行主机的访问控制。设置为YES时,vsftpd服务器会检查/etc/hosts.allow和/etc /hosts.deny中的配置,通过两个我带你见来判断是否允许客户端访问该FTP服务器。类似于简易的防火墙。
示例:只允许192.168.121.1~192.168.121.254的用户访问ftp服务器,则可编辑/etc/hosts.allow文件中并添加以下内容:
vsftpd:192.168.121.0/255.255.255.0 :allow
all:all:deny
(2)基于用户
①记录在/etc/vsftpd/ftpusers中的用户不允许登录ftp,文件中默认有一些系统用户不允许登录如root。
[root@localhost vsftpd]# more ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
②指令控制
userlist_enable=YES :控制是否开启由userlist_file=/PATH控制的ftp访问控制文件(默认为/etc/vsftpd/user_list)。
userlist_file=/etc/vsftpd/user_list :文件访问控制文件路径
userlist_deny=YES:代表userlist_file=/PATH指定文件为黑名单,即文件记录所有用户都不允许登录。默认为YES,即黑名单。
userlist_deny=NO:代表userlist_file=/PATH指定文件为白名单,即只有文件记录用才能登录ftp。
root@localhost vsftpd]# more user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
4、本地用户配置
注意,其他用户不能对/etc/vsftpd/下的三个文件有执行权限,否则不能登录FTP
local_enable=YES ###是否允许非匿名用户,如本地用户(/etc/passwd中的用户)登录FTP服务器。所有非匿名用户的生效都依赖于此配置。默认为NO。 local_mask=022 ###本地用户上传文件的权限掩码
注意在/etc/vsftpd/ftpusers 中记录的本地用户不允许登录ftp。此配置文件默认包含以下用户。当然本地用户能否登录还与其他配置有关如userlist_enable。
userlist_enable=YES :控制是否开启由userlist_file=/PATH控制的ftp访问控制文件(默认为/etc/vsftpd/user_list).
userlist_deny=YES:代表userlist_file=/PATH指定文件为黑名单,即文件记录所有用户都不允许登录。默认为YES,即黑名单。
userlist_deny=NO:代表userlist_file=/PATH指定文件为白名单,即只有文件记录用才能登录ftp。
示例:要想让root用户能登录系统需要以下配置
local_enable=YES
编辑ftpusers,将root用户删除或者注释掉
userlist_enable=YES 时,若userlist_deny=YES。要编辑userlist_file指向的文件,在黑名单中删除或注释掉root
,若userlist_deny=NO。要编辑userlist_file指向的文件,在白名单中添加root
5、欢迎信息配置
①用户登录成功后欢迎消息设定
# You may fully customise the login banner string: #ftpd_banner=Welcome to blah FTP service. ###可以自己定制登录横幅字符串,即自己定制一个欢迎登录成功用户的信息 ftpd_banner=Warning:this is my page.
banner_file=/PATH/TO/FILE ###若欢迎信息较多可以将其写入到某以文件中。
![](https://img2018.cnblogs.com/blog/1394693/201811/1394693-20181113130218882-679998780.png)
②有时候我们会在用户切换至某一目录时,设置目录消息,用来提醒用户,不要轻易做删除操作等信息。此时就可以使用目录消息设定了。
# Activate directory messages - messages given to remote users when they # go into a certain directory. dirmessage_enable=YES
####开启时,用户切换至指定目录后,vsftpd会查看目标目录下的.message(没有时要新建)文件,并将其内容显示给用户。,当然也可使用message_file命令指定文件
,将文件内容显示给用户。此处我们设置.message文件内容为this is a test information.
message_file=/PATH/TO/FILE
![](https://img2018.cnblogs.com/blog/1394693/201811/1394693-20181113131608858-1490083247.png)
6、禁锢用户于自己的家目录。例如test用户登录ftp后默认在其指定的家目录(本人配置的是/home/test),但是默认test用户是可以切换到其他目录的。这样很不安全。
# You may specify an explicit list of local users to chroot() to their home # directory. If chroot_local_user is YES, then this list becomes a list of # users to NOT chroot(). #chroot_local_user=YES
###是否禁锢所有本地用户于自己的家目录中。设置为YES是代表禁锢所有本地用户。 #chroot_list_enable=YES
####有时候我们不想禁锢所有用户,只是禁锢其中的某些用户,此时可以使用此配置项。设置为YES时,开启一个(chroot_list_file)指向的文件。文件中用户不允许cd到本地系统其他目录。
# (default follows)
#chroot_list_file=/etc/vsftpd/chroot_list ####默认文件为/etc/vsftpd/chroot_list
示例:chroot_local_user与chroot_list_enable都为YES时,会有什么情况?
我们准备两个用户test和wxx
①配置
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
②在chroot_list文件中添加用户test
③启动ftp服务,结果如下图。即,test用户使用pwd显示的在家目录/home/test,可以cd到其他目录;wxx用户显示在/下,实际是在/home/test,无法cd到其他目录。
④得出结论是都为YES时,只有在chroot_list中的目录才能cd到其他目录,此时chroot_list其实是一个白名单,即允许哪些用户切换目录。具体有以下几种情况
1)当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd/chroot_list文件中列出的用户,可以cd到其他目录;未在文件中列出的用户,不能cd到其他目录。
2)当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd/chroot_list文件中列出的用户,不能cd到其他目录;未在文件中列出的用户,可以cd到其他目录。
3)当chroot_list_enable=NO,chroot_local_user=YES时,所有用户均不能cd到其他目录。
4)当chroot_list_enable=NO,chroot_local_user=NO时,所有用户均可cd换到其他目录。
5)当用户不允许切换到上级目录时,登录后FTP站点的使用pwd命令显示在/下,其实还是在家目录下。
7、日志文件
# The target log file can be vsftpd_log_file or xferlog_file. # This depends on setting xferlog_std_format parameter xferlog_enable=YES ###是否启用上传或下载日志记录
# Switches between logging into vsftpd_log_file and xferlog_file files. # NO writes to vsftpd_log_file, YES to xferlog_file xferlog_std_format=YES
###控制是使用vsftpd_log_file 日志文件,还是使用xferlog_file日志文件
NO代表使用vsftpd_log_file;YES代表使用xferlog_file。
# The name of log file when xferlog_enable=YES and xferlog_std_format=YES # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log #xferlog_file=/var/log/xferlog
vsftpd_log_file=/var/log/vsftpd.log
示例:两种文件格式
8、FTP监听端口
# When "listen" directive is enabled, vsftpd runs in standalone mode and # listens on IPv4 sockets. This directive cannot be used in conjunction # with the listen_ipv6 directive. listen=YES ####YES代表ftp工作于standalone模式。
listen_port=21 ###ftp命令连接监听端口,默认为21
listen_address=*.*.*.* ###设置FTP在哪个IP上监听用户的连接请求。一般注释掉代表监听于本机所有IP,如127.0.0.1
9、FTP并发连接数
max_clients=0 :设置vsftpd允许的最大并发连接数,默认为0,代表不受限制。若设置为200时,则同时允许有200个连接,超出的将拒绝客户端连接请求。只有在standalone模式下有效
max_per_ip=0:设置每个IP地址可以FTP服务器同时建立连接的最大数目。默认为0,代表不受限制。建议设置一个较小值,防止同一个用户建立太多的连接。只有在以standalone模式运行时才有效。
10、会话超时时长
idle_session_timeout:空闲连接超时时长,服务于客户端建立了解后,若在指定时间内在没有互相发送任何指令则自动断开连接。
connect_timeout=60:port模式下
data_connection_timeout=300:数据传输超时时长。
11、PASV模式下端口配置
pasv_enable=YES: 若设置为YES,则启用PASV工作模式;若设置为NO,启用PORT模式。默认为YES,即使用PASV模式。
pasv_max_port=0:PASV模式下,数据连接端口最大值,默认值为0,表示任意端口。
pasv_mim_port=0:PASV模式下,数据连接端口最小值 ,默认值为0,表示任意端口。
12、传输速率
anon_max_rate=0:设置匿名用户最大传输速度,单位为b/s。0为默认值代表不受速度限制。
local_max_rate=0 : 设置本地用户最大传输速度。默认为0。
示例:一个最简单的FTP配置示例
要求:1、不允许匿名用户登录,只允许本地用户中的指定用户登录。
2、该用户有读写权限。
3、禁锢用户与自己家目录
4、工作于被动模式
5、本地用户名为zxy家目录是/tmp/zxy
第一步配置文件相关
①保持/etc/vsftpd/vsftpd.conf文件其他内容默认,更改一下配置
anonymous_enable=NO
②添加以下指令
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=11000
userlist_deny=NO
chroot_local_user=YES
第二步添加用户指定家目录为/tmp/zxy
useradd -m /tmp/zxy zxy
passwd zxy
第三步编辑/etc/vsftpd/user_list
删除所有已存在用户,添加zxy用户
第四步重启服务