一、了解一下

1.NFS

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

好处:

  • 节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,那么本地终端将可以减少自身存储空间的使用。
  • 用户不需要在网络中的每个机器上都建有Home目录,Home目录可以放在NFS服务器上且可以在网络上被访问使用。
  • 一些存储设备如软驱、CDROM和Zip(一种高储存密度的磁盘驱动器与磁盘)等都可以在网络上被别的机器使用。这可以减少整个网络上可移动介质设备的数量。

.
.

2.Samba

Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。

好处:

  • 分享档案与打印机服务;
  • 提供使用者登入 SAMBA 主机时的身份认证,以提供不同身份者的个别数据;
  • 进行 Windows 网络上的主机名称解析 (NetBIOS name)
  • 进行装置的分享 ( 例如 Zip, CDROM... )

.
.

3.FTP

FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。

好处:

  • 分享文件和资料
  • 用户访问控制,身份认证
  • 多平台可以访问ftp服务器,比如:Linux,Windows,Mac os等等
  • 定向共享文件,文件访问权限设置
  • 限制登录用户的根目录

.
.
.

二、动手实现

1.NFS
1.1语法:

nfsstat(选项)
-s:仅列出NFS服务器端状态;
-c:仅列出NFS客户端状态;
-n:仅列出NFS状态,默认显示nfs客户端和服务器的状态;
-2:仅列出NFS版本2的状态;
-3:仅列出NFS版本3的状态;
-4:仅列出NFS版本4的状态;
-m:打印以加载的nfs文件系统状态;
-r:仅打印rpc状态。

1.2 安装

[root@linuxview ~]# yum install -y nfs-utils

1.3配置

NFS的常用目录
/etc/exports                           NFS服务的主要配置文件
/usr/sbin/exportfs                   NFS服务的管理命令
/usr/sbin/showmount              客户端的查看命令
/var/lib/nfs/etab                      记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab                      记录曾经登录过的客户端信息

[root@linuxview ~]# vim /etc/exports
[root@linuxview ~]# cat /etc/exports
/server/source  192.168.0.0/16(rw,no_root_squash,sync)
[root@linuxview ~]# systemctl restart nfs
[root@linuxview ~]# cd /server/source/
[root@linuxview source]# touch linuxview.txt
[root@linuxview source]# echo hello >> linuxview.txt 
[root@linuxview source]# ls
linuxview.txt
[root@linuxview source]# systemctl status nfs
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-09-13 22:36:14 CST; 6s ago
  Process: 2695 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 2692 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 2690 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 2715 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 2708 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
  Process: 2707 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 2715 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Sep 13 22:36:14 linuxview systemd[1]: Starting NFS server and services...
Sep 13 22:36:14 linuxview systemd[1]: Started NFS server and services.
[root@linuxview source]# 

1.4 客户端挂载

[root@web2 ~]# showmount -e 192.168.1.9
Export list for 192.168.1.9:
/server/source 192.168.0.0/16
[root@web2 ~]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root  17811456 2445572  15365884  14% /
devtmpfs                  1919556       0   1919556   0% /dev
tmpfs                     1931784       4   1931780   1% /dev/shm
tmpfs                     1931784   11824   1919960   1% /run
tmpfs                     1931784       0   1931784   0% /sys/fs/cgroup
/dev/sda1                 1038336  145092    893244  14% /boot
tmpfs                      386360       0    386360   0% /run/user/0
[root@web2 ~]# mount -t nfs 192.168.1.9:/server/source  /mnt/
[root@web2 ~]# df
Filesystem                 1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root     17811456 2445592  15365864  14% /
devtmpfs                     1919556       0   1919556   0% /dev
tmpfs                        1931784       4   1931780   1% /dev/shm
tmpfs                        1931784   11828   1919956   1% /run
tmpfs                        1931784       0   1931784   0% /sys/fs/cgroup
/dev/sda1                    1038336  145092    893244  14% /boot
tmpfs                         386360       0    386360   0% /run/user/0
192.168.1.9:/server/source  17811456 2445312  15366144  14% /mnt
[root@web2 ~]# cd /mnt/
[root@web2 mnt]# ls
linuxview.txt
[root@web2 mnt]# cat linuxview.txt 
hello
[root@web2 mnt]# 

1.5 参数说明

exports文件的编写格式
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
输出目录为NFS目录,客户端为要连接到NFS的客户端,访问权限指客户端的操作权限,用户映射可以限制用户权限

客户端常用的指定方式
指定ip地址的主机 192.168.0.200
指定子网中的所有主机 192.168.0.0/24
指定域名的主机 a.liusuping.com
指定域中的所有主机 .liusuping.com
所有主机

访问权限选项
设置输出目录只读 ro
设置输出目录读写 rw
用户映射选项
all_squash 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash 与all_squash取反(默认设置);
root_squash 将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash 与rootsquash取反;
anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx 将远程访问的所有用户组都映射为匿名用 户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
secure 限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure 允许客户端从大于1024的tcp/ip端口连接服务器;
sync 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async 将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay 检查是否有相关的写操作,如果有则将这些写操作 一起执行,这样可以提高效率(默认设置);
no_wdelay 若有写操作则立即执行,应与sync配合使用;
subtree 若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree 即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;

2.Samba
2.1 安装

[root@linuxview ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@linuxview ~]# uname -a
Linux linuxview 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@linuxview ~]# getenforce
Disabled
[root@linuxview ~]# yum install -y samba samba-client samba-swat 

2.2 共享文件

[root@linuxview ~]# useradd linuxview
[root@linuxview ~]# smbpasswd -a linuxview
New SMB password:
Retype new SMB password:
Added user linuxview.
[root@linuxview ~]# vim /etc/samba/smb.conf
[smbshare]
comment = share
path = /server/data
browseable = yes
writable = yes
available = yes
admin users = linuxview
valid users = linuxview
public = yes
[root@linuxview ~]# mkdir -p /server/data
[root@linuxview ~]# systemctl restart  smb
[root@linuxview ~]# systemctl status  smb
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2018-09-16 13:57:17 CST; 3s ago
 Main PID: 28641 (smbd)
   Status: "smbd: ready to serve connections..."
   CGroup: /system.slice/smb.service
           ├─28641 /usr/sbin/smbd --foreground --no-process-group
           ├─28643 /usr/sbin/smbd --foreground --no-process-group
           ├─28644 /usr/sbin/smbd --foreground --no-process-group
           └─28645 /usr/sbin/smbd --foreground --no-process-group

Sep 16 13:57:17 linuxview systemd[1]: Starting Samba SMB Daemon...
Sep 16 13:57:17 linuxview smbd[28641]: [2018/09/16 13:57:17.272004,  0] ../lib/u...y)
Sep 16 13:57:17 linuxview smbd[28641]:   STATUS=daemon 'smbd' finished starting ...ns
Sep 16 13:57:17 linuxview systemd[1]: Started Samba SMB Daemon.
Hint: Some lines were ellipsized, use -l to show in full.

2.3 客户端挂载
Windows访问
运维进阶:文件共享服务全攻略

Linux访问挂载

[root@client ~]# smbclient -U linuxview //192.168.1.9/smbshare
Enter SAMBA\linuxview's password: 
Try "help" to get a list of possible commands.
smb: \> ls 
  .                                   D        0  Sun Sep 16 17:59:15 2018
  ..                                  D        0  Sun Sep 16 13:50:31 2018
  test                                N        0  Sun Sep 16 17:05:39 2018

        17811456 blocks of size 1024. 15328676 blocks available

挂载文件
[root@client /]# #mount  //192.168.1.9/smbshare  /mnt -o username=linuxview
[root@client /]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root  17811456 2472244  15339212  14% /
devtmpfs                  1919556       0   1919556   0% /dev
tmpfs                     1931784       4   1931780   1% /dev/shm
tmpfs                     1931784   11836   1919948   1% /run
tmpfs                     1931784       0   1931784   0% /sys/fs/cgroup
/dev/sda1                 1038336  145092    893244  14% /boot
tmpfs                      386360       0    386360   0% /run/user/0
[root@client /]# mount  //192.168.1.9/smbshare  /mnt -o username=linuxview
Password for linuxview@//192.168.1.9/smbshare:  ******
[root@client /]# df
Filesystem              1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos-root  17811456 2472244  15339212  14% /
devtmpfs                  1919556       0   1919556   0% /dev
tmpfs                     1931784       4   1931780   1% /dev/shm
tmpfs                     1931784   11836   1919948   1% /run
tmpfs                     1931784       0   1931784   0% /sys/fs/cgroup
/dev/sda1                 1038336  145092    893244  14% /boot
tmpfs                      386360       0    386360   0% /run/user/0
//192.168.1.9/smbshare   17811456 2482316  15329140  14% /mnt
[root@client /]# cd /mnt/
[root@client mnt]# ls
test
[root@client mnt]# 

2.4 Samba共享目录下操作命令

smb: \> help 
?              allinfo        altname        archive        backup         
blocksize      cancel         case_sensitive cd             chmod          
chown          close          del            deltree        dir            
du             echo           exit           get            getfacl        
geteas         hardlink       help           history        iosize         
lcd            link           lock           lowercase      ls             
l              mask           md             mget           mkdir          
more           mput           newer          notify         open           
posix          posix_encrypt  posix_open     posix_mkdir    posix_rmdir    
posix_unlink   posix_whoami   print          prompt         put            
pwd            q              queue          quit           readlink       
rd             recurse        reget          rename         reput          
rm             rmdir          showacls       setea          setmode        
scopy          stat           symlink        tar            tarmode        
timeout        translate      unlock         volume         vuid           
wdel           logon          listconnect    showconnect    tcon           
tdis           tid            logoff         ..             !              
smb: \> 

3.FTP
3.1 安装
[root@linuxview ~]# yum install -y vsftpd

3.2 创建ftp用户

[root@linuxview ~]# useradd ftpuser
[root@linuxview ~]# passwd ftpuser
Changing password for user ftpuser.
New password: 
BAD PASSWORD: The password is a palindrome
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@linuxview ~]# getenforce
Disabled
[root@linuxview ~]# 

3.3 启动ftp服务

[root@linuxview ~]# service vsftpd restart 
Shutting down vsftpd:                                      [  OK  ]
Starting vsftpd for vsftpd:                                [  OK  ]
[root@linuxview ~]# ps -aux |grep vsftpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root       2587  0.0  0.0  52124   812 ?        Ss   21:34   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root       2591  0.0  0.0 103324   856 pts/0    S+   21:35   0:00 grep vsftpd
[root@linuxview ~]# 

3.4 客户端访问并挂载
浏览器访问:
运维进阶:文件共享服务全攻略

运维进阶:文件共享服务全攻略

命令行访问:
运维进阶:文件共享服务全攻略

三、原理分析

1.NFS

NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

  NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以说NFS本身就是使用RPC的一个程序。或者说NFS也是一个RPC SERVER。所以只要用到NFS的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

工作流程原理:
运维进阶:文件共享服务全攻略

当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点:
首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap 或rpcbind服务)就会通过网络向NFS服务端的RPC服务(即portmap或rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
NFS服务端的RPC服务(即portmap或rpcbind服务)找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务(即portmap或rpcbind服务)。
此时NFS客户端就可获取到正确的端口,然后就直接与NFS daemon联机存取数据了。
NFS客户端把数据存取成功后,返回给前端程序,告诉用户存取结果,作为网站用户,我们就完成了一次存取操作。

由于NFS的各项功能都需要向RPC服务(即portmap或rpcbind)注册,所以RPC服务(即portmap或rpcbind服务)才能获取到NFS服务的各项对应的端口号(portnumber)、PID、NFS在主机所监听的IP等,而NFS客户端才能够通过向RPC服务(即portmap或rpcbind服务)询问从而找到正确的端口。也就是说,NFS需要有RPC服务(即portmap或rpc服务),NFS服务只需在服务端后于RPC服务启动,客户端无需启动NFS服务。
NFS的rpc服务,在CentOS5.X下名称为portmap,在CentOS6.x下名称为rpcbind。

2.Samba

SAMBA主要提供的是SMB/CIFS或者NETBIOS协议的。
所以只要使用了SAMBA,就能实现让Linux出现在Windows的网上邻居里,或者,让Windows的文件共享在Linux上--
一旦在linux上安装之后,有两个主要进程:
1.nmbd :提供NETBIOS 名称解析的
2.smdb : 提供文件共享的。

     而由于NETBIOS协议对于windows来讲监听TCP的139端口和UDP的137,138端口 ,所以nmbd在linux上模拟出了udp的137和138端口,以及tcp的139端口,smdb上模拟出 tcp的445端口。而SAMBA将在Linux上同时监听这4个端口。

主要部分
两个守护程序:smbd 和 nmbd(对客户端提供NetBIOS名服务)
配置文件:/etc/smb.conf
使用工具:smbclient,smbstatus,smbmount,smbumount,smbprint,smbprint.sysv,smbrun
samba的启动脚本在/etc/rc.d/init.d/smb

3.FTP

FTP的传输使用的是TCP封包协议。

FTP服务器使用了两个联机,分别是:
命令信道
数据流通道(ftp-data)

两个联机通道的关系是怎么样的?以FTP预设的主动式(active)联机来做说明:
主动指的是FTP服务器主动联机客户端,作为数据通道;
运维进阶:文件共享服务全攻略

建立命令通道的联机
客户端会随机取一个大于 1024 以上的端口 (port AA) 来与 FTP服务器端的 port 21 达成联机, 这个过程当然TCP三次握手了!
达成联机后客户端便可以透过这个联机来对 FTP 服务器下达指令, 包括查询文件名、下载、上传等指令
通知 FTP 服务器端,使用 active 且告知连接的端口号
客户端在需要数据的情况下,会告知服务器端要用什么方式来联机,如果是主动式 (active) 联机时, 客户端会先随机启用一个端口号 (图21.1-1 当中的 port BB) ,且透过命令通道告知 FTP 服务器这两个信息,并等待 FTP 服务器的联机;
FTP 服务器『主动』向客户端联机
FTP 服务器由命令通道了解客户端的需求后,会主动的由 20 这个端口号向客户端的 port BB 联机, 这个联机当然也会经过TCP三次握手!此时 FTP 的客户端与服务器端共会建立两条联机,分别用在命令的下达与数据的传递。 而预设 FTP服务器端使用的主动联机端口号就是 port 20 !
如此一来则成功的建立起『命令』与『数据传输』两个信道!不过,要注意的是,数据传输信道是在有数据传输的行为时才会建立的通道喔!并不是一开始连接到FTP 服务器就立刻建立的通道

由上可见,主动式联机使用到的端口号:
命令通道的 ftp (默认为 port 21)
数据传输的 ftp-data (默认为 port 20)

在主动联机的 FTP 服务器与客户端之间具有防火墙的联机问题

一般来说,很多的局域网络都会使用防火墙(iptables) 的 NAT 功能,那么在 NAT 后端的 FTP 用户如何连接到 FTP 服务器呢?
运维进阶:文件共享服务全攻略

服务器主动连到 NAT 等待转递至客户端的联机问题:
由于透过 NAT 的转换后, FTP 服务器只能得知 NAT 的 IP 而不是客户端的IP , 因此 FTP 服务器会以 port 20 主动的向 NAT 的 port BB 发送主动联机的要求。 但你的 NAT 并没有启动 port BB 来监听 FTP 服务器的联机啊!

解决办法:
使用iptables所提供的FTP侦测模块
ip_conntrack_ftp 及 ip_nat_ftp 等模块主动的分析『目标是 port 21 的联机』信息,得到port BB 的资料,
此时若接受到 FTP 服务器的主动联机,就能够将该封包导向正确的后端主机了。
客户端选择被动式(Passive)联机模式
主动式,是指 服务器主动联机客户端。那被动式,就是客户端联机服务器。这里都是指的数据传输联机。

21.1.3 客户端选择被动式联机模式
运维进阶:文件共享服务全攻略

用户与服务器建立命令信道
客户端发出 PASV 的联机要求
发出联机要求,病等待服务器的回应
FTP 服务器启动数据端口口,并通知客户端联机
这个端口号码不是主动式的port 20 ,而是随机的。
告知客户端这个 port PASV;
客户端随机取用大于 1024 的端口号进行连接