引言:
FTP 是因特网网络上历史最悠久的网络工具,从 1971 年由 A KBHUSHAN 提出第一个 FTP 的RFC(RFC114) 至今近半个世纪来,FTP 凭借其独特的优势一直都是因特网中最重要、最广泛的服务之一。
一、FTP概述
FTP(File TransferProtocol,文件传输协议)是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。FTP客户端和服务器之间的连接是可靠的,面向连接的,为数据的传输提供了可靠的保证。tcp协议:20,21端口。
21端口:用于传输指令
22端口:用于传输数据
FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard(也就是Active,主动方式),一种是 Passive(也就是PASV被动方式)。
Standard模式FTP的客户端发送PORT命令到FTPserver。Passive模式FTP的客户端发送 PASV命令到FTP Server
Standard模式(主动模式)
FTP客户端首先和FTP Server的TCP
21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。
Passive模式(被动模式)
在建立控制通道的时候和standard模式类似,当客户端通过这个通道发送PASV命令的时候,FTP
server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server将通过这个端口进行数据的传送,这个时候FTp server不再需要建立一个新的和客户端之间的连接
二、FTP的作用及工作原理
1.FTP的作用和模式以及通信方式
FTP (File Transfer Protocol:文件传输协议)作用: Internet 上用来远程传送文件的协议。
vsftp全称(very secure FTP)
vsftp模式:c/s模式
FTP服务器默认使用TCP协议的20、21端口与客户端进行通信
20端口用于建立数据连接,并传输文件数据
21端口用于建立控制连接,并传输FTP控制命令
2.FTP的工作原理
FTP数据连接分为主动模式和被动模式
主动模式:服务器主动发起数据连接
被动模式:服务器被动等待数据连接
2.1主动模式
FTP 客户端连接到FTP 服务器的21号端口,发送用户名和密码,客户端随机开放一个端口(1024以上),发送PORT 命令到FTP 服务器,告知服务器客户端采用主动模式并开放端口,FTP服务器收到PORT主动模式命令和端口后,通过服务器的20号端口和客户端开放的端口连接,发送数据,原理画图所示,(无论是主动还是被动模式,首先的控制通道都是先建立起来,只是在数据传输模式上的区别)1
主动模式有个弊端,客户端必须关闭防火墙,否则不能传输数据。
2.2被动模式
首先客户端的高位端口向服务器的21端口建立FTP连接请求(连接请求包括:认证,用户,密码,连接模式,命令PORT端口);
FTP服务器响应ACK确认,服务器的21号端口和客户端的高位端口建立ftp会话连接,并告诉客户端已开放20号端口,等你来连接;
客户端用自己的一个高位端口连接服务器响应的一个高位端口;
服务器给客户端发送ACK确认,开始数据传输
三、搭建和配置FTP 服务
环境:准备两台虚拟机,其中一台Linux系统做服务器,一台Windows做客户机。并且能互通
3.1安装前准备工作,关闭防火墙
因为ftp服务的端口为21,20是高危端口,所以必须关闭防火墙防止服务操作被屏蔽
systemctl stop firewalld
setenforce 0
3.2查看信息,安装软件包vsftpd
配置ftp服务
[root@localhost ~]# rpm -q vsftpd //查看是否安装了ftp服务 未安装软件包 vsftpd yum info vsftpd 查看信息 yum install -y vsftpd #yum源一键安装
3.3开启FTP服务,切换目录并做备份
[root@localhost ~]# systemctl start vsftpd //启动ftp服务
[root@localhost ~]# systemctl enable vsftpd //设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@localhost ~]# systemctl status vsftpd //查看此时ftp服务状态
3.4设置用户固定登录路径
3.4.1创建用户
[root@localhost ~]# useradd zhangsan [root@localhost ~]# passwd zhangsan [root@localhost ~]# useradd lisi [root@localhost ~]# passwd lisi [root@localhost ~]# useradd wangwu [root@localhost ~]# passwd wangwu //创建用户并设置密码
3.4.2查看用户账号
[root@localhost ~]# tail -4 /etc/passwd //查看账号 apache❌48:48:Apache:/usr/share/httpd:/sbin/nologin zhangsan❌1001:1001::/home/zhangsan:/bin/bash wangwu❌1002:1002::/home/wangwu:/bin/bash lisi❌1003:1003::/home/lisi:/bin/bash
3.4.3设置固定路径
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf //进入编辑限制用户远程登录到固定路径 将102行开启 chroot_list_enable=YES//开启匿名用户访问,默认已开启 将104行开启 chroot_list_file=/etc/vsftpd/chroot_list //两行取消“#”注解 local_root=/usr/local/html //指定用户登录的目录且不能cd(切换)到其他目录 [root@localhost ~]# mkdir /usr/local/html //创建用户指定登陆的路径 [root@localhost ~]# ls /usr/local//看看是否创建成功 bin etc games html include lib lib64 libexec sbin share src [root@localhost ~]# vim /etc/vsftpd/chroot_list //将想要限制的用户填入
3.4.4配置用户白名单
[root@localhost vsftpd]# vim /etc/vsftpd/user_list ###进入编辑白名单,在行尾加上lisi [root@localhost vsftpd]# vim /etc/vsftpd/vsftpd.conf ###进入编辑启用白名单 userlist_enable=YES userlist_deny=NO [root@localhost vsftpd]# systemctl restart vsftpd ###重启服务
验证:此时远程登录zhangsan ,wangwu 皆登录失败,只有lisi用户可以登录,所以黑白名单设置成功
3.5设置匿名用户访问的ftp服务(最大权限)
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf [root@localhost ~]# chmod -R 777 /var/ftp/pub/ vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES #开启匿名用户访问。默认开启 write_enable=YES #开放服务器的写权限(若要上传必须开启)。默认已开启 anon_umask=022 #设置匿名用户所上传数据的权限掩码(反掩码) anon_upload_enable=YES #允许匿名用户上传文件。默认已注释,需取消注释 anon_mkdir_write_enable=YES #允许匿名用户创建(上传)目录。默认已注释,需取消注释 anon_other_write_enbale=YES #允许删除、重命名、覆盖等操作。需添加 chmod -R 777 /var/ftp/pub/ #为匿名访问ftp的根目录下的pub子目录设置最大权限 以便匿名用户上传数据
systemctl restart vsftpd #重启服务
在windows系统打开开始菜单,输入cmd命令打开命令提示符 ftp 192.168.223.9 #建立ftp连接 匿名访问时,用户名为ftp,密码为空,直接回车即可完成登录 ftp> pwd #匿名访问ftp的根目录为Linux系统的/var/ftp/目录 ftp> ls #查看当前目录 ftp> cd pub #切换到pub目录 ftp> get 文件名 #下载文件到当前windows本地目录 ftp> put 文件名 #上传文件到ftp目录 ftp> quit #退出
详细命令
[root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service. [root@localhost ~]# setenforce 0 [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf [root@localhost ~]# chmod -R 777 /var/ftp/pub/ [root@localhost ~]# systemctl restart vsftpd [root@localhost ~]# ll /var/ftp/
总用量 0
drwxrwxrwx. 2 root root 6 10月 31 2018 pub [root@localhost ~]# cd /var/ftp/pub [root@localhost pub]# touch 22.txt [root@localhost pub]# ls 22.txt [root@localhost pub]# ls 19.txt 22.txt