NFS服务的搭建和配置

一、NFS介绍 

 

NFS传输性能 nfs sftp_服务端

NFS传输性能 nfs sftp_配置文件_02

  • NFS是Network File System的缩写  
  • NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版本  
  • NFS数据传输基于RPC协议,RPC为Remote Procedure Call的简写。  
  • NFS应用场景是:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致
  • 通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。

二、NFS服务端安装配置

在CentOS上使用NFS服务需要安装两个包(nfs-utils和rpcbind),使用yum安装nfs-utils时会一并安装rpcbind。

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

CentOS 6之前的版本都是安装portmap包,从CentOS开始,改为安装rpcbind包了。

配置NFS,需要编辑配置文件 /etc/exports

  • 首先修改配置文件(默认该文件为空):
[root@localhost ~]# vim /etc/exports        //写入下面内容
/home/nfstestdir 192.168.100.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

上面配置文件就一行,分为三部分: 
1.本地要共享出去的目录 
2.允许访问的主机(可以是一个IP,也可以是IP段) 
3.小括号里面是一些权限选项

rw:表示读/写
ro:表示只读
sync:同步模式,表示内存中的数据实时写入磁盘
async:非同步模式,表示内存中的数据定期写入磁盘
no_root_squash:加上该选项后,root用户就会对共享的目录拥有最高权限,像操作本机的目录一样
root_squash:与上面对应,表示root用户对共享目录的权限不高,只有普通用户的权限
all_squash:表示不管使用NFS的用户是谁,其身份都被限定为一个指定的普通用户身份
anonuid/anongid:必须和root_squash以及all_squash选项一同使用,用于指定使用NFS的用户被限定后的uid和gid,前提是本机的/etc/passwd中存在相应的uid和gid

  • 创建相关目录并启动NFS服务:
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# mkdir /home/nfstestdir
[root@localhost ~]# systemctl start rpcbind       //启动NFS服务之前,要先启动rpcbind服务
[root@localhost ~]# ps aux |grep rpc
rpc        2487  0.0  0.0  65000  1416 ?        Ss   20:36   0:00 /sbin/rpcbind -w
rpcuser    2506  0.0  0.0  42420  1756 ?        Ss   20:36   0:00 /usr/sbin/rpc.statd
root       2507  0.0  0.0      0     0 ?        S<   20:36   0:00 [rpciod]
root       2513  0.0  0.0  19360   404 ?        Ss   20:36   0:00 /usr/sbin/rpc.idmapd
root       2526  0.0  0.0  42608   940 ?        Ss   20:36   0:00 /usr/sbin/rpc.mountd
root       2600  0.0  0.0 112720   984 pts/0    S+   20:45   0:00 grep --color=auto rpc
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# ps aux |grep  nfs
root       2536  0.0  0.0      0     0 ?        S<   20:36   0:00 [nfsd4_callbacks]
root       2542  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2543  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2544  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2545  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2546  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2547  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2548  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2549  0.0  0.0      0     0 ?        S    20:36   0:00 [nfsd]
root       2602  0.0  0.0 112720   984 pts/0    R+   20:46   0:00 grep --color=auto nfs
[root@localhost ~]# systemctl enable rpcbind       //加入开机启动
[root@localhost ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

三、客户端挂载

在挂载NFS之前,客户端也需要安装nfs-utils工具。 

  • 先在客户端查看服务端共享了哪些目录:
[root@localhost ~]# yum install -y nfs-utils
[root@localhost ~]# showmount -e 192.168.100.140          //使用命令 showmount -e IP 就可以查看NFS的共享情况
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)         //这里有报错,113端口不通,防火墙导致
[root@localhost ~]# systemctl stop firewalld          //这一步在服务端操作,关掉防火墙,最好也关掉SElinux
[root@localhost ~]# showmount -e 192.168.100.140        //这一步在客户端操作,再次查看服务端NFS的共享情况
Export list for 192.168.100.140:
/home/nfstestdir 192.168.100.0/24            //可以看到之前服务器端共享的目录和IP段
  • 然后在客户端上挂载NFS:
[root@localhost ~]# mount -t nfs 192.168.100.140:/home/nfstestdir /mnt/            //-t nfs 指定挂载的类型为nfs
[root@localhost ~]# df -h 
文件系统                          容量  已用  可用 已用% 挂载点
/dev/sda3                          16G  3.4G   13G   22% /
devtmpfs                          1.9G     0  1.9G    0% /dev
tmpfs                             1.9G     0  1.9G    0% /dev/shm
tmpfs                             1.9G  8.7M  1.9G    1% /run
tmpfs                             1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1                         197M  113M   85M   58% /boot
tmpfs                             378M     0  378M    0% /run/user/0
192.168.100.140:/home/nfstestdir   16G  3.4G   13G   22% /mnt            //这里可以看到刚挂载的/mnt分区
  • 进入/mnt/目录下,创建测试文件:
[root@localhost ~]# cd /mnt/
[root@localhost mnt]# touch abc.txt
touch: 无法创建"abc.txt": 权限不够          //这是因为之前服务端创建的/home/nfstestdir目录权限不合适,挂载后等于被限制uid为1000的用户
[root@localhost ~]# chmod 777 /home/nfstestdir/       //服务端操作,修改目录权限
[root@localhost mnt]# touch abc.txt           //客户端操作,就可以创建文件了
[root@localhost mnt]# ls -l
总用量 0
-rw-r--r--. 1 mysql mysql 0 7月  12 21:07 abc.txt          //说明mysql用户的uid和gid都为1000
[root@localhost ~]# tail  /etc/passwd          //服务端查看验证
==> /etc/passwd <==
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin            //这里mysql用户的uid和gid为1000
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@localhost mnt]# id mysql          //客户端查看
uid=1000(mysql) gid=1000(mysql) 组=1000(mysql)

可以发现,通过在客户端挂载的共享目录里面进行一些操作,在服务端也是同步进行的。


四、exportfs命令

exportfs命令常用选项:

-a:表示全部挂载或者卸载
-r:表示重新挂载
-u:表示卸载某一个目录
-v:表示显示共享的目录

当改变/etc/exports配置文件后,使用exportfs命令挂载不需要重启NFS服务。下面做个测试

  • 首先修改服务端配置文件:
[root@localhost ~]# vim /etc/exports        //增加下面一行
/tmp/ 192.168.100.0/24(rw,sync,no_root_squash)
  • 服务端执行exportfs命令:
[root@localhost ~]# exportfs -arv           //服务端直接执行,-arv选项可以直接查看新共享的目录,而不需要重启NFS服务
exporting 192.168.100.0/24:/tmp
exporting 192.168.100.0/24:/home/nfstestdir
[root@localhost mnt]# showmount -e 192.168.100.140       //客户端查看可以发现多出了一个tmp共享目录
Export list for 192.168.100.140:
/tmp             192.168.100.0/24
/home/nfstestdir 192.168.100.0/24

上面已经用到了mount命令, -t nfs 指定挂载类型为nfs,另外还有-o nolock(即不加锁)选项 
- 在客户端执行命令:

[root@localhost ~]# mount -t nfs -o nolock 192.168.100.140:/tmp/ /mnt/
  • 可以在客户端上把要挂载的目录写到/etc/fstab文件中,然后挂载时只需要执行mount -a 命令
192.168.100.140:/tmp/ /lzx  nfs defaults,nolock   0 0    //增加该行
  • 之前挂载了NFS,需要先卸载
[root@localhost ~]# umount /mnt/
  • 然后重新挂载
[root@localhost ~]# mount -a

这样操作的好处就是以后开机会自动挂载NFS

还有,服务端之前设置了no_root_squash参数,表示不限制root用户,它在共享目录下创建文件和在本机创建一样


五、NFS客户端问题

NFS有2、3、4三个大版本,NFS4可能会存在客户端文件属主属组为nobody的问题。

客户端在挂载共享目录后,不管是root用户还是普通用户,在创建新文件时属主、属组为nobody。

两种方法解决该问题:

1.客户端挂载时加上 -o nfsvers=3 ,指定NFS版本为3;

2.客户端和服务端都修改 /etc/idmapd.conf 文件,把#Domain = local.domain.edu改为Domain = xxx.com(这里xxx.com自定义),然后重启rpcidmapd服务(CentOS 7直接重启rpcbind服务即可)。


FTP服务的搭建和配置

一、FTP介绍

  • FTP是File Transfer Protocol(文件传输协议,简称文传协议)的英文简称,用于在Internet上控制文件的双向传输,使用的端口号是21。  
  • FTP的主要作用就是让用户连接一个远程计算机(这些计算机上运行着FTP服务器程序),并查看远程计算机中的文件,然后把文件从远程计算机复制到本地计算机,或把本地计算机的文件传送到远程计算机。  
  • 小公司用的多,大企业不用FTP,因为不安全

二、使用vsftpd搭建ftp

CentOS或者Red Hat Linux上有自带的FTP软件vsftpd,默认没有安装,使用yum安装,安装后不用配置,启动后便可以直接使用。

  • 使用yum安装vsftpd:
[root@localhost ~]# yum install -y vsftpd db4-utils  //db4-utils用来生成密码库文件,同时也会把依赖包安装上。

建立账号

vsftpd默认可以支持使用系统账号体系登录,但这样不够安全,所以建议使用虚拟账号体系登录。

  • 先创建与虚拟账号相关联的系统账号:
[root@localhost ~]# useradd virftp -s /sbin/nologin
  • 建立与虚拟账户相关的文件:
[root@localhost ~]# vim /etc/vsftpd/vsftpd_login
test1                  
123456
test2
abcdef        //该文件的奇数行为用户名,偶数行为上一行用户的密码
  • 更改该文件的权限,提升安全性:
[root@localhost ~]# chmod 600 /etc/vsftpd/vsftpd_login
  • 生成对应的库文件(因为vsftpd使用的密码文件不是明文):
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd_login /etc/vsftpd/vsftpd_login.db
  • 创建与虚拟账户相关的目录及配置文件:
[root@localhost ~]# mkdir /etc/vsftpd/vsftpd_user_conf
[root@localhost ~]# cd /etc/vsftpd/vsftpd_user_conf/

创建和用户对应的配置文件

用户的配置文件是单独存在的,每一个用户都有一个自己的配置文件,文件名和用户名一致。

  • 创建用户test1的配置文件:
[root@localhost vsftpd_user_conf]# vim test1 //加入以下内容
local_root=/home/virftp/test1
anonymous_enable=NO         
write_enable=YES
local_umask=022
anon_upload_enable=NO
anon_mkdir_write_enable=NO
idle_session_timeout=600
data_connection_timeout=120
max_clients=10
max_per_ip=5
local_max_rate=50000

配置文件说明:

local_root为test1账号的家目录
anonymous_enable用来限制是否允许匿名账号登录(NO表示不允许匿名账号登录)
write_enable=YES表示可写
local_umask指定umask值
anon_upload_enable表示是否允许匿名账号上传文件(NO表示不允许匿名账号上传文件)
anon_mkdir_write_enable表示是否允许匿名账号可写(NO表示匿名账号不可写)

创建用户test2的步骤和test1一样

  • 还需要配置test1用户的认证方式:
[root@localhost vsftpd_user_conf]# mkdir /home/virftp/test1
[root@localhost vsftpd_user_conf]# touch /home/virftp/test1/abc.txt
[root@localhost vsftpd_user_conf]# chown -R virftp:virftp /home/virftp
[root@localhost vsftpd_user_conf]# vim /etc/pam.d/vsftpd         //在最前面增加下面两行
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vdftpd_login
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vdftpd_login

CentOS 7 为64位系统,所以库文件路径为 /lib64/security/pam_userdb.so,而32位系统的库文件路径为 /lib/security/pam_userdb.so

修改全局配置文件/etc/vsftpd/vsftpd.conf

  • 首先编辑vsftpd.conf文件:
[root@localhost vsftpd_user_conf]# vim /etc/vsftpd/vsftpd.conf      //做以下更改
anonymous_enable=YES 改为 anonymous_enable=NO                    //关闭匿名登录
#anon_upload_enable=YES 改为 anon_upload_enable=NO              //关闭匿名上传
#anon_mkdir_write_enable=YES 改为 anon_mkdir_write_enable=NO    //关闭匿名创建和写入 
再增加下面内容:
chroot_local_user=YES
guest_enable=YES
guest_username=virftp
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
allow_writeable_chroot=YES
  • 然后启动vsftpd服务,测试:
[root@localhost vsftpd_user_conf]# systemctl start vsftpd
[root@localhost vsftpd_user_conf]# ps aux |grep vsftpd         //查看进程是否存在
root       5837  0.0  0.0  53256   576 ?        Ss   15:42   0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
[root@localhost vsftpd_user_conf]# yum install -y lftp        //安装lftp客户端软件
[root@localhost vsftpd_user_conf]# lftp test1@127.0.0.1
口令:                   //这里的口令就是之前创建的密码,test1的密码是123456,test2的密码是abcdef
lftp test1@127.0.0.1:~> ls          
-rw-r--r--    1 1002     1002            0 Jul 14 07:03 abc.txt

使用lftp成功登录vsftpd,且ls列出test1用户家目录下的abc.txt,其中1002为virftp用户的uid和gid。上面这一步很容易遇到错误,我们也可以查看/var/log/secure日志


三、使用pure-ftpd搭建ftp服务

pure-ftpd 是另外一款比较小巧实用的FTP软件。

安装pure-ftpd

CentOS默认没有该命令,且yum源中也没有,需要安装epel扩展源之后安装pure-ftpd。

[root@localhost ~]# yum install -y epel-release
[root@localhost ~]# yum install -y pure-ftpd

配置pure-ftpd

  • 在启动pure-ftpd之前,需要先配置文件 /etc/pure-ftpd/pure-ftpd.conf:
[root@localhost ~]# vim /etc/pure-ftpd/pure-ftpd.conf 
# PureDB  /etc/pure-ftpd/pureftpd.pdb   改为  PureDB  /etc/pure-ftpd/pureftpd.pdb      //去掉前面的#
  • 然后关闭vsftpd,因为有端口冲突:
[root@localhost ~]# systemctl stop vsftpd
  • 启动pure-ftpd:
[root@localhost ~]# systemctl start pure-ftpd
[root@localhost ~]# ps aux |grep pure-ftpd
root       2134  0.0  0.0 202520  1204 ?        Ss   16:04   0:00 pure-ftpd (SERVER)

建立账户

pure-ftpd使用的账号不是linux的系统账号,而是虚拟账户。

  • 首先创建一个账号:
[root@localhost ~]# mkdir /data/ftp/
[root@localhost ~]# useradd -u 1010 pure-ftp
[root@localhost ~]# chown -R pure-ftp:pure-ftp /data/ftp
[root@localhost ~]# pure-pw useradd ftp_user1 -u pure-ftp -d /data/ftp/
Password:    //这里输入需要设置的密码
Enter it again: 

-u 将虚拟用户ftp_user1 与系统用户 pure-ftp 关联在一起,使用ftp_user1账号登录FTP后,会以pure-ftp的身份来读取和下载文件 
-d 指定后面的目录为ftp_user1账号的家目录,这样使ftp_user1只能访问其家目录/data/ftp/
  • 然后创建用户信息数据库文件(这一步比较关键):
[root@localhost ~]# pure-pw mkdb

其中,pure-pw 还可以列出当前的FTP账号及删除某个账号

[root@localhost ~]# pure-pw useradd ftp_user2 -u pure-ftp -d /tmp  //再创建一个ftp_user2用户
Password: 
Enter it again: 
[root@localhost ~]# pure-pw mkdb
[root@localhost ~]# pure-pw list    //列出用户
ftp_user1           /data/ftp/./                                               
ftp_user2           /tmp/./ 
[root@localhost ~]# pure-pw userdel ftp_user2  //删除用户

测试pure-ftpd

  • 使用lftp连接:
[root@localhost ~]# lftp ftp_user1@127.0.0.1
口令:           //这里口令就是之前创建ftp_user1是设置的密码
lftp ftp_user1@127.0.0.1:~> ls      
drwxr-xr-x    2 1010       pure-ftp            6 Jul 14 16:08 .
drwxr-xr-x    2 1010       pure-ftp            6 Jul 14 16:08 ..         //可以显示结果,说明成功
  • 上传文件:
lftp ftp_user1@127.0.0.1:/> put /etc/fstab         //登录后,使用put命令上传,get命令下载
501 bytes transferred
lftp ftp_user1@127.0.0.1:/> ls
drwxr-xr-x    2 1010       pure-ftp           19 Jul 14 16:29 .
drwxr-xr-x    2 1010       pure-ftp           19 Jul 14 16:29 ..
-rw-r--r--    1 1010       pure-ftp          501 Jul  2 01:59 fstab          //这里可以看到刚上传的 /etc/fstab