Linux网络——网络文件共享服务

1,422 阅读11分钟

一、 存储类型

存储类型分为三种:

  • 直连式存储:Direct-Attached Storage,简称DAS
  • 网络附加存储:Network-Attached Storage,简称NAS
  • 存储区域网络:Storage Area Network,简称SAN

三种存储架构的应用场景:

  • DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业;
  • NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低;
  • SAN则适用于大型应用或数据库系统,缺点是成本高、较为复杂。

二、 FTP 文件传输协议

1. FTP 工作原理介绍

FTP(文件传输协议)是用于与远程网络之间传输文件的标准网络协议。 基于C/S结构。

数据传输格式:二进制(默认)和文本。

双通道协议:命令和数据连接。 20数据端口(真实传数据) ;21 命令端口(权限,认证)

  1. 两种模式: (从服务器角度)
  • 主动(PORT style):服务器主动连接客户端

首先客户机会随机产生一个端口号,主动去连接服务器的 tcp21端口,如果服务器是主动模式,那么服务器会主动开启 20端口和客户端相连,然后再传输数据。

  • 被动(PASV style):服务器被动等待客户端连接

首先客户机会随机产生一个端口号,主动去连接服务器的 tcp21端口,如果服务器是被动模式,那么服务器会产生一个随机的端口号, 被动等待客户机来连接后再发送数据。

  1. 用户认证:
  • 匿名用户:anonymous 或者 ftp
  • 系统用户:在/etc/passwd中 ,超级管理员root除外
  • 虚拟用户:只可以用来登录ftp ,不在/etc/passwd中

2. 常见FTP相关软件

FTP服务器端软件 :Wu-ftpd、Proftpd、Pureftpd、Filezilla Server、Serv-U、Wing FTP Server、IIS 等。

vsftpd:Very Secure FTP Daemon,CentOS 默认的FTP服务器。 高速,稳定,下载速度是WU-FTP的两倍。

vsftpd官网: security.appspot.com/vsftpd.html

3. vsftpd 软件介绍

vsftpd是“very secure FTP daemon”的缩写,是一个完全免费的、开放源代码的ftp服务器软件。

配置文件位置 : /etc/vsftpd/vsftpd.conf

用户和其共享目录:

  • 匿名用户(映射为系统用户ftp )共享文件位置:/var/ftp
  • 系统用户共享文件位置:用户家目录
  • 虚拟用户共享文件位置:为其映射的系统用户的家目录

基本操作

`安装服务端`
[root@localhost ~]#  yum install vsftpd -y     //安装 ftp 服务器
[root@localhost ~]#  systemctl start vsftpd    //开启服务

`客户端连接服务端`
[root@node2 ~]#  yum install ftp -y      //客户端安装FTP程序,安装后才能使用ftp命令

[root@node2 ~]#  ftp  172.16.235.55      // ftp 客户端工具    服务端地址
Connected to 172.16.235.55 (172.16.235.55).
220 (vsFTPd 3.0.2)
Name (172.16.235.55:root): ftp           //此处填写用户名  默认使用 ftp 或者匿名用户
331 Please specify the password.
Password:                                //默认没有密码
230 Login successful.                    //登录成功


`登录成功`
ftp> help   //可以使用 help 查看帮助
Commands may be abbreviated.  Commands are:

!		debug		mdir		sendport	site
$		dir		mget		put		size
account		disconnect	mkdir		pwd		status
append		exit		mls		quit		struct
ascii		form		mode		quote		system
bell		get		modtime		recv		sunique
binary		glob		mput		reget		tenex
bye		hash		newer		rstatus		tick
case		help		nmap		rhelp		trace
cd		idle		nlist		rename		type
cdup		image		ntrans		reset		user
chmod		lcd		open		restart		umask
close		ls		prompt		rmdir		verbose
cr		macdef		passive		runique		?
delete		mdelete		proxy		send

ftp> ls    //可以使用 ls 查看文件列表
227 Entering Passive Mode (172,16,235,55,186,69). //Passive消极被动,默认使用被动模式
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Jun 09  2021 pub
226 Directory send OK.

ftp> passive  //可以人为指定被动主动
Passive mode off.  //变为主动模式

4. vsftpd 服务常见配置

配置文件位置 : /etc/vsftpd/vsftpd.conf

4.1 修改默认命令端口

listen_port=端口号

服务端:修改默认命令端口号
[root@localhost ~]#  vim /etc/vsftpd/vsftpd.conf    //随便一行插入
listen_port=9527                                    //默认21,修改为9527
[root@localhost ~]#  systemctl restart vsftpd       //重启服务
[root@localhost ~]#  ss -natp |grep vsftpd          //查看端口
LISTEN     0      32          :::9527                    :::*                   users:(("vsftpd",pid=43874,fd=4))

客户端:连接时需要指明 端口号
[root@node2 ~]#  ftp 172.16.235.55 9527        //固定格式:ftp  ip  端口号  ,端口号前不要加-p选项
Connected to 172.16.235.55 (172.16.235.55).
220 (vsFTPd 3.0.2)
Name (172.16.235.55:root): ftp
331 Please specify the password.
Password:
230 Login successful.                         //连接成功

4.2 匿名用户登录

anonymous_enable=YES   //支持匿名用户,CentOS8 默认不允许匿名
no_anon_password=YES   //匿名用户略过口令检查 , 默认NO

4.3 匿名用户上传

anon_upload_enable=YES        //匿名上传,注意:文件系统权限
anon_mkdir_write_enable=YES   //匿名建目录

实验:将客户端的文件上传到服务端

  • 实验步骤:
  1. 服务端:修改配置文件 /etc/vsftpd/vsftpd.conf ,允许匿名用户上传文件,允许匿名用户建立文件夹;
[root@localhost ~]#  vim /etc/vsftpd/vsftpd.conf    //修改配置文件
  #注释掉以下两行
  anon_upload_enable=YES            //控制匿名用户对文件(非目录)的上传权限
  anon_mkdir_write_enable=YES       //允许匿名用户创建文件夹
[root@localhost ~]#  systemctl restart vsftpd       //重启服务
匿名上传.png
  1. 服务端:设置 /var/ftp/pub 目录的权限为777;

在传文件时需要考虑程序权限、文件系统权限。

[root@localhost /]#  cd /var/ftp
[root@localhost ftp]#  ls
pub
[root@localhost ftp]#  ll -d
drwxr-xr-x. 3 root root 17 55 14:46 .      //此处没有写的权限,要加上
[root@localhost ftp]#  chmod 777 /var/ftp/pub   //注意!不能给FTP根目录写权限,只能级子目录写权限,否则报错

//用户ftp对/var/ftp目录,不能拥有w权限,否则ftp用户不能登录访问
//ftp用户在/var/ftp/pub目录下上传文件时,必须对pub目录拥有wx权限(即写入和执行权限),否则上传文件会提示失败,不支持创建文件,因为没有写入权限。
  1. 客户端:使用 ftp 命令将 wenjian 文件上传到服务端。
[root@node2 data]#  ftp 172.16.235.55        //使用ftp连接服务端
Connected to 172.16.235.55 (172.16.235.55).
220 (vsFTPd 3.0.2)
Name (172.16.235.55:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub        //注意文件夹位置!要切到pub下
250 Directory successfully changed.
ftp> put wenjian   //上传文件到服务端
local: wenjian remote: wenjian
227 Entering Passive Mode (172,16,235,55,47,207).
150 Ok to send data.
226 Transfer complete.
10 bytes sent in 5.4e-05 secs (185.19 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,16,235,55,246,64).
150 Here comes the directory listing.
-rw-------    1 14       50             11 May 05 08:53 shangchuan
-rw-------    1 14       50             10 May 05 09:19 wenjian    //上传成功
226 Directory send OK.

# put 上传文件时,不支持绝对路径,想要上传的文件必须在客户端的当前目录内。 
例如当前是在/root目录下使用ftp连接服务端,想要上传/tmp/file01文件,
必须先将file01复制到/root目录下,之后使用“put file01”或“put ./file01”命令删上传,
不支持“put /tmp/file01” 这种格式 。
上传wenjian.png

补充:\color{red}{补充:} 是否可以上传文件或者新建文件,与什么有关? ①软件配置;②登录用户的权限。

4.4 匿名用户下载、删除文件

在 vsftpd 软件中,只可以下载有读权限的文件,没有读权限的文件是不可以直接下载的,需要修改下面的选项:

anon_world_readable_only=NO    //只能下载全部读的文件, 默认YES
anon_umask=0333                //指定匿名上传文件的umask,默认077,注意:0333中的0不能省略
anon_other_write_enable=YES    //可删除和修改上传的文件,默认NO

实验:将服务端的文件下载到客户端

  1. 服务端:将目标文件 wenjian2 复制到 /var/ftp 目录下;然后修改配置文件 /etc/vsftpd/vsftpd.conf ,没有读权限的文件也可以下载;
[root@localhost ftp]#  cp wenjian2  /var/ftp/pub    //将目标文件复制到/var/ftp 目录下
[root@localhost ftp]#  vim /etc/vsftpd/vsftpd.conf  //修改配置文件
  anon_world_readable_only=NO                       //没有读权限的文件也可以下载
[root@localhost ftp]#  systemctl restart vsftpd     //重启服务
  1. 客户端:使用 ftp 命令从服务端中将 wenjian2 下载到本地。
[root@node2 ~]#  ftp 172.16.235.55          //使用ftp连接服务端
Connected to 172.16.235.55 (172.16.235.55).
220 (vsFTPd 3.0.2)
Name (172.16.235.55:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub           //注意文件夹位置!要切到pub下
250 Directory successfully changed.
ftp> get wenjian2     //从服务端下载文件
local: wenjian2 remote: wenjian2
227 Entering Passive Mode (172,16,235,55,180,123).
150 Opening BINARY mode data connection for wenjian2 (32 bytes).
226 Transfer complete.
32 bytes received in 5.9e-05 secs (542.37 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,16,235,55,44,206).
150 Here comes the directory listing.
-rw-------    1 14       50             11 May 05 08:53 shangchuan
-rw-------    1 14       50             10 May 05 09:19 wenjian
-rw-r--r--    1 0        0              32 May 05 10:27 wenjian2   //下载成功
226 Directory send OK.

使用get从服务端下载文件时,用户ftp对该文件必须拥有r权限(即读取权限),否则无法下载。
例如/etc/passswd 文件,普通用户没有读取权限,无法下载该文件。

get和put 不支持对目录文件进行下载和上传,必须先使用tar命令将目录进行归档压缩,之后才能下载或上传。
下载wenjian2.png

三、 NFS

1. NFS 工作原理

NFS (Network File System) 网络文件系统,基于内核的文件系统。Sun 公司开发,通过使用 NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol 远程过程调用)实现。

NFS工作原理.png

与FTP不同,FTP是普通的文件共享软件;而NFS 是文件系统,是操作系统内核来管理的。

NFS优势:节省本地存储空间,将常用的数据,如:/home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用。

2. NFS 软件介绍

在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS 共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持。手动加载 NFS 共享服务时,应该先启动 rpcbind,再启动 nfs。

  1. 软件包 (包括服务器端和客户端):
  • nfs-utils (nfs端口号 2049/tcp
  • rpcbind (RPC端口号 111/tcp
  1. 相关软件包(可不安装):tcp_wappers

  2. NFS服务主要进程:

  • rpc.nfsd 最主要的NFS进程,管理客户端是否可登录
  • rpc.mountd 挂载和卸载NFS文件系统,包括权限管理
  • rpc.lockd 非必要,管理文件锁,避免同时写出错
  • rpc.statd 非必要,检查文件一致性,可修复文件
  1. 日志位置:/var/lib/nfs/

3. NFS 共享配置文件格式

配置文件位置:/etc/exports

配置文件格式:

/dir        主机1(opt1,opt2)     主机2(opt1,opt2)...
#共享目录 /绝对路径     共享给谁(权限)

例: 
/share    *    //表示将/share目录共享给任何主机 ,*代表任意(注意此时未给权限)
/share  192.168.72.0/24   //表示将/share目录共享给192.168.72.0网段内的任意主机

格式说明:

1. 主机格式:
通配符:表示使用*通配所有客户端

单个主机:ipv4,ipv6,FQDN

网段:两种掩码格式均支持(内网情况下)
 172.18.0.0/255.255.0.0
 172.18.0.0/16

wildcards:主机名通配,例如:*.kgc.comIP不可以
netgroups:NIS域的主机组,@group_name

2. 常用参数:
默认参数:ro,sync,root_squash,no_all_squash

读写权限
ro,rw 只读和读写

异步/同步
async:异步,数据变化后不立即写磁盘,先写入到缓冲区中,过一段时间再写入磁盘,性能高,安全性低
sync(1.0.0后为默认):同步,数据在请求时立即写入共享存储磁盘,性能低,安全性高

压缩权限
root_squash(默认):远程root映射为nfsnobody,UID65534CentOS8 为nobody,CentOS 7以前的版本为nfsnobody。
no_root_squash :远程root映射成NFS服务器的root用户。
all_squash :所有远程用户(包括root)都变成nfsnobody,CentOS8 为nobody。
no_all_squash (默认):保留共享文件的UIDGID。
anonuid和anongid:指明匿名用户映射为特定用户UID和组GID,而非nobody,可配all_squash使用。

4. NFS 工具

4.1 exportfs

exportfs可用于管理NFS导出的文件系统

exportfs -v   //查看本机所有NFS共享
exportfs -r   //重读配置文件,并共享目录

4.2 showmount

showmount用以查询NFS网络服务器的基本信息

showmount  -e   // 查看本机发布的NFS共享目录
showmount  -e  服务器的ip  //查看NFS服务器上哪些目录被共享
showmount  -e  172.16.235.55  //显示IP地址为172.16.235.55的NFS服务器上的所有共享目录

4.3 mount.nfs

客户端NFS挂载

NFS相关的挂载选项:man 5 nfs

5. NFS共享存储服务

5.1 实验1

实验内容: 把7-1服务端的share文件夹共享到7-2客户端

实验环境:

服务端:172.16.255.55

客户端:172.16.235.100

实验步骤:

  1. 服务端设置:
[root@localhost ~]# systemctl stop firewalld  //关闭防火墙和selinux
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install nfs-utils.x86_64 -y //安装nfs-utils软件包

[root@localhost ~]# mkdir /share             //新建共享目录/share
[root@localhost ~]# vim /etc/exports         //编辑nfs配置文件
 /share  *   //将share共享出去,允许所有主机访问
[root@localhost ~]#  systemctl start  nfs    //开启服务
[root@localhost ~]#  exportfs  -r            //重新读取配置
exportfs: No options for /share *: suggest *(sync) to avoid warning
[root@localhost ~]#  exportfs  -v            //查看NFS共享目录的详细信息
/share        	<world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
  1. 客户端设置:
[root@node2 ~]# systemctl stop firewalld  //关闭防火墙和selinux
[root@node2 ~]# setenforce 0
[root@node2 ~]#  yum install nfs-utils.x86_64 -y

[root@node2 ~]#  showmount -e 172.16.235.55   //显示IP地址为172.16.235.55的NFS服务器上的所有共享目录
Export list for 172.16.235.55:
/share *
[root@node2 ~]#  mount 172.16.235.55:/share /mnt  //将服务端的共享目录/share,挂载到本地的/mnt目录下
[root@node2 ~]#  df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        10G  5.0G  5.1G   50% /
devtmpfs                devtmpfs  897M     0  897M    0% /dev
tmpfs                   tmpfs     912M     0  912M    0% /dev/shm
tmpfs                   tmpfs     912M  9.2M  903M    2% /run
tmpfs                   tmpfs     912M     0  912M    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
tmpfs                   tmpfs     183M  4.0K  183M    1% /run/user/42
tmpfs                   tmpfs     183M   32K  183M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
172.16.235.55:/share    nfs4       50G  4.5G   46G    9% /mnt     //挂载成功

`补充:`想要将NFS共享目录永久挂载到本地,需要修改配置文件/etc/fstab
[root@node2 ~]# vim /etc/fstab
 192.168.91.100:/share  /mnt   nfs   defaults,_netdev  0  0
挂载参数为 defaults,_netdev :如果前面的不通就不挂了,否则会影响启动

nfs挂载.png

  1. 测试:在服务端的共享目录中新建文件123.txt,观察客户端能否查看到
[root@localhost share]#  touch  123.txt    //服务端新建文件123.txt
[root@localhost share]#  ls
123.txt

[root@node2 ~]#  ls /mnt
123.txt      //客户端能查看到123.txt文件,实验成功

5.2 实验2

实验内容: 7-1 和 7-2 共享7-3的主页

nfs实验2.png

实验环境:

7-1 ip地址 : 172.16.235.10

7-2 ip地址 : 172.16.235.100

7-3 ip地址 : 172.16.235.55

实验步骤:

7-1
[root@node1 ~]# yum install httpd -y
[root@node1 ~]# cd /var/www/html/
[root@node1 html]# vim index.html
  test  test
[root@node1 html]# systemctl  start  httpd

7-2
[root@node2 ~]# yum install httpd -y
[root@node2 ~]#  cd /var/www/html/
[root@node2 html]#  vim index.html
  test  test
[root@node2 html]#  systemctl  start  httpd

7-3
[root@localhost ~]#  curl 172.16.235.10       //curl文字版浏览器,查看7-1
test test
[root@localhost ~]#  curl 172.16.235.100      //curl文字版浏览器,查看7-2
test test
[root@localhost ~]#  mkdir /share
[root@localhost ~]#  vim /etc/exports
[root@localhost ~]#  cd /share
[root@localhost share]#  vim index.html
   this is test
[root@localhost share]#  systemctl start nfs  


7-1
[root@node1 html]# showmount -e 172.16.235.55
Export list for 172.16.235.55:
/share *
[root@node1 html]# mount 172.16.235.55:/share /var/www/html/

7-2
[root@node2 ~]#  showmount -e 172.16.235.55
Export list for 172.16.235.55:
/share *
[root@node2 ~]#  mount 172.16.235.55:/share /var/www/html/

7-3
[root@localhost share]#  curl 172.16.235.10      
this is test
[root@localhost share]#  curl 172.16.235.100
this is test

启动服务后,可以使用 "ss -ntuap | grep 111" 命令查看端口是否已开启,以便确认服务是否正常启动了。