FTP文件传输协议
什么是FTP?
- 百度百科:文件传输协议(英文:File Transfer Protocol,缩写:FTP)是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者由FTP提供,后者由如NFS等应用系统提供。
FTP相关信息
FTP工作流程
- 用户通过一个FTP用户接口与FTP交互。
(1)首先,用户提供远程主机的主机名,使本地主机的FTP客户进程建立一个到远程FTP服务器进程的TCP连接;
(2)接着,该用户提供用户标识和口令,作为FTP的一部分在该TCP连接上传送;
(3)一旦该服务器向该用户授权,用户可以将存放在本地文件系统的一个或多个文件复制到远程文件系统。
FTP与HTTP区别
- FTP是带外(out-of-band)传送的,它使用了两个并行的TCP连接来传输文件:控制连接(在两主机间传输控制信息)和数据连接(传输文件)。
而HTTP是在传送文件的同一个TCP里发送请求和响应首部行的,是带内(in-band)传送。 - FTP服务器必须在整个会话期间保留用户的状态,大大限制了FTP同时维护的会话总数。而HTTP服务器是无状态的,不必对任何用户状态进行跟踪。
- 注意:数据连接是非持续的,每一次文件传输都要建立一个新的数据连接。
FTP相关软件包
yum search ftp ##与ftp相关的软件包
- 通常使用vsftp(very secure FTP)作为FTP服务器软件,更为安全一些。
- 通常使用lftp作为FTP客户端软件(相当于我们的浏览器)。
FTP默认配置信息
- FTP默认发布目录
/var/ftp ##ftp服务器的默认发布目录
- FTP使用传输协议:TCP
- FTP端口:20(控制连接)、21(数据传输)
- 相关配置文件
rpm -qc vsftpd ##查看vsftp的配置文件名称
FTP相关状态码
500 | 文件系统权限过大 |
---|---|
530 | 用户认证失败(密码错误或者服务器设置禁止登陆) |
550 | 服务本身功能未开启(说明服务配置有问题) |
553 | 本地文件系统权限过小 |
更详细的状态码:点击这里
部署FTPserver
- 先关闭内核级加强型火墙selinux:(reboot后才会生效)
getenforce ##查看selinux状态:enforcing为开启,disable关闭
vim /etc/sysconfig/selinux ##修改selinux配置文件
reboot
- 安装vsftp(非常安全的FTP服务器软件)、lftp(FTP客户端软件)
前提是提前搭建好yum源,搭建方法点击这里:Linux中yum使用大全
yum install vsftpd lftp -y
systemctl start vsftpd
systemctl enable vsftpd
systemctl status vsftpd
- 设置火墙运行FTP服务
firewall-cmd --list-all ##查看火墙相关的服务
firewall-cmd --permanent --add-service=ftp ##火墙永久允许FTP服务
firewall-cmd --reload ##重载火墙设置,使其生效
- 测试实验:
(1)使用lftp
(2)浏览器地址测试
lftp客户端的一些命令
- 使用以下方式登录FTP服务器:
lftp ftp://用户名[:密码]@服务器地址[:端口] #标准方式,推荐
lftp 用户名[:密码]@服务器地址[:端口]
lftp 服务器地址 [-p 端口] -u 用户名[,密码]
lftp 服务器地址[:端口] -u 用户名[,密码] - 使用方法:
(1)确认当前目录工作
命令 | 本地 | 远程 |
---|---|---|
显示工作目录 | lpwd | pwd |
切换目录 | lcd | cd |
显示文件列表 | !ls | cls |
显示文件列表 | !ls -l | ls |
- 注意:!表示执行本地命令,lftp中没有lls这个指令,所以要用!ls查看本地文件
(2)上传下载
上传 | 下载 | |
---|---|---|
单个文件 | get | put |
多个文件 | mget | mput |
多个线程 | pget | |
目录 | mirror | mirror -R |
- (3)在远程目录中,可以使用以下命令操作文件
统计文件大小 | du |
---|---|
移动、重命名 | mv |
删除 | rm |
创建文件夹 | mkdir |
删除文件夹 | rmdir |
FTP具体配置
- FTP的主要配置是通过修改/etc/vsftpd/vsftpd.conf这个配置文件的相关信息
匿名用户相关配置
- (1)匿名用户是否可以登录
anonymous_enable=YES/NO ##匿名用户是否可以登录
- (2)ftp服务器是否对登录用户可写
write_enable=YES/NO ##登录用户是否可写,实验效果?
- (3)匿名用户上传
上传是对FTP服务器写的动作,所以首先要开启对登录用户可写;其次要开启上传功能。
vim /etc/vsftpd/vsftpd.conf
修改内容:write_enable=YES anon_upload_enable=YES
systemctl restart vsftpd ##完成之后重启服务
- 发现还是无法上传,排查原因,550,说明我们的服务配置有问题。由于我们上传的目录是在vsftp发布目录/var/ftp,查看其权限,发现所属用户和组为root,但是由于上传命令的发起者是FTP,也就是说FTP想对此目录获取root一样的读写权利,我们可以用修改其所属组为FTP,给组用户的权限为7,也可以使用acl权限列表,对此目录加入ftp用户,获取权限也为7,即可。但通常情况下,为了安全,建议只能修改发布目录下目录文件的权限,即修改/var/ftp/pub的权限。
方法一:
chmod 775 /var/ftp/pub
chgrp ftp /var/ftp/pub
方法二:
setfacl -m u:ftp:rwx /var/ftp/pub
getfacl /var/ftp/pub
再次测试,发现生效。
- (4)匿名用户家目录修改
anon_root=/westos
- (5)匿名用户上传文件默认权限修改
anon_umask=022
- (6)匿名用户建立目录
anon_mkdir_write_enable=YES
- (7)匿名用户下载
anon_world_readable_only=NO ##匿名用户只读为NO,表示不只是读,可以下载get
- (8)匿名用户可对共享目录进行删除操作
anon_other_write_enable=YES ##匿名用户其他写功能,删除、重命名(mv)
- (9)匿名用户使用的用户身份修改
chown_uploads=YES ##修改用户是否可以上传
chown_username=student ##修改用户身份为student
chown_upload_mode=0644 ##修改用户上传的文件权限
- (10)最大上传速率
anon_max_rate=102400 #单位是字节(bytes)
测试:
- (11)能够最大连接的客户端数
max_clients=2 #最多两个客户端同时访问ftp服务器
本地用户相关配置
- (1)本地用户是否可以登录,是否可写
local_enable=YES/NO ##本地用户是否可以登录
write_enable=YES/NO ##本地用户写权限限制
- (2)本地用户家目录修改
local_root=/dir
- (3)本地用户上传文件权限
local_umask=077
- (4)限制本地用户浏览/目录
chroot_local_user=YES #所有用户被锁定到自己的家目录中
对比图
chmod ugo-w /home/* ##用户家目录去除写权限后才可以浏览自己的家目录,可能跟chroot_local_user冲突
- (5)用户限制访问黑名单(只能访问自己家目录,不能访问服务器上其他目录)
chroot_local_user=NO ##黑名单
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
在/etc/vsftpd/chroot_list 写入黑名单用户即可。
- (6)用户限制访问白名单
chroot_local_user=YES ##白名单
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
- (7)用户登录黑名单:a.永久黑名单(优先级最高);b.临时黑名单
vim /etc/vsftpd/ftpusers ##用户黑名单
vim /etc/vsftpd/user_list ##用户临时黑名单
- (8)用户登录白名单
当永久黑名单(级别高)中出现用户westos时,及时白名单中有westos,也不能登录!
vim /etc/vsftp/vsftpd.conf
写入:userlist_deny=NO ##让黑名单变为白名单
vim /etc/vsftpd/user_list ##参数设定,文件变成用户白名单,只在名单中出现的用户才可以登录ftp
虚拟用户相关配置
- 作用:为了安全,需要使用虚拟账户登录服务器,一方面方便管理,一方面获取本地用户的权限不安全。
- (1)创建虚拟用户信息
vim /etc/vsftpd/loginFile ##文件名随意,但需要一定可读性
- (2)对虚拟用户信息文件加密
db_load -T -t hash -f /etc/vsftpd/loginFile /etc/vsftpd/loginFile.db ##哈希加密
- (3)创建认证文件
vim /etc/pam.d/loginFile ##在认证目录下创建一个文件,此文件就是下面需要用的认证文件
文件内容:
auth required pam_userdb.so db=/etc/vsftpd/loginFile ##使用认证程序为pam,加密文件为loginFile
account required pam_userdb.so db=/etc/vsftpd/loginFile ##用程序来看一个这个文件里是否存在此账户
- (4)开启虚拟用户登录功能
vim /etc/vsftpd/vsftpd.conf
写入:
pam_service_name=loginFile ##写上面生成的认证文件,这样默认系统用户不能登录
guest_enable=YES ##开启虚拟用户的功能
- (5)虚拟帐号家目录独立设定:虚拟用户只能查看自己的目录
mkdir -p /var/ftpuserdir/westos{1..3} ##递归的创建目录
vim /etc/vsftpd/vsftpd.conf
写入并重启服务:
local_root=/var/ftpuserdir/$USER
user_sub_token=$USER
mkdir /var/ftpuserdir/westos{1..3}/pub
touch /var/ftpuserdir/westos1/file1
touch /var/ftpuserdir/westos2/file2
touch /var/ftpuserdir/westos3/file3
- (6)实验:
独立的虚拟用户相关配置
- 为了使每个虚拟用户的功能不一,或者说权限不一,所以需要独立配置虚拟用户
- (1)虚拟帐号家目录独立设定:虚拟用户只能查看自己的目录
mkdir -p /var/ftpuserdir/westos{1..3} ##递归的创建目录
vim /etc/vsftpd/vsftpd.conf
写入并重启服务:
local_root=/var/ftpuserdir/$USER
user_sub_token=$USER
注意:$ USER用来表示用户身份,例如:kiosk用户的家目录是/home/kiosk,student用户的家目录是/home/student,所以我们在vsftpd.conf配置文件中将用户家目录修改为/var/ftpdir/$USER。
图
mkdir /var/ftpuserdir/user{1..3}/pub
touch /var/ftpuserdir/user1/file1
touch /var/ftpuserdir/user2/file2
touch /var/ftpuserdir/user3/file3
- (2)虚拟帐号配置独立
- 1>首先,修改其家目录权限,使FTP用户也可以对其进行写的操作
方法一:
chmod 775 /var/ftpuserdir/westos*/pub
chgrp ftp /var/ftpuserdir/westos*/pub
方法二:
setfacl -m u:ftp:rwx /var/ftpuserdir/westos*/pub
getfacl /var/ftpuserdor/westos*/pub
- 2>使用指定的配置文件对虚拟用户配置参数
mkdir -p /etc/vsftpd/user_config
vim /etc/vsftpd/user_config/user1
写入相关参数:
anon_upload_enable=YES
图
- 3>修改vsftp配置文件,使其生效
vim /etc/vsftpd/vsftpd.conf
写入:
user_config_dir=/etc/vsftpd/user_config ##指定用户配置文件目录
图
- 4>实例: