在Debian上安装NFS并配置共享

时间:2020-03-21 11:45:38  来源:igfitidea点击:

在Debian Wheezy上安装NFS并配置共享。

准备工作

NFS服务器的IP地址为10.10.1.2,位于10.10.1.0/24子网中。
NFS客户端位于同一10.10.1.0/24子网中。
本文将Debian Wheezy用于NFS服务器和NFS客户端。

NFS服务器安装

# apt-get install nfs-kernel-server nfs-common rpcbind

要运行NFS服务器,必须先运行rpcbind服务:

# service rpcbind status
[ ok ] rpcbind is running.

如果rpcbind服务正在运行,则可以启动nfs-kernel-server服务:

# service nfs-kernel-server start
[ ok ] Exporting directories for NFS kernel daemon....
[ ok ] Starting NFS kernel daemon: nfsd mountd.

如果在rpcbind关闭时启动NFS服务,则会收到警告:

# service nfs-kernel-server start
[ ok ] Exporting directories for NFS kernel daemon....
[....] Starting NFS kernel daemon: nfsd
[warn] Not starting: portmapper is not running ... (warning).

基本NFS服务器配置

我们将出于不同目的在NFS服务器上创建三个目录(sgares):

'/data/nfs-public'用于只读访问。

'/data/nfs-root'用于读写访问,保留根权限(no_root_squash)。

'/data/nfs-no-root'用于读写访问,撤消root权限(root_squash)。

创建共享:

# mkdir -p /data/nfs-public /data/nfs-root /data/nfs-no-root
# chown nobody:nogroup /data/nfs-*
# chmod 0755 /data/nfs-*

我们不会打开“/etc/exports”文件并添加以下行:

/data/nfs-public  10.10.1.0/24(ro,no_subtree_check,root_squash,all_squash)
/data/nfs-root    10.10.1.0/24(rw,sync,no_subtree_check,no_all_squash,no_root_squash)
/data/nfs-no-root 10.10.1.0/24(rw,sync,no_subtree_check,root_squash,all_squash)

默认情况下,由root用户在客户端计算机上发出的任何文件请求都将被视为服务器上没有用户的请求。
这称为压缩,“ root_squash”选项是默认选项。

如果选择“ no_root_squash”选项,则客户端计算机上的root将具有与服务器上的root相同级别的系统访问权限。

用户/组压缩摘要(感谢http://lpic2.unix.nl/ch10s02.html):

  • root_squash(默认):客户端上以root用户身份进行的所有请求都将以服务器上没有用户的身份完成。例如,这意味着客户端上的用户root只能读取服务器上全球可读的文件。
  • no_root_squash:客户端上所有以root用户身份进行的请求都将以server上的root用户身份进行,例如在要通过NFS进行备份时这是必需的。这意味着服务器上的root完全信任客户端上的用户root。
  • all_squash:客户端上除root以外的任何用户的请求都将以nobody用户的身份执行。如果我们无法轻松映射用户名和UID,请使用此选项。
  • no_all_squash(默认):尝试将非root用户在客户端上的所有请求作为服务器上的同一用户。

现在,如果我们返回到配置,则'/etc/exports'中的第一行意味着NFS系统允许来自10.10.1.0/24子网的客户端对'/data/nfs-public'进行只读访问,并且读取由root用户在10.10.1.0/24(客户端)上进行的创建将以nobody用户身份完成。
除10.10.1.0/24上的root以外的任何用户的请求都以nobody用户的身份执行。

'/etc/exports'中的第二行表示NFS系统允许来自10.10.1.0/24子网的客户端对'/data/nfs-root'进行读写访问,并且将以root身份在客户端上进行请求作为服务器上的根。
尝试以服务器上的同一用户身份尝试非root用户的所有请求(用户映射)。

“/etc/exports”中的第三行与第一行基本相同,但是允许读写访问,而不是只读访问。

“ sync”选项仅在将所有数据写入磁盘后才回复NFS请求,因此应该防止服务器重新启动时破坏数据;如果使用了sync,则服务器仅在数据写出后才确认数据。
此页面http://www.comp.org/HOWTO/NFS-HOWTO/performance.html#SYNC-ASYNC,全面讨论了同步和异步行为。

“ no_subtree_check”选项可防止子树检查,如果在客户端打开文件时重命名请求的文件,则可能会产生问题。

重新启动NFS服务:

# service nfs-kernel-server restart
[ ok ] Stopping NFS kernel daemon: mountd nfsd.
[ ok ] Unexporting directories for NFS kernel daemon....
[ ok ] Exporting directories for NFS kernel daemon....
[ ok ] Starting NFS kernel daemon: nfsd mountd.

重新导出所有目录:

# exportfs -r

显示NFS服务器的导出列表:

# showmount -e --no-headers
/data/nfs-no-root 10.10.1.0/24
/data/nfs-root    10.10.1.0/24
/data/nfs-public  10.10.1.0/24

验证NFS是否正在运行:

# 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

100024    1   udp  53926  status

100024    1   tcp  37301  status

100003    2   tcp   2049  nfs

100003    3   tcp   2049  nfs

100003    4   tcp   2049  nfs

100227    2   tcp   2049

100227    3   tcp   2049

100003    2   udp   2049  nfs

100003    3   udp   2049  nfs

100003    4   udp   2049  nfs

100227    2   udp   2049

100227    3   udp   2049

100021    1   udp  51294  nlockmgr

100021    3   udp  51294  nlockmgr

100021    4   udp  51294  nlockmgr

100021    1   tcp  44429  nlockmgr

100021    3   tcp  44429  nlockmgr

100021    4   tcp  44429  nlockmgr

100005    1   udp  54435  mountd

100005    1   tcp  42426  mountd

100005    2   udp  44366  mountd

100005    2   tcp  52098  mountd

100005    3   udp  40581  mountd

100005    3   tcp  47698  mountd

安全NFS服务器

通过使用防火墙或者实现TCP包装器,我可以想到至少两种方法来保护NFS访问('/etc/hosts.allow'和'/etc/hosts.deny')。

我们将通过配置iptables防火墙并仅限制从LAN的访问来保护NFS服务器。

允许从10.10.1.0/24 LAN进行NFS和rpcbind(portmapper)访问:

# iptables -A INPUT -s 10.10.1.0/24 -p tcp -m multiport --dport 111,2049 -j ACCEPT
# iptables -A INPUT -s 10.10.1.0/24 -p udp -m multiport --dport 111,2049 -j ACCEPT

配置NFS客户端和挂载共享

安装NFS:

# apt-get install nfs-common rpcbind

为NFS共享创建安装点:

# mkdir /mnt/nfs1 /mnt/nfs2 /mnt/nfs2

挂载NFS共享:

# mount.nfs 10.10.1.2:/data/nfs-public /mnt/nfs1
# mount.nfs 10.10.1.2:/data/nfs-root /mnt/nfs2
# mount.nfs 10.10.1.2:/data/nfs-no-root /mnt/nfs3

打印有关每个已安装的NFS文件系统的信息:

# nfsstat -m
/mnt/nfs1 from 10.10.1.2:/data/nfs-public
 Flags:	rw,relatime,vers=4,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.10.1.10,minorversion=0,local_lock=none,addr=10.10.1.2
/mnt/nfs2 from 10.10.1.2:/data/nfs-root
 Flags:	rw,relatime,vers=4,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.10.1.10,minorversion=0,local_lock=none,addr=10.10.1.2
/mnt/nfs3 from 10.10.1.2:/data/nfs-no-root
 Flags:	rw,relatime,vers=4,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.10.1.10,minorversion=0,local_lock=none,addr=10.10.1.2

让我们尝试在每个共享上创建一个测试文件。

# touch /mnt/nfs1/test
touch: cannot touch `/mnt/nfs1/test': Read-only file system

这是预期的行为,因为共享在NFS服务器上配置为只读。

# touch /mnt/nfs2/test
# touch /mnt/nfs3/test

由于将NFS服务器配置为可读写访问,所以这两者进行得很好。
现在,让我们检查NFS服务器上的文件和组所有权:

# ls -l /data/nfs-*
/data/nfs-no-root:
total 0
-rw-r--r-- 1 nobody nogroup 0 Nov 29 19:05 test
/data/nfs-public:
total 0
/data/nfs-root:
total 0
-rw-r--r-- 1 root root 0 Nov 29 19:05 test

就像我们在上面看到的那样,“/data/nfs-no-root”文件夹中的测试文件拥有任何人的所有权,即使知道我们是由root用户创建的。
这是由于“ root_squash”,“/data/nfs-root”文件夹中的测试文件由于“ no_root_squash”而具有root所有权。