Linux之FTP文件共享服务

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之FTP文件共享服务相关的知识,希望对你有一定的参考价值。

FTP文件共享服务概述

FTP服务介绍

FTP(File Transfer Protocol)是一种应用非常广泛并且古老的一个互联网文件传输协议。

在这里插入图片描述
主要功能

  • 文件传输=>文件上传与文件下载
  • 主要用于互联网中文件的双向传输(上传/下载)、文件共享
  • 跨平台 Linux、Windows
  • FTP是C/S架构,拥有一个客户端和服务端,使用TCP协议作为底层传输协议,提供可靠的数据传输
  • FTP的默认端口 21号(命令端口) 20号(数据端口,主动模式下) 默认被动模式下
  • FTP程序(软件)vsftpd

FTP服务的服务端工具

FTP软件名称 => vsftpd => vs(very secure ftp daemon)

FTP服务的客户端工具

  • Linux:ftp、lftp(客户端程序)
  • Windows:FlashFXP(虚拟主机)、FileZilla、IE、Chrome、Firefox

lftp和ftp工具区别:

  • lftp:默认是以匿名用户访问
  • ftp:默认是以用户名/密码方式访问
  • lftp可以批量并且下载目录

Linux下ftp客户端管理工具使用方法

  • 常用于用户名密码的管理
    ftp命令:
# yum install ftp -y	=>	下载工具
# ftp 远程服务器IP		=>	登录方式,输入用户名和密码

#l 常用命令
ftp> ?或help	=>	求帮助命令
ftp>ls			=>	查看当前连接的FTP目录下有哪些文件。
ftp> quit		=>	退出

Ctrl  + Shift + L	=>	代表清屏快捷键

help+命令:ftp> help put		=>	针对某个文件求帮助
			put          send one file	=>	上传文件

#l 单文件上传下载
	put命令:ftp>ftp> put 本地文件路径+名称	 上传(send命令速度更快)
	get命令:ftp> get 远程文件路径+名称		 下载

#l 批量文件上传下载
	mput命令:ftp> mput 文件名称1 文件名称2 文件名称3 ...	批量上传
	mget命令:ftp> mget 文件名称1 文件名称2 文件名称3 ...	批量下载

#l prompt屏蔽批量输出信息
	ftp> prompt
	Interactive mode on.	=> 开启提示
	ftp> prompt
	Interactive mode off.	=> 关闭提示

Linux下lftp客户端管理工具使用方法

  • 常用于匿名账号的管理
  • 主要针对整站下载和文件夹下载
    lftp命令:
# yum install lftp -y		=>	下载工具
# lftp 用户名称@远程IP地址	=>	登录方式,输入密码登录

#l 常用命令
ftp> ?或help	=>	求帮助命令

help+命令:ftp> help mirror		=>	针对某个文件求帮助


#l 批量上传下载命令
	lftp> mirror -R 本地文件夹名称	=>	批量上传(把shop文件夹上传到FTP服务器端
	lftp> mirror 远程FTP路径			=>	批量下载(把整个FTP下载到本地)

FTP的两种运行模式

在FTP服务中,其一共拥有两种模式(主动模式 + 被动模式

  • 参考点,FTP的服务器端。如果是FTP服务器端主动连接客户端=>主动模式,如果是客户端主动连接FTP服务器端=>被动模式。
  • FTP默认使用的就是被动模式!

主动模式

在这里插入图片描述

  • cmd:命令端口(发送FTP请求)
  • data:数据端口(后期用于传输数据)

主动模式工作原理:

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务端的21号端口发起请求
  2. 服务端的21号命令端口响应客户端的随机命令端口
  3. 服务端的20号端口主动请求连接客户端的随机数据端口
  4. 客户端的随机数据端口进行确认

主动模式容易被客户端的防火墙拦截
客户端发起连接请求,发送打开的随机数据端口信息

被动模式

在这里插入图片描述
被动模式工作原理:

  1. 客户端打开大于1023的随机命令端口和大于1023的随机数据端口向服务的的21号端口发起请求
  2. 服务端的21号命令端口响应客户端的随机命令端口
  3. 客户端主动连接服务端打开的大于1023的随机数据端口
  4. 服务端进行确认

客户端不会拦截自身往外发送的请求
客户端发起连接请求,发送PASY命令

搭建FTP服务

服务搭建流程:

1. 关闭防火墙和selinux
2. 配置yum源(mount /dev/sr0 /mnt)
3. 软件三部曲
4. 了解配置文件
5. 根据需求修改配置文件来完成服务的搭建
6. 启动服务,开机自启动
7. 测试验证

服务器端搭建FTP服务

第一步:关闭防火墙与SELinux

# systemctl stop firewalld
# systemctl disable firewalld

# setenforce 0
# vim /etc/selinux/config
	SELINUX=disabled

第二步:配置YUM源

https://jinyi.blog.csdn.net/article/details/116139354

第三步:安装vsftpd软件(FTP => vsftpd)

# yum install vsftpd -y

第四步:启动ftp服务并添加到开机启动项中

# systemctl start vsftpd
# systemctl enable vsftpd

第五步:测试FTP是否安装成功

# ifconfig ens33	=>	查看FTP IP 
	[root@localhost ~]#  ifconfig ens33
	ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    	    inet 10.1.1.10  netmask 255.255.255.0  broadcast 10.1.1.255

查看默认登录目录存储位置:

# find / -name "pub" -type d
	[root@localhost ~]# find / -name "pub" -type d
	find:/run/user/1000/gvfs’: Permission denied
	/var/ftp/pub	=>	默认登录目录存放位置
  • 基于浏览器访问
    浏览器访问时访问不到,需要将IE 浏览器 => internet选项 => 高级 => 使用被动FTP选项关掉
    在这里插入图片描述

  • 基于FlashFxp、FileZilla软件(Windows客户端)
    在这里插入图片描述

  • 基于ftp以及lftp命令进行连接(Linux与Linux之间的FTP文件传输)

# yum install ftp lftp -y	=>	安装lftp和ftp Linux客户端,相当于两个小命令
# ftp 10.1.1.10		=>	使用ftp软件匿名连接ftp服务器# lftp 10.1.1.10		=>	使用lftp软件匿名连接ftp服务器

FTP服务的配置文件详解

vsftpd 服务端软件生成了哪些文件:

# yum install vsftpd -y		=>	安装ftp服务
# rpm -ql vsftpd
	/usr/lib/systemd/system/vsftpd.service	=>	启动脚本
	
	/etc/vsftpd					=>	配置文件的目录
	/etc/vsftpd/vsftpd.conf		=>	配置文件(主配置文件)
	
	/etc/vsftpd/ftpusers		=>	用户列表文件,黑名单
	/etc/vsftpd/user_list		=>	用户列表文件,可黑可白(默认是黑名单)
	
	/usr/sbin/vsftpd		=>	程序本身(二进制的命令)
	
	/var/ftp			=>	匿名用户的默认数据根目录
	/var/ftp/pub		=>	匿名用户的扩展数据目录

vsftpd配置文件详解:/etc/vsftpd/vsftpd.conf

# man  5  vsftpd.conf 	=>	当不清楚配置文件编写方式时候,用次命令查看配置文件编写方式

# grep -v ^# /etc/vsftpd/vsftpd.conf
	anonymous_enable=YES		=>	支持匿名用户访问	
	local_enable=YES			=>	支持非匿名用户,普通账号登录,默认进入到自己家目录
	write_enable=YES			=>	写总开关(主要针对非匿名用户,代表普通用户登录拥有上传下载权限)
	local_umask=022				=>	反掩码  file:644  rw- r-- r-- dir:755
	dirmessage_enable=YES		=>	启用消息功能
	xferlog_enable=YES			=>	开启或启用xferlog日志
	connect_from_port_20=YES	=>	支持主动模式(默认被动模式)
	xferlog_std_format=YES		=>	xferlog日志格式
	listen=YES					=>    ftp服务独立模式下的监听,默认监听21端口

	pam_service_name=vsftpd		=>	指定认证文件
	userlist_enable=YES			=>	启用用户列表(黑名单),当开启这个功能,往/etc/vsftpd/user_list文件写入黑名单账号
	tcp_wrappers=YES			=>	支持tcp_wrappers功能(FTP上传下载限速操作)

FTP访问对象控制(黑名单)

  • ftpusers 黑名单

  • user_list 默认是黑名单(可以成为白名单)

  • 默认情况下,root账号是不允许登录FTP服务器( 原因:root用户在黑名单/etc/vsftpd/ftpusers和黑名单/etc/vsftpd/user_list中)

# cat /etc/vsftpd/ftpusers 		=>	查看黑名单,默认不被允许登录FTP服务器的账号;需要删除两个黑名单中root账号才可以登录
[root@code ~]# cat /etc/vsftpd/ftpusers 
...
root
...

#	ftpusers 与 user_list黑名单效果不同点
	ftpusers:
		[root@localhost ftp]# ftp 10.1.1.10
		Connected to 10.1.1.10 (10.1.1.10).
		220 (vsFTPd 3.0.2)
		Name (10.1.1.10:root): kefu
		331 Please specify the password.
		Password:
		530 Login incorrect.			=>       ftpusers被禁用,可以输入密码,返回530
		Login failed.


	user_list:
		[root@localhost ftp]# ftp 10.1.1.10
		Connected to 10.1.1.10 (10.1.1.10).
		220 (vsFTPd 3.0.2)
		Name (10.1.1.10:root): kefu
		530 Permission denied.
		Login failed.
		原因:默认情况下user_list文件也是黑名单,如果在该文件里直接拒绝,不给输入密码的机会。


#	user_list可以从黑名单变成白名单(允许某个用户登录FTP系统服务器)
	user_list要成为白名单,需要再配置文件里增加:
	# vim /etc/vsftpd/vsftpd.conf
		userlist_deny=NO	=>	增加一行,让user_list可以从黑名单变成白名单
	注意:如果user_list是白名单,那么必须在该文件里的用户才可以访问ftp服务。
		#l 当黑白名单文件有同一账号,以黑名单文件ftpusers 为准

总结:

  1. 用户在ftpusers文件中,那么用户不能访问ftp服务器
  2. 用户在user_list文件中,如果该文件是白名单,那么只在该文件中的用户可以访问ftp服务
  3. 如果user_list文件是白名单,用户即在ftpusers中又在user_list中,那么ftpusers拒绝优先

FTP网络访问控制(限IP+限速)

  • FTP必须支持tcp_wrappers

  • /etc/hosts.allow 允许某些IP访问

  • /etc/hosts.deny 拒绝某些IP访问

在这里插入图片描述

如何判断某个服务是否支持tcp_wrappers:

  • ./configure –enable-libwrap 表示支持tcp_wrappers访问控制(源码安装看配置项)

  • rpm安装(也包括yum安装)

#l 源码包安装时增加--enable-libwrap选项
	# ./configure --enable-libwrap	=>	查看配置


#l rpm软件包安装和yum安装
	# ldd命令 +二进制程序,查询某个软件包含哪些模块		=>基本语法

	# ldd /usr/sbin/vsftpd |grep libwrap*	=>	查询vsftpd是否支持tcp_wrappers,有libwrap.so.0 代表支持
		libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f2956480000)

	# ldd /usr/sbin/sshd |grep libwrap*		=>	查询vsftpd是否支持tcp_wrappers,有libwrap.so.0 代表支持
		libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f015ff29000)

限制FTP流量

# vim /etc/vsftpd/vsftpd.conf	=>	打开ftp配置文件,增加一行
	local_max_rate=0	=>	0代表不限速,默认单位为字节如:local_max_rate=1024
	写法:local_max_rate=数值 + 字节

限制IP地址

服务程序:主机	=>	基本语法

# vim /etc/hosts.deny	=>	编辑IP黑名单文件
	vsftpd:all              =>   全部拒绝
	vsftpd:192.168.0.254	=> 	 拒绝单个IP地址

	vsftpd:all EXCEPT 192.168.0.2   =>  拒绝所有除了192.168.0.2  
	vsftpd:192.168.0.254:allow		=>	允许192.168.0.254访问,类似/etc/hosts.allow里增加vsftpd:192.168.0.254

	vsftpd:192.168.0.0/255.255.255.0   拒绝某个网段
	vsftpd:192.168.0.0/255.255.255.0 EXCEPT 192.168.0.254   拒绝某个网段,但是除了某个ip地址
	注意:子网掩码不支持192.168.0.0/24这种写法


#l 多个服务限制IP
# vim /etc/hosts.deny
	vsftpd,sshd:10.1.1.1

任务解决方案

任务背景

简单来说:根据我们所学的内容(FTP)搭建一个客户服务系统(主要涉及客服资料上传与下载)

  1. 客服人员必须使用用户名密码(kefu/123)的方式登录服务器来下载相应文档
  2. 不允许匿名用户访问
  3. 客服部门的相关文档保存在指定的目录里/data/kefu local_root=/data/kefu
  4. 客服用户使用用户kefu/123登录后就只能在默认的/data/kefu目录里活动

解决方案

# useradd kefu		=>	创建客服账号(Server)
# echo 123 |passwd --stdin kefu		=>	给账号编写密码
# mkdir /data/kefu -p		=>	创建用户ftp登录时的目录


# vim /etc/vsftpd/vsftpd.conf		=>	修改配置文件
	12行 anonymous_enable=NO		=>	YES改为NO,不允许匿名用户访问
	17行 local_root=/data/kefu		=>	增加一行,默认ftp登录目录为用户家目录,指定本地用户登录时访问的目录
	18行 chroot_local_user=YES		=>	限定 kefu/123 账号等本地用户只能在/data/kefu目录下活动

# systemctl restart vsftpd			=>	重启服务让配置文件生效

禁锢目录补充

禁锢所有用户

# vim /etc/vsftpd/vsftpd.conf
	18行 chroot_local_user=YES  禁锢所有用户,即所用用户登录FTP时只能处于禁锢目录内

给一小部分用户开通非禁锢权限

# vim /etc/vsftpd/vsftpd.conf
	103 chroot_local_user=YES		=>	禁锢所有用户
	105行 chroot_list_enable=YES	=>	开启用户列表文件
	107行 chroot_list_file=/etc/vsftpd/chroot_list	指定用户列表文件,在此文件中的用户不会被禁锢在禁锢目录中,可以访问其他目录

# echo kefu >> /etc/vsftpd/chroot_list        代表客服这个账号不会被禁锢在指定目录


# systemctl restart vsftpd

FTP服务错误提示

响应: 500 OOPS: vsftpd: refusing to run with writable root inside chroot()

  • 当限定本地用户登录目录 /data/kefu 后,对FTP服务器上传下载会出现以上报错
  • 这个问题主要出现在FTP2.3.5以后的版本中,当然你可以使用 rpm -qi vsftpd 查看版本信息
  • 高版本为了服务器安全性考虑,当禁锢目录 /data/kefu 具有写的权限就拒绝连接
# chmod a-w /home/dhj	=>	去除写权限(治标不治本,只能下载不能上传)# vim /etc/vsftpd/vsftpd.conf	=>	 核心解决方案,添加一个选项
	19行 allow_writeable_chroot=YES		=>	允许禁锢目录/data/kefu 具有写的权限

响应: 553 Could not create file.

  • 用户具有下载权限,但是没有上传权限。响应533错误信息
  • 之所以无法上传,主要原因在于kefu这个账号对于/data/kefu文件夹没有w写权限
[root@code ~]# ll -d /data/kefu/
drwxr-xr-x. 2 root root 82 May  1 14:00 /data/kefu/

# setfacl -R -m u:kefu:rwx /data/kefu	=>	利用acl命令对用户增加写权限
# systemctl restart vsftpd		=>	重启服务

FTP协议引用第三方平台视频

第一步:在Linux电脑中安装httpd(阿帕奇)

# yum install httpd -y		=>	第一步:在Linux电脑中安装httpd(阿帕奇)
# systemctl start httpd		=>	第二步:启动httpd
# vim /var/www/html/demo.html	=>	第三步:在/var/www/html项目目录中创建一个demo.html文件
	<iframe height=498 width=815 src='https://player.youku.com/embed/XNDU4OTM3NzM0NA==' frameborder=0 'allowfullscreen'></iframe>
	#l 备注:引用视频网站的代码

#l 访问:ftp://10.1.1.10/demo.html

以上是关于Linux之FTP文件共享服务的主要内容,如果未能解决你的问题,请参考以下文章

linux之使用samba实现文件共享

运维基本功(十九):文件共享服务之FTP解决方案

Linux基础服务之FTP

文件共享之nfs

linux架构学习第二十九天之samba文件共享服务

Linux网络之YUM仓库的补充和NFS共享服务