一、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 |
是否允许匿名访问 |
本地用户 |
local_enable=YES |
是否允许本地用户访问 |
全局配置 |
listen=YES |
是否以独立运行的方式监听服务 |
说明:这表格有点不太听话、大家凑合着看哈、一个配置选项对应一个含义说明
三、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可以登录、 可以浏览文件、可以下载文件、不可上传文件、可以删除、可以创建目录
【只是为了打发时间】