FTP服务
File Transfer Protocol,文件传输协议,应用层的文件共享服务
是互联网控制文件实现双向传输,同样ftp也是一个应用程序,不同系统对应的应用程序也不同,但是遵循同一个协议
原理
假设有在两台主机,一台主机远程连接的服务器为文件共享服务器,本地主机为客户端在两台主机正常建立连接的情况下可以通过本地主机基于ftp协议访问服务器的文件并将文件下载到本地。如果同样服务器允许客户端写入可以将本地文件上传到服务器。
文件传送(file transfer) 和文件访问(file access)之间的区别在于传送由FTP提供,访问由如NFS等应用系统提供
FTP优缺点
优点:
- 促进文件的共享(计算机程序或数据)
- 向用户屏蔽不同主机中各种文件存储系统(File system)的细节
- 支持任意类型的文件传输
- 实现用户认证
缺点:
- 密码和文件内容都使用明文传输,可能发生窃听。
- 因为必须开放一个随机的端口以创建连接,当防火墙存在时,客户端很难过滤处于主动模式下的FTP流量。这个问题,通过使用被动模式的FTP,得到了很大解决。
- 服务器可能会被告知连接一个第三方计算机的保留端口。
- 此方式在需要传输文件数量很多的小文件时,性能不好
应用程序架构(C/S)
- 客户端
- 服务端
用户分类
- ftpReal账户(本地用户/系统用户)
这类用户是指在FTP服务上拥有帐号。当这类用户登录FTP服务器的时候,其默认的主目录就是其帐号命名的目录。但是,其还可以变更到其他目录中去。如系统的主目录等等(本地用户登录验证身份)
- ftpGuest用户(虚拟用户)
在FTP服务器中,我们往往会给不同的部门或者某个特定的用户设置一个帐户。但是,这个账户有个特点,就是其只能够访问自己的主目录。服务器通过这种方式来保障FTP服务上其他文件的安全性。这类帐户,在Vsftpd软件中就叫做Guest用户。拥有这类用户的帐户,只能够访问其主目录下的目录,而不得访问主目录以外的文件。一个本地用户身份虚拟为多个身份(通过虚拟用户身份验证登录)
- ftpAnonymous(匿名用户)
这也是我们通常所说的匿名访问。这类用户是指在FTP服务器中没有指定帐户,但是其仍然可以进行匿名访问某些公开的资源。
在组建FTP服务器的时候,我们就需要根据用户的类型,对用户进行归类。默认情况下,Vsftpd服务器会把建立的所有帐户都归属为Real用户。但是,这往往不符合企业安全的需要。因为这类用户不仅可以访问自己的主目录,而且,还可以访问其他用户的目录。这就给其他用户所在的空间带来一定的安全隐患。所以,企业要根据实际情况,修改用户所在的类别。任何同一个ID身份登录(不需要用户验证)
使用方式
端口
- TCP20 命令端口
- TCP21 数据端口
传输方式
-
ASCLL传输方式
假定用户正在考贝的文件包含的简单ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。但是常常有这样的情况,用户正在传输的文件包含的不是文本文件,它们可能是程序,数据库,字处理文件或者压缩文件。在拷贝任何非文本文件之前,用binary命令告诉ftp逐字拷贝。 -
二进制传输方式
在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位——对应的。即使目的地机器上包含位序列的文件是没意义的。例如,macintosh以二进制方式传送可执行文件到Windows系统,在对方系统上,此文件不能执行。
模式
- 主动模式
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据(20)端口到客户端端口(>1023) (服务器初始化数据连接到客户端数据端口)
FTP服务器数据(20)端口接受客户端端口(>1023)(客户端发送ACK包到服务器的数据端口)
如图:
- 被动模式
FTP服务器命令(21)端口接受客户端任意端口(客户端初始连接)
FTP服务器命令(21)端口到客户端端口(>1023)(服务器响应客户端命令)
FTP服务器数据端口(>1023)接受客户端端口(>1023)(客户端初始化数据连接到服务器指定的任意端口)
FTP服务器数据端口(>1023)到客户端端口(>1023)(服务器发送ACK响应和数据到客户端的数据端
如下图:
主动方式数据是通过server器主动建立响应
被动方式:数据服务端基于被动方式响应
优缺点:
主动模式对ftp对服务器管理有利,是由FTP服务器主动与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞。而被动模式对客户端管理有效,它是企图与服务端的随机端口建立连接但是这个端口很可能又会被服务端的防火墙所拒绝。|
主配置文件: vim /etc/vsftpd/vsftpd.conf
从配置文件: vim /etc/ftp/pub
主配置文件内容详解
anonymous_enable=YES 是否启用匿名用户
local_enable=YES 启用本地用户访问
write_enable=YES 允许写入(本地用户要实现上传就需要快开启它)
local_umask=022 默认本地用户上传普通文件权限644 755
dirmessage_enable=YES 显示每个目录下的文件信息
xferlog_enable=YES 日志启用
connect_from_port_20=YES 主动请求的数据端口
chown_uploads=YES 所有匿名用户上传的文件所属用户将会被改成chown_username
chown_username=whoever 匿名上传的所属用户名是whoever
xferlog_file=/var/log/xferlog 启用的日志文件
xferlog _std_format=YES 日志的标准格式
idle_session_timeout=600 空闲连接超时data_connection_timeout=120数据连接超时
nopriv_user=ftpsecure 当服务器运行于最底层时使用的用户名
chroot_list_enable=YES
chroot_local_user=YES 所有文件列出用户,可以切换到其他目录
chroot _list_file=/etc/vsftpd/chroot_list
pam_service_name=vsftpd 设置PAM认证模块使用名称预设为vsftpd
userlist_enable=YES
listen=NO 服务将自己监听处理listen_ipv6=YES
pam_service_name=vsftpd 设置PAM认证模块使用名称预设为vsftpduserlist_enable=YES
tcp_wrappers=YES 服务端和客户端访问控制策略(服务器级别的一种防火墙)
NFS服务
什么是NFS服务
NFS就是Network File System的缩写,最大的功能就是可以通过网络,让不同的机器、不同的系统可以共享彼此的文件
NFS文件访问
NFS服务器可以让PC网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的磁盘分区一样,在使用上相当便利
同一挂载点可以连接多个设备
一个设备可以连接多个挂载点
NFS挂载原理
挂载结构图
如上图:
当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df -h。|
既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了.RPC服务(portmap 或rpcbind服务)
什么是rpc服务
RPC (Remote Procedure Call)即远程过程调用。RPC最主要的功能就是在指定每个NFS功能所对应的portnumber,并且回报给客户端,让客户端可以连结到正确的port上去
NFS通讯原理
rpc和nfs如何通讯
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,让客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs -rv即可使修改的/etc/exports生效。
protmap
功能:
主要是把RPC程序转化为Internet的端口号
特点:
只在第一次建立连接时帮助网络应用程序找到正确的port,当双方正确连接时,端口号就和应用绑定,portmap就无用。
NFS客户端和NFS服务端通讯过程
- 首先服务器端启动RPC服务,并开启111端口
- 服务器端启动NFS服务,并向RPC注册端口信息
- 客户端启动RPC (portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
- 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS工作流程
NFS服务优缺点
优点:
- 节省本地存储空间将常用的数据存放在一台服务器可以通过网络访问
- 简单容易上手
- 方便部署非常快速,维护十分简单
缺点:
- 局限性容易发生单点故障,及server机宕机了所有客户端都不能访问
- 在高并发下NFS效率/性能有限
- 客户端没用用户认证机制,且数据是通过明文传送,安全性一般(一般建议在局域网内使用)
- NFS的数据是明文的,对数据完整性不做验证
NEF服务部署
必须安装nfs-server主程序和rpcbind
常用命令
systemctl restart nfs-server 启动NFS服务
systemctl restart rpcbind 启动rpc服务
lostof 列出当前系统打开文件的工具
netstat ss显示个各种网络相关信息,如网络连接,路由表,接口状态等;
ps aux | ef 进程详解
showmount -e 服务端Ip
exportfs -ra 配置文件重新激活
常用目录和文件
/etc/exports
/usr/sbin/exportfs
/usr/sbin/showmount
/var/lib/nfs/*tab
etab 记录NFS分享出来的目录的完整权限设定值
xtab 记录曾经链接到此NFS主机的相关客户端数据
## 配置文件
/etc/exports
格式:
共享目录 客户端(选项)------(访问权限,用户映射,其他)
例如:/test 192.168.159.128(rw) 共享/test目录 指定ip地址的主机权限为rw
客户端
指定IP地址的主机:192.168.159.128
指定子网中的所有主机:192.168.159.0/24,192.168.159.0/255.255.255.0
指定域名的主机:www.baidu.com
指定域名中的所有主机:*.baidu.com
所有主机:*
访问权限选项:
案例一
在主机配置FTP服务
要求:在openlab公司教学部建立一个文件系统服务器
实现所有用户在基于虚拟用户身份登录到该部门的ftp文件系统服务器,访问的文件系统根目录为/home/teacher目录
(虚拟用户分别为:lucy,lack,david,dylan密码是openlab)
挂载
[root@redhat ~]# mount /dev/sr0 /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
安装vsftpd
[root@redhat ~]# yum intall vsftpd -y
Installed:
vsftpd-3.0.3-32.el8.x86_64
Complete!
重启服务、关闭防火墙、关闭SElinux
[root@redhat ~]# systemctl restart vsftpd
[root@redhat ~]# systemctl stop firewalld
[root@redhat ~]# setenforce 0
创建系统用户,并禁止该用户登录
[root@redhat ~]# useradd -s /sbin/nologin teacher
修改主配置文件,添加我注释的选项
[root@redhat ~]# vim /etc/vsftpd/vsftpd.conf
创建虚拟用户文件、格式一行为用户名,一行为密码,
[root@redhat ~]# vim /etc/vsftpd/vfile
将虚拟用户文件转换成用户数据库文件
[root@redhat ~]# db_load -T -t hash -f /etc/vsftpd/vfile vfile.db
更改修改PAM认证方式、编辑认证配置文件
[root@redhat ~]# vim /etc/pam.d/vuser
//添加以下两行内容
auth required pam_userdb.so db=/etc/vsftpd/vfile
account required pam_userdb.so db=/etc/vsftpd/vfile
在新建文件测试
[root@redhat ~]# touch /home/teacher/{1,2,3,4}
重启服务
[root@redhat ~]# systemctl restart vsftpd
案例二
架设一台NFS服务器,并按照以下要求配置
查看是否安装nfs和rpc服务
[root@redhat ~]# rpm -qa | grep nfs
nfs-utils-2.3.3-35.el8.x86_64
libnfsidmap-2.3.3-35.el8.x86_64
sssd-nfs-idmap-2.3.0-9.el8.x86_64
[root@redhat ~]# rpm -qa | grep rpcbind
rpcbind-1.2.5-7.el8.x86_64
启动服务
启动nfs服务时如果rpc服务未启动则跟着启动
[root@redhat ~]# systemctl restart nfs-server.service
1、开放/nfs/shared目录,供所有用户查询资料
修改主配置文件
[root@redhat ~]# vim /etc/exports
//添加如下信息
/nfs/shared *(ro)
根据配置文件添加资源
[root@redhat ~]# mkdir /nfs/shared -p
[root@redhat ~]# touch /nfs/shared/{1,2}
重启服务
[root@redhat ~]# systemctl restart nfs-server.service
//或者使用此命令使配置文件生效
[root@redhat ~]# exportfs -ra
客户端
查看服务器共享的文件系统
[root@bogon ~]# showmount -e 192.168.159.128
Export list for 192.168.159.128:
/nfs/shared *
临时挂载
[root@bogon ~]# mount 192.168.159.128:/nfs/shared /mnt
[root@bogon ~]# cd /mnt
[root@bogon mnt]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 25 23:27 1
-rw-r--r--. 1 root root 0 Aug 25 23:27 2
2、开放/nfs/upload目录,网段主机可以上传目录
并将将所有用户及所属组映射为nfs-upload,其UID和GID均为210
修改配置文件
[root@redhat ~]# vim /etc/exports
//添加如下信息
/nfs/upload 192.168.159.0/24(rw,all_squash,anonuid=210,anongid=210,sync)
根据配置文件创建资源
[root@redhat ~]# mkdir /nfs/upload -p
[root@redhat ~]# touch /nfs/upload/{3,4}
[root@redhat ~]# chmod o+w /nfs/upload
[root@redhat ~]# useradd -u 210 nfs-upload
[root@redhat ~]# groupmod -g 210 nfs-upload
重启服务识别新的配置
[root@redhat ~]# systemctl restart nfs-server.service //不建议多次使用此命令重启服务
//或者
[root@redhat ~]# exportfs -ra
客户端
[root@bogon mnt]# showmount -e 192.168.159.128
Export list for 192.168.159.128:
/nfs/shared *
/nfs/upload 192.168.159.0/24
挂载测试
[root@bogon mnt]# mkdir /nfs
[root@bogon mnt]# mount 192.168.159.128:/nfs/upload /nfs
[root@bogon mnt]# cd /nfs
[root@bogon nfs]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 25 23:45 3
-rw-r--r--. 1 root root 0 Aug 25 23:45 4
[root@bogon nfs]# touch 1 2
[root@bogon nfs]# ll
total 0
-rw-r--r--. 1 210 210 0 Aug 26 00:05 1
-rw-r--r--. 1 210 210 0 Aug 26 00:05 2
-rw-r--r--. 1 root root 0 Aug 25 23:45 3
-rw-r--r--. 1 root root 0 Aug 25 23:45 4
3、将/home/tom目录仅共享给192.168.10.128这台主机,并只有用户tom可以完全访问该目录
修改配置文件
[root@redhat ~]# vim /etc/exports
//添加如下信息
/home/tom 192.168.159.128(rw)
创建用户
[root@redhat ~]# useradd tom
[root@redhat ~]# passwd tom
Changing password for user tom.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
重启服务识别新的配置
[root@redhat ~]# systemctl restart nfs-server
//或者
[root@redhat ~]# exportfs -ra
挂载测试
[root@bogon redhat]# mkdir /nfs1
[root@bogon redhat]# mount 192.168.159.128:/home/tom /nfs1
[tom@redhat ~]$ su hong
Password:
[hong@redhat tom]$ cd /nfs1
bash: cd: /nfs1: Permission denied
[hong@redhat tom]$ su tom
Password:
[tom@redhat ~]$ cd /nfs1
[tom@redhat nfs1]$ touch a b c
[tom@redhat nfs1]$ ll
total 0
-rw-rw-r--. 1 tom tom 0 Aug 26 01:10 1
-rw-rw-r--. 1 tom tom 0 Aug 26 01:10 2
-rw-rw-r--. 1 tom tom 0 Aug 26 01:10 3
-rw-rw-r--. 1 tom tom 0 Aug 26 01:11 a
-rw-rw-r--. 1 tom tom 0 Aug 26 01:11 b
-rw-rw-r--. 1 tom tom 0 Aug 26 01:11 c