文件传输协议-FTP

一、FTP概述

FTP(File Transfer Protocol 文件传输协议)C/S结构的应用层协议、由服务端和客户端两个部分共同实现文件传输功能

FTP服务器普遍部署于内网中,具有容易部署、方便管理等特点、有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术,因此FTP服务使用非常广泛


1)FTP传输模式

FTP使用TCP协议的20、21端口与客户端进行通信

20端口:建立数据连接、传输文件数据

21端口:建立控制连接、传输控制命令

根据传输过程中主被关系、FTP连接的时候 又分为主动模式和被动模式、区别如下:

=============================================

主动模式(PORT):服务器主动发起数据连接

1、 FTP客户端以任意大于1024的端口连接到FTP服务端的21号端口、建立FTP控制连接

2、当需要传输数据的时候、客户端在本地启动一个大于1024的端口、并以PORT命令告知FTP服务端、意思就是我打开了某个端口、你过来连接我

3、FTP服务端收到PORT主动模式命令与端口号以后、它便会从自己的20号端口、向客户端的数据端口(大于1024)发起请求并建立数据连接

=============================================

被动模式(PASV):服务器被动等待数据连接

1、 FTP客户端以任意大于1024的端口连接到FTP服务端的21号端口、建立FTP控制连接

2、当需要传输数据的时候、服务端在本地启动一个大于1024的端口、并以PASV命令告知FTP客户端、意思就是我打开了某个端口、你过来连接我

3、FTP客户端收到PASV被动模式命令与端口号以后、它便会向FTP服务端的该端口(大于1024)发起请求并建立数据连接


2)FTP用户类型

匿名用户:其用户名为ftp或者anonymous 密码任意 一般用于公共文件下载

本地用户:使用本机的系统用户来进行验证

虚拟用户:不直接使用使用系统用户账号、有自己独立的数据库文件、安全性要优于上面两个


3)FTP工具种类

1、客户端软件种类包括:

常见的客户端软件包括:CuteFTP、FlashFXP、LeapFTP、FileZilla

2、服务端软件种类包括:

常见的服务器软件包括:FileZilla、Sener、Serv-U、而vsftpd在Linux中最为流行


二、vsftpd部署与配置文件说明

1)vsftpd部署

部署的方式有两种:源码和RPM方式、一般都是使用RPM因为比较方便 如下所示:

[root@node1 ~]# yum -y install vsftpd
[root@node1 ~]# systemctl start vsftpd
[root@node1 ~]# systemctl enable vsftpd

安装完成之后即可使用systemctl来管理vsftpd服务

vsftpd的配置文件位于:/etc/vsftpd 目录、目录中包括主配置文件、和用户列表文件(ftpuser、user_list)

2)vsftpd配置文件说明

部署和使用vsftpd服务器的关键主要就是在于熟悉相关的配置文件、下面将详细给大家说说

1、用户列表文件

ftpusers: 在此文件中的用户将被禁止登陆、无论该用户是否在user_list文件中出现、默认包含 root和bin等

user_list:可能允许可能拒绝、具体看主配置文件的设置、当userlist_deny=YES 则禁止、反之则允许用户登陆

==============================================================

ftpusers相当于黑名单、为vsftpd服务器提供了一份禁止登陆的用户列表

user_list文件提供了一份可以灵活控制的用户列表、二者结合 可为FTP账号的登陆控制提供便捷的途径

2、vsftpd主配置文件

主配置为:/etc/vsftpd/vsftpd.conf、配置行采用"配置项=参数"的格式来配置、下面为常见配置项及含义说明

作用范围 配置选项 含义说明
匿名用户

anonymous_enable=YES
anon_umask=022
anon_root=/var/ftp
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_max_rate=0

是否允许匿名访问
上传文件的掩码值
设置匿名用户的FTP根目录
是否允许匿名用户上传文件
是否允许匿名用户上传目录
是否拥有其它权限、如 重命名、删除
限制最大传输速率 单位为字节/秒

本地用户

local_enable=YES
local_umask=022
local_root=/var/ftp
chroot_local_user=YES
allow_write_enable_chroot=YES
local_max_rate=0

是否允许本地用户访问
上传文件的掩码值
设置本地用户的FTP根目录
禁锢本地用户在宿主目录
禁锢之后可以写入数据
限制最大传输速率 单位为字节/秒

全局配置

listen=YES
listen_address=0.0.0.0
listen_port=21
write_enable=YES
download_enable=YES
dirmessage_enable=YES
connect_from_port_20=YES
pasv_enable=YES
pasv_max_port=24600
pasv_min_port=24500
pam_service_name=vsftpd
guest_enable=YES
guest_username=user
userlist_enable=YES
userlist_deny=YES
max_clients=0max_per_ip=0
max_per_ip=0
tcp_wrappers=YES

是否以独立运行的方式监听服务
设置监听的IP
设置监听的端口
启用任何形式的写入权限
是否允许下载文件
切换目录时 显示.messages文件
允许主动模式
允许被动模式
被动模式的最大端口号
被动模式的最小端口号
用户认证文件
启用虚拟用户映射
映射的用户
启用user_list列表文件
是否禁止user_list中的账号
最大同时连接数 0无限制
同一个IP、允许多少并发连接
是否启用主机访问控制

说明:这表格有点不太听话、大家凑合着看哈、一个配置选项对应一个含义说明


三、FTP三种模式演示

1)基于匿名访问的FTP服务

1、 创建匿名访问的FTP根目录

注意:FTP根目录的权限不允许匿名用户有写入权限、否则报500错误、如下所示

响应:	331 Please specify the password.
命令:	PASS
响应:	500 OOPS: vsftpd: refusing to run with writable root inside chroot()
错误:	严重错误: 无法连接到服务器

提示:上面只是个演示、下面我们来创建匿名用户所使用的根目录

[root@node1 ~]# mkdir -p /share/public
[root@node1 ~]# chown ftp /share/public

2、 允许匿名用户访问、配置并启动vsftpd服务

如下所示:让匿名用户可上传文件、可创建目录、但是不允许删除任何数据

#===========================================================
anonymous_enable=YES
anon_root=/share
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
write_enable=YES
#===========================================================
[root@node1 ~]# systemctl restart vsftpd

3、验证基于匿名访问的FTP服务

Linux客户端:ftp

Windows客户端:FileZilla

===============================================

[root@node2 ~]# yum -y install ftp  #安装ftp客户端

安装完成以后、我们来测试访问  

[root@node2 ~]# ftp 10.2.3.11
Connected to 10.2.3.11 (10.2.3.11).
220 (vsFTPd 3.0.2)
Name (10.2.3.11:root): ftp					#用户名为ftp
331 Please specify the password.			#可随意、可直接回车
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 										#登录成功后的操作提示符
ftp> ls										#查看FTP服务器中的内容
227 Entering Passive Mode (10,2,3,11,25,228).
150 Here comes the directory listing.
drwxr-xr-x    2 14       0               6 Jun 21 06:18 public
226 Directory send OK.
---------------------------------------------------------------------------------------------
ftp> cd public								#将FTP目录切换到public文件夹
250 Directory successfully changed.
ftp> lcd /opt								#将本地目录切换到opt中
Local directory now /opt
ftp> get Sublime-64.rar						#下载Sublime工具到opt目录
ftp> lcd /etc								#将本地目录切换至etc
Local directory now /etc
ftp> put passwd								#上传passwd文件到/public目录

如果我们已经知道下载文件的完整URL、那我们也可使用wget工具直接下载文件、这样就省去了交互式过程

wget选项解释:-P[指定下载目录]     -c[断点续传]

[root@node2 ~]# wget -P /opt ftp://10.2.3.11/public/jdk-7u51-windows-x64.rar
--2019-06-21 14:49:01--  ftp://10.2.3.11/public/jdk-7u51-windows-x64.rar
 => “/opt/jdk-7u51-windows-x64.rar”
正在连接 10.2.3.11:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。   ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /public ... 完成。
==> SIZE jdk-7u51-windows-x64.rar ... 131240183
==> PASV ... 完成。   ==> RETR jdk-7u51-windows-x64.rar ... 完成。
长度:131240183 (125M) (非正式数据)
100%[===============================================>] 131,240,183  119MB/s 用时 1.1s
2019-06-21 14:49:03 (119 MB/s) - “/opt/jdk-7u51-windows-x64.rar” 已保存 [131240183]

2)基于用户验证的FTP服务

vsftp可直接使用Linux系统用户作为FTP账号、提供基于用户名/密码的验证

用户登陆FTP服务器之后、默认位于自己宿主目录、且在宿主目录中拥有读写权限

1、创建用户和目录、允许本地用户访问

[root@node1 ~]# useradd mds
[root@node1 ~]# cat /etc/passwd | tail -1
mds:x:1000:1000::/home/mds:/bin/bash
[root@node1 ~]# mkdir -p /ftp/private
=======================================================================================
local_enable=YES
local_root=/ftp
local_umask=022
chroot_local_user=YES
allow_writeable_chroot=YES
write_enable=YES
local_max_rate=200000				#限制本地用户的传输速率为200KB/S
=======================================================================================

2、使用user_list用户列表文件

userlist_enable=YES
userlist_deny=YES
[root@node1 ~]# systemctl restart vsftpd

3、 验证基于本地用户访问的FTP服务

提示:上面我们启用了用户列表文件、那也就是说 root用户不能登录了、因为那个文件已经包含root用户、如下所示

命令:	USER root
响应:	530 Permission denied.
错误:	无法连接到服务器

提示:把user_list列表文件中的root用户移除或者将userlist_deny=NO后、可以看见 root用户可以登录  

状态:	读取“/”的目录列表...
状态:	列出“/”的目录成功

提示:因为我重新指定了根目录、所以需要设置权限、不然用户无法写入数据

[root@node1 ~]# cd /ftp/
[root@node1 ftp]# chmod a+w private

下面我们在Linux的客户端中使用刚刚创建的mds用户进行访问测试

[root@node2 ~]# ftp 10.2.3.11
Connected to 10.2.3.11 (10.2.3.11).
220 (vsFTPd 3.0.2)
Name (10.2.3.11:root): mds						#使用mds用户登陆
331 Please specify the password.				#输入mds用户的密码
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> lcd /root
Local directory now /root
ftp> cd private
250 Directory successfully changed.
ftp> get DG8Setup_1360E.exe						#下载驱动精灵
ftp> get EditPlus_5.1.0.2066_x64_chs.exe		#下载编辑器
ftp> lcd /opt
ftp> put mysql-5.6.36.tar.gz					#上传MySQL源码包至服务器

提示:刚刚我们使用了URL格式的方式来下载文件、那是匿名的、所以不用指定用户和密码、如果现在要使用、那就要指定用户和密码、格式如下

格式:wget ftp://用户名:密码@IP地址

[root@node2 ~]# wget -P /opt ftp://mds:abc-123@10.2.3.11/private/cmake-2.8.8.tar.gz
--2019-06-21 16:10:01--  ftp://mds:*password*@10.2.3.11/private/cmake-2.8.8.tar.gz
=> “/opt/cmake-2.8.8.tar.gz”
正在连接 10.2.3.11:21... 已连接。
正在以 mds 登录 ... 登录成功!
==> SYST ... 完成。   ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /private ... 完成。
==> SIZE cmake-2.8.8.tar.gz ... 5691656
==> PASV ... 完成。   ==> RETR cmake-2.8.8.tar.gz ... 完成。
长度:5691656 (5.4M) (非正式数据)
100%[======================================>] 5,691,656   --.-K/s 用时 0.05s
2019-06-21 16:10:01 (109 MB/s) - “/opt/cmake-2.8.8.tar.gz” 已保存 [5691656]

3)基于虚拟用户的FTP服务

使用虚拟用户的主要好处在于:可将登陆的账号与系统登陆的账号区分开 用户密码都不相同、这样就提高了安全

1、 创建文本格式的用户名和密码

提示:写入的时候:基数为用户名、偶数为密码

[root@node1 ~]# vim /etc/vsftpd/vuser.list
zs
abc-123
ls
abc-123

2、创建BerKeleyDB格式的数据库文件

[root@node1 ~]# cd /etc/vsftpd/
[root@node1 vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@node1 vsftpd]# chmod 600 vuser.list
[root@node1 vsftpd]# chmod 600 vuser.db

在db_load命令中:

-T:允许非BerkeleyDB的应用程序使用从文本格式转换的DB数据文件

-t:指定读取数据文件的基本方法

-f:指定数据源文件

3、 添加虚拟用户映射账号、创建FTP根目录

[root@node1 ~]# useradd -d /ftp -s /sbin/nologin virtual
[root@node1 ~]# chown -R virtual:virtual /ftp/

4、为虚拟用户创建PAM认证文件

[root@node1 ~]# cp /etc/pam.d/vsftpd /etc/pam.d/virtual.vu
[root@node1 ~]# vim /etc/pam.d/virtual.vu
#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser

提示:上述配置中、通过db指定了虚拟用户数据文件的位置、只不过省略了.db的扩展名 

5、修改配置文件、添加虚拟用户支持  

local_enable=YES				#需要映射本地用户、所以需要启用
write_enable=YES				#启用上传写入支持
anon_umask=022					#指定上传的权限掩码
guest_enable=YES				#开启用户映射功能
guest_username=virtual			#指定映射的系统用户
allow_writeable_chroot=YES		#因为FTP根目录有写入权限所以需要加入此项
pam_service_name=virtual.vu		#指定新的PAM认证文件、即我们刚刚创建的认证文件

注意:在vsftpd中、虚拟用户默认被作为匿名用户进行处理以降低权限、因为对应的配置项 通常以anon开头

6、为不同的虚拟用户建立独立的配置文件  

通过上面的步骤其实已经可以使用虚拟用户登陆FTP服务器、上传或下载文件了、但是因为所有的虚拟用户

都映射到了同一个系统用户、因为FTP访问权限也是相同的、要么都能上传、要么都能下载

如果要为不同的虚拟用户设置不同的访问权限、可通过为每个虚拟用户创建独立的配置文件来实现

启用独立配置文件需要修改主配置文件、添加 user_config_dir配置项、以此来指定独立配置文件的位置

例如:为zs和ls创建独立的配置文件、让zs可上传文件但不能删除、ls可创建目录并可以删除但不能上传文件

[root@node1 ~]# mkdir /etc/vsftpd/vuser_dir			#创建存放独立配置文件的目录

[root@node1 ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vuser_dir				#指定独立配置文件的目录

[root@node1 ~]# cd /etc/vsftpd/vuser_dir/
[root@node1 vuser_dir]# vim zs						#为zs创建独立配置文件
anon_upload_enable=YES
anon_other_write_enable=NO
anon_mkdir_write_enable=NO

[root@node1 vuser_dir]# vim ls						#为ls创建独立配置文件
anon_upload_enable=NO
anon_other_write_enable=YES
anon_mkdir_write_enable=YES

7、验证基于虚拟用户访问的FTP服务 

根据我们上面的配置过程、可以应确认以下结果:

1、 用户zs可以登录、可以浏览文件、可以下载文件、可以上传文件、不能删除、不能创建目录

2、 用户ls可以登录、 可以浏览文件、可以下载文件、不可上传文件、可以删除、可以创建目录

【只是为了打发时间】

上一篇:protobuf-net-data


下一篇:windows计划任务执行SQLserver脚本