其中,ftp是工作在应用层的服务,与内核无关(也即可以跨平台实现),可在LinuxLinux之间、Linuxwindows之间、UNIXLinux之间实现文件共享等;nfs是工作在内核空间的,不能跨平台,且主要应用在LinuxLinux之间和LinuxUNIX之间的文件共享;samba也是工作在应用层,可以跨平台实现文件共享。以Centos 6.6为例:


ftp(File Transfer Protocol)
nfs(Netword file system)
samba(Service Message Block)
软件包
vsftpd.2.2.2-13.el6_6.1.x86_64  

nfs-utils-lib-1.1.5-9.el6.x86_64

rpb-bind-0.2.0-11.el6.x86_64在Centos5.x系列上是portmap包

服务器端samba-3.6.23-14.el6_6.x86_64.rpm

客户端samba-client-3.6.23-14.el6_6.x86_64

端口
默认监听在 TCP 21号端口是C/S架构,客户端程序为ftp
NFS:tcp的2048和2049端口等
tcp的139和445端口,udp的137和138端口
配置文件

用户认证配置文件:/etc/pam.d/vsftpd

配置文件目录:/etc/vsftpd
主配置文件:vsftpd.conf
匿名用户(映射为ftp用户家目录/var/ftp)共享资源位置:/var/ftp

系统用户通过ftp访问的资源位置:用户自己的家目录

虚拟用户通过ftp访问的资源位置:给虚拟用户指定的映射成系统用户的家目录

主配置文件/etc/nfsmount.conf

要挂载一个文件系统,需要编辑/etc/exprots文件


服务脚本为:

/etc/rc.d/init.d/nmb

/etc/rc.d/init.d/smb

主配置文件为:

/etc/samba/smb.conf

主要分为两段:

    全局设定

    特定共享的设定

        私有家目录

        打印机共享

        自定义共享

配置文件格式
character=value

/etc/exports文件格式

directory client(options) client(options)

smb.conf配置文件格式,可以通过man smb.conf查看到详细信息

name = value


选项

匿名用户的配置:

anonymous_enable=YES 允许匿名用户访问ftp

anon_upload_enable=YES 允许匿名用户上传文件

anon_mkdir_write_enable=YES 允许匿名用户创建目录的

anon_other_write_enable=YES 允许匿名用户的写权限


系统用户的配置:

local_enable=YES 允许本地用户访问ftp

write_enable=YES 允许本地用户写权限

local_umask=022 允许本地用户上传文件后,文件默认权限

chroot_local_user=YES 禁锢所有的ftp本地用户于其家目录:(也即本地用户不能切换到其他目录下去操作)


日志:

xferlog_enable=YES 开启ftp的上传和下载日志

xferlog_std_format=YES 传输日志使用标准格式

xferlog_file=/var/log/xferlog 指定日志文件存放的位置



chown_uploads=YES 改变上传文件的属主

chown_username=whoever 指定文件的属主


pam_service_name=vsftpd vsftpd使用pam完成用户认证,其用到的pam配置文件 /etc/pam.d/vsftpd


userlist_enable=YES 启用控制用户登录的列表文件

userlist_deny=YES|NO

黑名单 为YES  不允许登录

白名单 为NO   允许登录

默认文件为/etc/vsftpd/user_list


连接限制:

max_clients:最大并发连接数;

max_per_ip:每个ip可同时发起的并发请求数;

传输速率:

anon_max_rate: 匿名用户的最大传输速率,单位是“字节/秒”

local_max_rate:本地用户的最大传输速率


/etc/exports文件中options

secure:是缺省选项,他使用了1024以下的tcp/ip端口实现NFS的连接;指定insecure可以禁用这个选项。

rw:这个选项允许NFS客户机进行读/写访问,默认是只读的

async:这个选项可以改进性能,但是如果没有完全关闭NFS守护进程就重新启动了NFS服务器,也可能会造成数据丢失,默认。

no_wdelay:这个选项关系写延时,如果设置了async,那么nfs就会忽略这个选项。

nohide:如果将一个目录挂载到另外一个目录之上,那么原来的目录通常就被隐藏起来或看起来像空的一样。要禁用此行为,需启用hide选项。

no_auth_nlm这个选项也可以作为insecure_locks 指定,它告诉NFS守护进程不要对加锁请求进行认证。如果关心安全性问题,就要避免使用这个选项。缺省选项是 auth_nlm 或 secure_locks。

mp (mountpoint=path): 通过显式地声明这个选项,NFS 要求挂载所导出的目录。


用户映射
通过 NFS 中的用户映射,可以将伪或实际用户和组的标识赋给一个正在对NFS 卷进行操作的用户。这个 NFS 用户具有映射所允许的用户和组的许可权限。对 NFS 卷使用一个通用的用户/组可以提供一定的安全性和灵活性,而不会带来很多管理负荷。
在使用 NFS 挂载的文件系统上的文件时,用户的访问通常都会受到限制,这就是说用户都是以匿名用户的身份来对文件进行访问的,这些用户缺省情况下对这些文件只有只读权限。这种行为对于 root 用户来说尤其重要。然而,实际上的确存在这种情况:希望用户以 root 用户或所定义的其他用户的身份访问远程文件系统上的文件。NFS 允许指定访问远程文件的用户——通过用户标识号(UID)和组标识号(GID),可以禁用正常的 squash行为。

用户映射的选项包括:
root_squash: 这个选项不允许root用户访问挂载上来的NFS卷。默认启用
no_root_squash: 这个选项允许root用户访问挂载上来的NFS卷。
all_squash: 这个选项对于公共访问的 NFS 卷来说非常有用,它会限制所有的 UID 和 GID,只使用匿名用户。缺省设置是 no_all_squash。
anonuid 和 anongid: 这两个选项将匿名 UID 和 GID 修改成特定用户和组帐号。

server string = Samba Server Version %v 使用samba client登录时,显示出的注释信息;

interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 用于指定监听的接口和地址

hosts allow = 127. 192.168.12. 192.168.13.  白名单

Example 1: allow all IPs in 150.203.*.*; except one
 hosts allow = 150.203. EXCEPT 150.203.6.66
 Example 2: allow hosts that match the given network/netmask
 hosts allow = 150.203.15.0/255.255.255.0

log file = /var/log/samba/log.%m %m是指访问samba服务的客户端ip或主机名

max log size = 50 日志文件达到50k会自动实现轮转的

任何主机访问samba时,要提供用户名和密码来访问 security = user

passdb backend = tdbsam


自定义共享:

[shared_name]共享名

path = /path/to/share_direcroty 共享路径(至少要有此项)

comment = Comment String 说明信息

guest ok = {yes|no} 是否允许来宾账号访问和后面一项是同样的意思

public = {yes|no}

writable = {yes|no}对共享目录是否有写权限

read only = {yes|no}只读权限

write list = +GROUP_NAME 写用户列表

Example: write list = admin, root, @staff


命令

(客户端命令,需要安装ftp包)

#ftp tfp_ip

#help 可以查看到所用可用的命令

rpcinfo:报告RPC信息

rpcinfo -p

查看NFS服务器端共享的文件系统:

showmount -e NFSSERVER_IP

挂载nfs文件系统

mount -t nfs server:/path/to/sharedfs /path/to/mount_point

exportfs:维护exprots文件导出的文件系统表的专用工具;

exportfs -ar:重新导出所有的文件系统,及连接的不会被打断

exportfs -au:关闭导出的所有文件系统

exportfs -u fs:关闭指定的导出的文件系统;


smbpasswd:

  -a sys_user: 添加系统用户为samba用户

  -d :禁用

  -e :启用

  -x :删除

测试配置文件是否有语法错误,以及显示最终生效的配置;

testparm

挂载samba共享目录

mount.cifs //samba_in/shared_name /path/to/dest -o username=xxxx


ftp有两种连接方式:命令连接、数据连接

命令连接:文件管理类命令,始终在线的连接

数据连接:数据传输,按需创建及关闭的连接

其中创建数据连接的方式有2中:

主动:由服务器创建连接

    命令连接:

       Client用随机端口请求连接ftp服务器tcp的21号端口

    数据连接:

       Server用tcp的20号去主动连接客户端随机端口加1的端口,如被占用了,则客户端端口再加1,直到没用为止,进行数据传输

被动:由客户端创建连接

     命令连接:

        Client用随机端口请求连接ftp服务器tcp的21号端口

     数据连接:

        客户端用随机端口加1和ftp服务器端的一个随机端口(在客户端命令连接时,会通知FTP服务器端所用的随机端口),连接后即可进行数据传输


安装vsftpd #yum install -y vsftpd

查看vsftpd安装后生成了哪些文件 #rpm -ql vsftpd

启动vsftpd #service vsftpd start

查看tcp的21号端口是否启用 #ss -tnl | grep 21

查看用户信息的工具finger,需要安装后才可以使用

[root@localhost ~]# finger ftp
Login: ftp                        Name: FTP User
Directory: /var/ftp                     Shell: /sbin/nologin
Never logged in.
No mail.
No Plan.

家目录下有一个pub目录

[root@localhost ~]# ls /var/ftp/
pub


在远程主机上连接ftp(192.168.20.197)服务器

[root@hostpc ~]# ftp 192.168.20.197
Connected to 192.168.20.197 (192.168.20.197).
220 (vsFTPd 2.2.2)
Name (192.168.20.197:root): ftp  使用ftp用户登录
331 Please specify the password.
Password:  没有密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls  
227 Entering Passive Mode (192,168,20,197,248,55).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Oct 17 23:54 pub
226 Directory send OK.
ftp> pwd  查看当前目录,以/var/ftp为根目录
257 "/"
ftp> 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        p_w_picpath        ntrans        reset        user
chmod        lcd        open        restart        umask
close        ls        prompt        rmdir        verbose
cr        macdef        passive        runique        ?
delete        mdelete        proxy        send

在windows客户端进行访问FTP服务器

wKiom1T9A67RSqpiAAD49HrJr6o976.jpg


NFS实现的效果对本地系统接口的调用却被映射到网络上的另一个主机被称为远程过程调用
    RPC: 远程过程调用,函数调用(远程主机上的函数)
        一部分功能由本地程序完成:本地内核表现NFS模块来工作
        另一部分功能由远程主机上的函数完成


RPC(Remote Procedure Call)


安装nfs

#yum install -y nfs-utils   默认会安装rpcbind

查看安装了的文件#rpm -ql nfs-utils

[root@localhost ~]# rpcinfo -p  可以查看到启动了多个服务,监听了好几个端口,端口是半随机的,每次启动端口都可能不同   
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100005    1   udp  54509  mountd
    100005    1   tcp  52012  mountd
    100005    2   udp  50125  mountd
    100005    2   tcp  60822  mountd
    100005    3   udp  37394  mountd
    100005    3   tcp  60612  mountd
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  45102  nlockmgr
    100021    3   udp  45102  nlockmgr
    100021    4   udp  45102  nlockmgr
    100021    1   tcp  35198  nlockmgr
    100021    3   tcp  35198  nlockmgr
    100021    4   tcp  35198  nlockmgr

编辑/etc/exports文件,添加如下信息:

/data  192.168.20.0/24(rw)

/www   192.168.20.161(ro)  192.168.20.166(rw)

创建目录

[root@localhost ~]# mkdir /{www,data}
[root@localhost ~]# exportfs -ar  重新导出所有的文件系统

查看NFS服务器端共享的文件系统

[root@localhost ~]# showmount -e 192.168.20.197
Export list for 192.168.20.197:
/data 192.168.20.0/24
/www  192.168.20.166,192.168.20.161

在192.168.20.166挂载到NFS上

[root@server ~]# mount -t nfs 192.168.20.197:/www /mnt
mount: wrong fs type, bad option, bad superblock on 192.168.20.197:/www,
       missing codepage or helper program, or other error
       (for several filesystems (e.g. nfs, cifs) you might
       need a /sbin/mount.<type> helper program)
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

提示出错,这里发现用命令补全时,mount.没有mount.nfs,查看一下mount.nfs依赖的软件包

[root@server ~]# yum provides "*mount.nfs"
Loaded plugins: fastestmirror, security
Repository 'epel' is missing name in configuration, using id
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.163.com
base                                                                                    | 3.7 kB     00:00     
epel                                                                                    | 4.4 kB     00:00     
extras                                                                                  | 3.4 kB     00:00     
updates                                                                                 | 3.4 kB     00:00     
base/filelists_db                                                                       | 6.1 MB     00:01     
epel/filelists_db                                                                       | 9.1 MB     00:02     
extras/filelists_db                                                                     |  31 kB     00:00     
updates/filelists_db                                                                    | 1.6 MB     00:00     
1:nfs-utils-1.2.3-54.el6.x86_64 : NFS utilities and supporting clients and daemons for the kernel NFS server
Repo        : base
Matched from:
Other       : mount.nfs = 1:1.2.3-54.el6
Other       : umount.nfs = 1:1.2.3-54.el6
Filename    : /sbin/mount.nfs
Filename    : /sbin/umount.nfs
[root@server ~]# yum install -y nfs-utils   安装好nfs-utils

[root@server ~]# mount.  命令不全已经有.nfs了
mount.nfs    mount.nfs4   mount.tmpfs  
[root@server ~]# mount.nfs 192.168.20.197:/www /mnt  挂载到本地/mnt目录下
[root@server ~]# mount -l  查看挂载情况
/dev/mapper/vg_lvm-lv1 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
/dev/mapper/vg_lvm-lv2 on /var type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
192.168.20.197:/www on /mnt type nfs (rw,vers=4,addr=192.168.20.197,clientaddr=192.168.20.166)  挂载好了

创建文件

[root@server ~]# echo "Hello,The NFS client 192.168.20.166" > /mnt/hello
-bash: /mnt/hello: Permission denied   没有权限,因为管理员默认是root_squash,要在此目录下创建文件需要在服务器端的/etc/exports文件中/www   192.168.20.161(ro)  192.168.20.166(rw,no_root_squash)  添加no_root_squash即可,再重新载入导出的文件系统exportfs -rv,创建文件就可以成功,但是时间会比较长

用普通用户来挂载使用nfs

客户端

创建普通用户opera,给其密码,查看其id

[root@server mnt]# useradd opera
[root@server mnt]# passwd opera
Changing password for user opera.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

[root@server ~]# id opera
uid=500(opera) gid=500(opera) groups=500(opera)

[opera@server mnt]$ ls -l
total 0
-rw-rw-r-- 1 opera opera 0 Mar  8 06:02 hello
[opera@server mnt]$ touch vnm
[opera@server mnt]$ ls -l
total 0
-rw-rw-r-- 1 opera opera 0 Mar  8 06:02 hello
-rw-rw-r-- 1 opera opera 0 Mar  8 06:06 vnm    属组和属主都是opera

服务器端

创建同样的用户,并且给定其对/www目录有写权限

[root@localhost ~]# useradd -u 500 opera
[root@localhost ~]# id opera
uid=500(opera) gid=500(opera) groups=500(opera)

[root@localhost ~]# setfacl -m u:opera:rwx /www
[root@localhost ~]# su - opera
[opera@localhost ~]$ touch /www/hello
[opera@localhost ~]$ ls /www/
hello   创建成功了

[opera@localhost ~]$ ls /www/ -l
total 0
-rw-rw-r--. 1 opera opera 0 Mar  8 06:02 hello  属组和属主是opera

再创建一个用户id为505的用户

[root@localhost ~]# useradd -u 505 fedora
[root@localhost ~]# setfacl -m u:fedora:rwx /www
[root@localhost ~]# cd /www/
[root@localhost www]# su - fedora
[fedora@localhost ~]$ touch /www/opo
[fedora@localhost ~]$ ls /www/ -l
total 0
-rw-rw-r--. 1 opera  opera  0 Mar  8 06:02 hello
-rw-rw-r--. 1 fedora fedora 0 Mar  8 06:10 opo   属主和属组是fedora
-rw-rw-r--. 1 opera  opera  0 Mar  8 06:06 vnm

客户端也创建一个用户id为505的用户,但用户名不同

[root@server ~]# useradd -u 505 index
[root@server ~]# su - index
[index@server ~]$ cd /mnt/
[index@server mnt]$ ls -l
total 0
-rw-rw-r-- 1 opera  opera  0 Mar  8 06:02 hello
-rw-rw-r-- 1 nobody nobody 0 Mar  8 06:10 opo
-rw-rw-r-- 1 opera  opera  0 Mar  8 06:06 vnm
[index@server mnt]$ mkdir pnp
[index@server mnt]$ ls -l
total 4
-rw-rw-r-- 1 opera  opera     0 Mar  8 06:02 hello
-rw-rw-r-- 1 nobody nobody    0 Mar  8 06:10 opo
drwxrwxr-x 2 nobody nobody 4096 Mar  8 06:12 pnp   因为用户名不同,这里创建的用户属主和属组都是nobody用户
-rw-rw-r-- 1 opera  opera     0 Mar  8 06:06 vnm

nfs认证用户是通过id号来识别用户的

实现开机自动挂载可在/etc/fstab文件中添加

serverip:/path/to/exported_fs /mount_point nfs defaults,_netdev 0 0


Samba服务器包括两个后台应用程序: Smbd 和 Nmbd。Smbd 是Samba的核心, 主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问; Nmbd主要负责对外发布Linux Samba服务器可以提供的NetBIOS名称和浏览服务,使Windows用户可以在“网上邻居”中浏览Linux Samba服务器中共享的资源。另外Samba还包括一些管理工具, 如 smb-client, smbmount, testparm, Smbpasswd 等程序。

以Linux作为samba服务器,windows作为客户端

服务器端安装samba

#yum install -y samba

服务脚本为

#/etc/rc.d/init.d/nmb

#/etc/rc.d/init.d/smb

主配置文件

/etc/samba/smb.conf

共享目录需要自行创建

samba用户:都是系统用户,在/etc/passwd下用户,密码samba服务自有密码文件

启动samba服务

#service nmb start

#service smb start

查看监听的端口

#ss -tunlp

smbpasswd:

 -a sys_user: 添加系统用户为samba用户

 -d :禁用

 -e :启用

 -x :删除

[root@localhost ~]# useradd smbuser1
[root@localhost ~]# smbpasswd -a smbuser1
New SMB password:
Retype new SMB password:
Added user smbuser1.

wKioL1T9bCuTOc9tAAK_g7QsEF4742.jpg

第一次登录时,会提示你输入用户名和密码,把刚才创建的用户登录进去即可看到如下

wKioL1T9bGWy_vDvAAD-zmLDCfs519.jpg

在配置文件中添加一组自定义配置/etc/samba/smb.conf如下:

[share]
    comment = My Shared Testing.
    path = /share/samba
    guest ok = yes
    writable = yes

测试语法看是否有误

[root@localhost ~]# testparm
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[homes]"
Processing section "[printers]"
Processing section "[share]"
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions

[global]
    workgroup = MYGROUP
    server string = Samba Server Version %v
    log file = /var/log/samba/log.%m
    max log size = 50
    idmap config * : backend = tdb
    cups options = raw

[homes]
    comment = Home Directories
    read only = No
    browseable = No

[printers]
    comment = All Printers
    path = /var/spool/samba
    printable = Yes
    print ok = Yes
    browseable = No

[share]
    comment = My Shared Testing.
    path = /share/samba
    read only = No
    guest ok = Yes

创建共享目录
[root@localhost ~]# mkdir /share/samba -pv
mkdir: created directory `/share'
mkdir: created directory `/share/samba'

安装samba客户端软件samba-client,在客户端上进行访问

[root@hostpc ~]# yum install -y samba-client

连接到samba服务器

[root@hostpc ~]# smbclient //192.168.20.197/share -U smbuser1
Enter smbuser1's password:
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]
smb: \> ls
  .                                   D        0  Sun Mar  8 09:12:33 2015
  ..                                  D        0  Sun Mar  8 09:12:33 2015

        40317 blocks of size 262144. 30810 blocks available
smb: \> help   查看有哪些命令可以使用
?              allinfo        altname        archive        blocksize      
cancel         case_sensitive cd             chmod          chown          
close          del            dir            du             echo           
exit           get            getfacl        geteas         hardlink       
help           history        iosize         lcd            link           
lock           lowercase      ls             l              mask           
md             mget           mkdir          more           mput           
newer          open           posix          posix_encrypt  posix_open     
posix_mkdir    posix_rmdir    posix_unlink   print          prompt         
put            pwd            q              queue          quit           
readlink       rd             recurse        reget          rename         
reput          rm             rmdir          showacls       setea          
setmode        stat           symlink        tar            tarmode        
timeout        translate      unlock         volume         vuid           
wdel           logon          listconnect    showconnect    ..             
!              
smb: \> lcd /etc  切换到本地/etc/目录下
smb: \> put issue  上传文件
NT_STATUS_ACCESS_DENIED opening remote file \issue  访问被拒绝

所有的共享权限最终结果取决于文件系统权限加共享权限的交集

在服务器端提供给smbuser1对/share/samba目录写权限

[root@localhost ~]# ls -ld /share/
drwxr-xr-x. 3 root root 4096 Mar  8 09:12 /share/
[root@localhost ~]# setfacl -m u:smbuser1:rwx /share/samba/

此时再上传文件

smb: \> put issue
putting file issue as \issue (6.6 kb/s) (average 6.6 kb/s)
smb: \> ls
  .                                   D        0  Sun Mar  8 09:20:42 2015
  ..                                  D        0  Sun Mar  8 09:12:33 2015
  issue                               A       47  Sun Mar  8 09:20:42 2015

        40317 blocks of size 262144. 30810 blocks available   发现文件了,上传成功

wKioL1T9cD6xkd5MAAE16ZkD9ZM292.jpg

文件共享服务到此就结束,有什么问题可以大家来一起讨论,谢谢