FTP概述
FTP服务(File Transfer Protocol服务,文件传输协议服务)
是一种用于在网络上传输文件的协议。FTP服务允许用户将文件从一个计算机(本地主机)传输到另一个计算机(远程主机),或者从远程主机接收文件到本地主机。这种传输是基于客户端-服务器模式的,其中用户使用的本地计算机作为客户端,而提供文件存储和访问的远程计算机作为服务器
传输连接与传输模式
FTP客户端和服务器之间的连接,主要用于发送命令和接收响应消息。当用户使用FTP时,首先会建立控制连接。客户端通过这条连接向FTP服务器发送命令,服务器会回复响应消息,表明客户端命令的执行情况。
控制连接
用于实际的文件传输。控制连接建立后,当用户想要上传或下载文件时,会建立数据连接
数据连接的主动模式(PORT)
1.FTP客户端会向服务器的21端口发起连接以建立命令通道
2.当需要传输数据时,客户端会发送PASV命令给服务器,要求服务器进入被动模式
3.服务器收到命令后,会打开一个大于1024的随机端口(P)进行监听,并通过命令通道告诉客户端这个端口号
4.客户端收到端口号后,会主动连接服务器的这个端口进行数据传输
数据连接的被动模式(PASV)
1.FTP客户端会向服务器的21端口发起连接以建立命令通道
2.当需要传输数据时,客户端会发送PASV命令给服务器,要求服务器进入被动模式
3.服务器收到命令后,会打开一个大于1024的随机端口(P)进行监听,并通过命令通道告诉客户端这个端口号
4.客户端收到端口号后,会主动连接服务器的这个端口进行数据传输
传输模式
ASCII模式: 用于传输文本文件,它会在传输过程中对文件进行转换以确保在不同的操作系统之间正确显示
二进制模式: 用于传输所有其他类型的文件,它不会进行任何转换,直接传输文件的原始字节
FTP用户类型
匿名用户
登录FTP服务器时并不需要特别的密码就能访问服务器。一般匿名用户的用户名为ftp或者anonymous
常用匿名用户ftp配置项: anonymous_enable=YES #启用匿名访问 anon_umask=022 #匿名用户所上传文件的权限掩码 anon_root=/var/ftp #匿名用户的ftp根目录 anon_upload_enable=YES #允许上传文件 anon_mkdir_write_enable=YES #允许创建目录 anon_other_write_enable=YES #开放其他写入权 anon_max_rate=0 #限制最大传输速率(字节/秒)
本地用户
具有本地登录权限的用户。这类用户在登录FTP服务器时,所用的登录名为本地用户名,采用的密码为本地用户的口令。登录成功之后,用户会进入本地用户的家目录
本地用户常用配置: local_enable=YES #是否启用本地系统用户 write_enable=YES #是否允许用户上传文件 local_umask=022 #本地用户所上传文件的权限掩码 local_max_rate=0 #限制最大传输速率(字节/秒)
虚拟用户
虚拟用户只具有从远程登录FTP服务器的权限,只能访问为其提供的FTP服务。虚拟用户不具有本地登录权限。虚拟用户的用户名和口令都是由用户口令库指定,一般采用PAM方式进行认证
全局配置
local_root=/var/ftp #设置用户登录后的FTP根目录
chroot_local_user=YES #是否将用户禁锢在主目录
allow_writeable_chroot=YES #允许用户在chroot环境中有一个可写的根目录
搭建与配置FTP
环境准备
关闭防火墙和selinux
systemctl stop firewalld
setenforce 0
安装FTP
##################################服务端#################################
yum -y install vsftpd #服务器安装FTP
systemctl start vsftpd #启动服务
#在/var/ftp/pub/目录下创建一个测试的文件,可在客户端访问
vi /var/ftp/pub/test.txt
##################################客户端#################################
yum -y install ftp #客户端安装FTP
匿名账户登录FTP
ftp 192.168.221.130 #在客户端使用[ftp 服务器IP]命令即可登录FTP
#匿名用户不用密码,直接回车即可登录
##########################下载文件####################################
ls #查看当前目录可以看到有个pub目录,使用dir命令也可以
ls /pub #即可看到已经创建的测试文件test.txt
cd /pub #切换到/pub目录
#这里下载要切换到pub目录,而不是直接用get /pub/test.txt
#是因为ftp客户端只支持传输文件,不支持传输目录
#传输目录需要使用lftp客户端或其他客户端
get test.txt #下载测试文件,文件会下载到登录时所在的目录
quit #退出登录,也可以使用exit命令
ls / #查看根目录就会看到测试文件,我登录时在根目录
##########################上传文件####################################
rm /var/ftp/pub/test.txt #删除服务端的测试文件test.text
vi /etc/vsftpd/vsftpd.conf #服务端编辑FTP配置文件
anonymous_enable=YES #启用匿名访问(默认开启,不用输入)
anon_umask=022 #匿名用户所上传文件的权限掩码
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #开放其他写入权
systemctl restart vsftpd #服务端重启服务后登录客户端
put test.txt #上传test.txt
ls /var/ftp/pub #查看服务端/var/ftp/pub目录,即可看到test.txt
本地用户登录FTP
#############################服务端####################################
useradd zhangsan #在服务端创建用户
passwd zhangsan #设置密码
vi /etc/vsftpd/vsftpd.conf #编辑配置文件
local_enable=YES #是否启用本地系统用户(默认开启不用输入)
local_umask=022 #本地用户所上传文件的权限掩码(默认开启不用输入)
local_root=/var/ftp #设置本地用户的FTP根目录(20行左右输入即可)
chroot_local_user=YES #是否将用户禁锢在主目录(107行左右,取消注释就行)
write_enable=YES #是否允许用户上传文件(默认开启不用输入)
#关于chroot_local_user=YES的配置比较复杂,文章结尾会说
#############################客户端####################################
#删除刚刚下载的测试文件,我在根目录下登录FTP,所在文件会下载到根目录下
rm /test.txt
#使用服务端创建的用户zhangsan登录,密码即为设置的密码
ls /var/ftp/pub/ #即可看到刚刚使用匿名用户上传的test.txt
cd /var/ftp/pub/ #切换目录
get test.txt #下载文件
#然后退出登录到客户端根目录下即可看到test.txt
#删除服务端/var/ftp/pub/test.txt
#客户端再使用张三登录FTP上传test.txt
put test.txt
#此时在服务端即可重新看到test.txt
虚拟用户登录FTP
#################################服务端配置###############################
#创建虚拟用户文件,奇数行为用户名,偶数行为密码
#可以写多个,我这里只用一个
vi /etc/vsftpd/vusers.list
lisi
123
cd /etc/vsftpd/ #切换目录
#使用db_load命令将文本文件转换为数据库文件,
#以哈希格式将这些数据加载到 vusers.db 数据库中
#并使用hash格式进行加密
db_load -T -t hash -f vusers.list vusers.db
chmod 600 /etc/vsftpd/vusers.* #设置权限,确保只有管理员可以访问
vi /etc/pam.d/vsftpd.vu #配置PAM认证文件,添加对虚拟用户数据库的支持
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
#创建一个系统用户作为所有虚拟用户的映射,并设置为不可登录以防止其登录系统
#这里创建系统用户jzrw,指定家目录为/var/ftproot
useradd -d /var/ftproot -s /sbin/nologin jzrw
vi /etc/vsftpd/vsftpd.conf #编辑FTP配置文件,启用虚拟用户登录
#在配置文件末尾
pam_service_name=vsftpd.vu #指定PAM认证文件(已有配置,修改值即可)
guest_enable=yes #启用虚拟用户登录
guest_username=jzrw #指定映射虚拟用户的系统用户
systemctl restart vsftpd #然后重启服务,在客户端使用lisi虚拟用户登录
#不再演示,自己尝试
#这里可以下载,但是不可以上传文件,是因为前面使用本地用户登录时,
#配置文件20行配置了local_root=/var/ftp,从而指定了根目录,而现在所映射
#系统用户没有这个权限写入/var/ftp,只需要注释local_root=/var/ftp,
#并在107行左右加上allow_writeable_chroot=YES即可,或者就是给系统
#用户授予权限
#而且这时是无法使用本地用户登录,因为本地用户的PAM认证在/etc/pam.d/vsftpd中
#但我们指向的文件是/etc/pam.d/vsftpd.vu
关于chroot_local_user=YES
local_root=/var/ftp #设置登录用户的FTP根目录
#当用户登录到FTP服务器,默认会被导航到这个目录
chroot_local_user=YES #将所有用户限制在其主目录中
#当用户登录到FTP服务器,这个默认主目录(FTP根目录)就是在用户的家目录
#但是这个默认的会被local_root=/var/ftp覆盖掉
#为了安全问题,可以用这个设置限制用户切换其他目录,
allow_writeable_chroot=YES #允许用户在chroot环境中有一个可写的根目录
#当启用chroot_local_user=YES配置后,不允许用户访问其他目录,这种环境称为chroot环境
#在FTP(文件传输协议)中,chroot环境是一个重要的安全机制
#chroot(Change root)是Linux中的一个命令,用于改变进程的根目录,使得进程只能访问
#指定的目录及其子目录,从而限制用户在系统上的活动范围
#在chroot环境下,许多FTP服务器软件不允许在chroot环境中有一个可写的根目录,因为这可
#能允许用户执行不受限制的操作,甚至可能逃逸出chroot环境,所有FTP会拒绝登录请求
#而allow_writeable_chroot=YES就是允许有这个可写的根目录,这样就可以登录,但是会
#增加安全风险
系统用户登录权限
vi /etc/vsftpd/user_list
#打开这个文件就可以看到,默认root用户是无法登录FTP的
#在/etc/vsftpd/vsftpd.conf配置文件中
#当userlist_enable=YES 时,vsftpd 会检查这个文件
#如果userlist_deny=YES(默认值)则 user_list文件中的用户将被拒绝访问 FTP 服务器。
#这类似于ftpusers 文件,但通常用于定义额外的用户限制
#如果userlist_deny=NO,则只有列在 user_list 文件中的用户才被允许访问 FTP 服务器,其他所有用户都将被拒绝
#ftpusers是一个固定的黑名单,列在其中的用户无论如何都不能通过 FTP 访问服务器