FTP(File Transfer Protocol,文件传输协议)是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互,以及数据传输的过程。
一、FTP的工作流程
当FTP客户端要上传/下载文件时,通过与服务端21号端口建立于 TCP之上的控制连接,当服务端收到命令之后,立即进行验证或者响应(如:用户名和密码验证,文件传输命令等)。服务端收到文件传输命令时,就需要和客户端建立一个数据连接通道用于传输文件,这个连接的建立,可以由客户端主动发起,也可以由服务端发起。
数据连接并不是永久性存在的,一旦传输完毕就会将这个连接关闭掉,对于控制连接,而只有关闭客户端,控制连接才会随之关闭。控制连接是随客户端一起存在的,而数据连接是短暂存在的,只要文件/列表传输完成,数据连接就关闭了。
FTP协议有主动式和被动式两种工作方式,主动与被动是针对服务器是否主动发起数据连接而言的。
主动模式:
- 在第1步中,客户端的命令端口(≥1024)与 FTP 服务端的命令端口(21)建立连接,并发送命令"PORT 1027";
- 在第2步中,FTP服务端给客户端的命令端口返回一个"ACK";
- 在第3步中,FTP服务端发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接;(由于多数防火墙不允许接受外部发起的连接,所以主动模式通过防火墙时可能会受到限制。)
- 在第4步中,客户端给FTP服务器端返回一个"ACK"相应,主动式的控制连接和数据连接已经建立成功。
解释:ACK是“acknowledgement”的缩写,意思是“确认”。ACK消息通常包含一个序列号,这个序列号对应于接收到的数据包的序列号。当发送方发送一个数据包时,它会包含一个序列号。接收方在收到数据包后,会发送一个ACK消息,其中包含下一个期望接收的数据包的序列号。这样,发送方就知道数据包已经被成功接收,并且可以继续发送下一个数据包。
被动模式:
在FTP被动模式中,控制连接和数据连接都由客户端发起,这样可以解决从服务端到客户端的入方向数据端口被客户端所在网络防火墙过滤掉的问题。
- 在第1步中,客户端的命令端口(≥1024)与FTP 服务端的命令端口(21)建立连接,并发送命令"PASV";(PASV(Passive,被动)请求服务器进入被动模式)
- 在第2步中,FTP服务端返回命令"PORT 2024"(可以自定义PORT范围)给客户端,告知FTP服务端将用哪个端口侦听数据连接;
- 在第3步中,客户端发起一个从它自己的数据端口(N+1)到FTP服务端先前指定的数据端口(2024)的连接;
- 在第4步中,FTP服务端给客户端的数据端口返回一个"ACK"响应,被动式的控制连接和数据连接已经建立成功。
PASV模式的主要优点是它允许客户端从任意端口发起数据连接,而不需要客户端的防火墙或NAT设备开放特定的端口。这对于客户端来说更加方便,因为它不需要知道服务器的具体数据端口,也不需要修改防火墙规则。
然而,PASV模式也给服务器端带来了问题,因为它需要服务器开放一个范围较大的端口供客户端连接。这可能会导致服务器暴露更多的端口,从而增加安全风险。因此,在服务器端配置FTP服务时,管理员需要仔细选择PASV模式侦听的端口范围,并在防火墙上相应地开放这些端口。
在企业环境中,如果FTP服务器和客户端都位于同一个网络内部,并且防火墙规则允许,那么FTP可以以主动模式工作,只需要在FTP服务器的防火墙规则中开放20和21端口即可。但是,如果客户端位于防火墙或NAT后面,那么使用PASV模式可能是更好的选择,因为它不需要客户端开放额外的端口。
二、安装vsftpd软件包
前提条件:
1.虚拟机是Centos7及以上系统
2.虚拟机在NAT模式下能够联网
如果NAT模式不能上网可以看另一期刊(零基础小白都会)
成功解决:CentOS7 NAT模式不能联网-CSDN博客
首先查看系统是否vsftpd软件包
rpm -qa|grep vsftpd
开始安装
sudo yum install vsftpd
如果出现以下的情况:
原因是/etc/yum.repos.d 目录下CentOS-Base.repo文件的镜像源已经过时了,需要改地址
cd /etc/yum.repos.d
vi CentOS-Base.repo
将里面的内容全删掉,(快捷键:50dd) ,将下面的内容粘贴到文件里面
[base]
name=CentOS-7 - Base
failovermethod=priority
baseurl=http://vault.centos.org/centos/7.9.2009/os/x86_64/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[extras]
name=CentOS-7 - Extras
failovermethod=priority
baseurl=http://mirror.centos.org/centos/7/extras/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[updates]
name=CentOS-7 - Updates
failovermethod=priority
baseurl=http://mirror.centos.org/centos/7/updates/x86_64/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
修改后再次使用命令:
sudo yum install vsftpd
三、配置和启动vsftpd服务
(1)匿名开放模式
匿名开放模式是一种FTP服务器的配置方式,允许用户无需提供用户名和密码即可访问服务器上的文件。
1、修改文件之前可以先备份一份,防止文件修改出错后导致不必要的麻烦
cd /etc/vsftpd
2、查看一下当前目录的文件
ls
3、拷贝
当然如果不想拷贝也可以快照保存一份!
4、配置vsftpd.conf文件:
vi /etc/vsftpd/vsftpd.conf
注意:文件里面如果存在下面的代码就不用重写,如果前面有# ,将#去掉即可
anonymous_enable=yes
anon_root=/var/ftp
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_umask=022
write_enable=yes
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名访问 |
anon_root=/var/ftp | 设置匿名用户目录 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 开放匿名用户的其他写入权限(如:重命名、删除等) |
anon_world_readable_only=YES | 只允许匿名用户下载, 默认YES,可不加入 |
write_enable = YES | 设置可写权限 |
anon_umask = 022 | 匿名umask值,默认(目录077,普通文件066) |
尽管在配置文件中设置了这些选项,但FTP服务器仍然需要文件系统权限的支持才能执行这些操作。例如,如果/var/ftp
目录的权限不允许写入,那么即使anon_upload_enable
设置为yes
,匿名用户也无法上传文件。因此,需要确保/var/ftp
目录及其子目录的权限设置正确,以允许匿名用户进行所需的操作。
通常,需要执行以下步骤来修改文件权限:
- 使用
chmod
命令来修改目录和文件的权限,确保匿名用户有足够的权限进行读写操作。 - 使用
chown
命令来更改文件和目录的所有者,如果需要的话。
5、创建文件目录:
mkdir /var/ftp
mkdir /var/ftp/pub
6、修改pub文件的所属主
修改前:
chown -Rf ftp /var/ftp/pub
修改后:
7、修改pub文件权限
修改前:
chmod o+w /var/ftp/pub
修改后:
注意:不要修改ftp文件夹的所属主和权限!!!不然会一直出现登入验证!
这里都不能修改!!!(如果修改了就要改回去!)
8、停止防火墙或设置防火墙允许FTP服务
方法1:
关闭防火墙
systemctl stop firewalld
方法2:
使用firewall-cmd
命令来添加FTP服务规则,这将自动允许控制端口21和数据端口20
sudo firewall-cmd --permanent --add-service=ftp
为了使上述规则立即生效,你需要重新加载防火墙配置
sudo firewall-cmd --reload
9、将SELinux设置为Permissive
检查SELinux状态: 首先,检查SELinux是否正在运行。
getenforce
设置状态:
setenforce 0
注意:启动vsftpd服务之前一定要设置好防火墙和SELinux!!!不然登入vsftpd服务后没有权限上传数据和更改文件!!!
10、打开vsftpd服务
systemctl start vsftpd
可以使用ifconfig查看当前虚拟机的ip地址
11、在windows的地址栏中登入
在pub文件夹里可以随意创建和删除文件(注意:只能在pub文件里,不能在pub同级文件外)
也可以上传文件
回到虚拟机查看pub下面的文件
发现这些文件的所属主是ftp,所以这些文件拥有所有的权限
(2)本地用户模式
1、配置vsftpd.conf文件:
anonymous_enable=no
local_enable=YES
write_enable=YES
local_umask=022
local_root=/share
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁止匿名访问,默认存在 |
local_enable=YES | 允许本地用户模式,默认存在 |
write_enable=YES | 设置可写权限,默认存在 |
local_umask=022 | umask值,默认022存在 |
local_root=/share | 设置本地用户的FTP根目录 |
2、创建/share文件
mkdir /share
3、增加一个用户tom,设置密码为123456
useradd tom
passwd tom
输入两次123456即可
4、修改share文件的权限
修改前:
chmod 1757 /share
修改后:
解释:文件权限中的t
表示“粘滞位”(sticky bit)。粘滞位通常用于目录,而不是普通文件,尽管在某些情况下它也可以应用于可执行文件。
目录中的粘滞位: 当一个目录被设置了粘滞位时,它意味着只有文件的所有者、目录的所有者或root用户可以删除或重命名该目录中的文件。即使其他用户有写权限,他们也不能删除或重命名这些文件。这通常用于共享目录,如/tmp,以防止用户删除或重命名其他用户的文件。例如,/tmp目录通常被设置为粘滞位,以便任何用户都可以在其中创建临时文件,但只有文件的所有者才能删除或重命名这些文件。
5、启动vsftpd之前一定要确保防火墙和selinux是关闭状态!!!
方法1:
关闭防火墙
systemctl stop firewalld
方法2:
使用firewall-cmd
命令来添加FTP服务规则,这将自动允许控制端口21和数据端口20
sudo firewall-cmd --permanent --add-service=ftp
为了使上述规则立即生效,你需要重新加载防火墙配置
sudo firewall-cmd --reload
检查SELinux状态: 首先,检查SELinux是否正在运行。
getenforce
设置状态:
setenforce 0
6、在windows的地址栏中登入
同样可以创建文件、上传文件、删除文件
7、在Linux客户端访问FTP服务
(1)首先安装ftp软件包
yum install ftp
(2)使用ftp命令登入
ftp 192.168.81.128
每台电脑的ip地址不同,输入自己虚拟机的ip(用ifconfig查看)
这样就登入成功了
命令 | 作用 |
---|---|
bye或quit | 退出FTP管理方式 |
chmod | 改变远程主机的文件权限 |
delete | 删除远程主机中的文件 |
get [remote-file] [local-file] | 从远程主机中传送至本地主机中(即:下载) |
? [command] 或者 help[command] | 输出命令的解释 |
ls或者dir | 列出文件 |
put local-file [remote-file] | 将本地一个文件传送至远程主机中(即:上传) |
mget 和 mput | 批量下载和批量上传 |
open host [port] | 重新建立一个新的连接 |
cd,pwd,mkdir | 同Linux下的命令 |
! | 从ftp子系统退出到外层,临时执行命令 |
补充:
在绝大多数情况下,为了系统的安全和稳定性,都要求限制 ftp 用户只能在其主目录下活动,不允许他们跳出主目录之外浏览服务器上的其他目录。这时候就需要使用到chroot_local _user、chroot_list_enable 和chroot_list_file三个配置选项,三个配置项的解释如下。
chroot_local_user,是否将所有用户限制在主目录,YES/NO为启用/禁用(默认NO)。安装vsftpd后不做配置,匿名用户不能切换到主目录之外,而 ftp 本地用户是可以切换到主目录之外的。
chroot_list_enable,是否启动限制用户的名单,YES/NO为启用/禁用(默认NO)。
chroot_list_file =/etc/vsftpd/chroot_list,是否限制在主目录下的用户名单,至于是限制/运行 名单取决于 chroot_local_user的值。
chroot_local_user是一个全局性的设定,YES表示全部用户被锁定于主目录,NO则表示全部用户不被锁定于主目录。为适应一些特殊情况,可能需要作出"微调",即需要一种"例外机制",所以当chroot_list_enable= YES时,表示我们"需要例外",当chroot_list_enable=NO时,表示我们"不需要例外"。
为了更好地理解与应用,利用已经搭建好FTP的本地用户模式,并创建/etc/vsftpd/chroot_list文件,在里面添加tom用户。
vi /etc/vsftpd/chroot_list
然后配置vsftpd.conf文件,chroot_local_user的设置,通常全局禁止跳出主目录,使用chroot_list 文件添加例外,即:先禁止,再开口方式。
chroot_local_user=yes
allow_writeable_chroot = YES
chroot_list_enable=yes
chroot_list_file= /etc/vsftpd/chroot_list
注意:修改后要重启服务
systemctl restart vsftpd
使用windows地址栏登入:
因为chroot_local_user=yes设置了所有用户不能跳出主目录,但是在chroot_list文件中添加了tom并且chroot_list_enable=yes,所以tom用户是个例外可以跳出主目录创建文件或删除
假设文件/etc/vsftpd/chroot_list里写了Jerry用户
选项1 | 选项2 | 效果 |
---|---|---|
chroot_list_enable=YES | chroot_local_user=NO | 所有用户都限制在其主目录下; 使用chroot_list_file指定的用户列表,这些用户作为“例外”,不受限制。 即:Jerry可以切换,Jack不可以切换 |
chroot_list_enable=YES | chroot_local_user=YES | 所有用户都不限制在其主目录下; 使用chroot_list_file指定的用户列表,这些用户作为“例外”,受到限制。 即:Jerry不可以切换,Jack可以切换 |
chroot_list_enable=NO | chroot_local_user=NO | 所有用户都限制在其主目录下; 没有例外。 即:所有的用户(Jerry、Jack)都可以切换 |
chroot_list_enable=NO | chroot_local_user=YES | 所有用户都不限制在其主目录下; 没有例外。 即:所有的用户(Jerry、Jack)都可以切换 |
匿名用户不能跳出主目录,如果增加匿名用户对应主目录的w权限,需要主配置文件中增加allow_writeable_chroot = YES选项
本地用户默认能跳出主目录,可以增加登录用户对应主目录的w权限,可以正常登录。如果设置 chroot_local_user=YES,必须主配置文件中增加allow_writeable_chroot = YES选项,才可以增加登录用户对应主目录的w权限,或更改主目录的所属主或所属组为登录用户,否则会报错,登录失败。