在Linux中导出NFS共享的10个示例

时间:2020-01-09 10:42:46  来源:igfitidea点击:

导出NFS共享的常规语法

我们必须使用/etc/exports创建NFS共享的常规语法为:

/PATH/TO/DIR HOST([OPTIONS])

文件中的每一行都指定一个远程安装点。
第一个字段包含安装点目录路径,然后可选地包含选项列表和/或者由空格分隔的特定主机列表。
如果未指定特定主机,则安装点将导出到所有主机。

1.将NFS共享导出到单个主机

要使用NFS将/dump/backups导出到单个客户端10.43.138.2,我将在下面添加到/etc/exports中:

# cat /etc/exports
/dump/backups 10.43.138.2

刷新共享

# exportfs -r
exportfs: No options for /dump/backups 10.43.138.2: suggest 10.43.138.2(sync) to avoid warning

由于我们没有为NFS共享提供任何选项,因此我们收到此警告。
它可以工作,但建议在" OPTIONS"部分中添加至少" sync",以避免出现此警告

所以我更新了我的/etc/exports

/dump/backups 10.43.138.2(sync)

净刷新份额

# exportfs -r

现在我们没有收到任何警告,请验证现有共享

# exportfs -v
/dump/backups  10.43.138.2(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

2.将NFS共享导出到所有主机

将NFS共享导出到整个世界(这在生产中是一个危险的术语,但实际上这就是这个意思)。
我们将使用*启用NFS对共享到NFS服务器具有访问权限的所有网络的共享的访问权限

# cat /etc/exports
/dump/backups *(sync)

因此,其中我们没有在任何主机的NFS共享的导出文件中添加任何限制

3.将NFS共享导出到IP范围

现在,我们将创建一个" exportfs"共享,而不是单个主机,该共享将由网络IP范围(即" 10.43.138.1/27")中的所有主机访问。

# cat /etc/exports
/dump/backups 10.43.138.2/27(sync)

或者,如果我们没有前缀值,则可以提供子网的" netmask"值

# cat /etc/exports
/dump/backups 10.43.138.2/255.255.255.224(sync)

4.将NFS共享导出到多个主机

要将共享导出到跨不同网络范围的多个主机,必须创建各个主机的单独条目。

# cat /etc/exports
/dump/backups 10.43.138.0/255.255.255.224(sync)
/dump/backups 192.168.0.1/255.255.255.0(sync)
/dump/backups 192.168.100.10(sync)
/dump/backups 10.10.10.0/24(sync)

在此示例中,我将同一路径导出到跨不同网络的多个主机。

我们也可以"在一行中添加它们",但是为了使文件内容看起来更干净,我对同一共享使用了不同的条目。
为了将所有这些添加到一行中,syntax将是:

/PATH/TO/DIR HOST1([OPTIONS]) HOST2([OPTIONS]) HOST3([OPTIONS])

要在最后一个示例中使用单行共享,我们可以使用:

/dump/backups 10.43.138.0/255.255.255.224(sync) 192.168.0.1/255.255.255.0(sync) 192.168.100.10(sync) 10.10.10.0/24(sync)

5.限制指定主机的NFS共享

我们可以通过仅提供那些应被允许访问共享的主机列表来限制/etc/exports本身的共享。
但是有时候,例如当我们在/etc/exports的允许列表中提供了整个网络时

/dump/backups 10.43.138.0/255.255.255.224(sync)

但是我们只希望将共享限制为" 10.43.138.2"主机。
在这种情况下,这可能很棘手。

使用NFSv3,我们可以使用hosts.deny来限制对这些主机的访问,方法是使用rpcbind,mountd,nfsd,statd,lockd,rquotad来定义访问规则,但是NFSv4不可能做到这一点,因为它不使用这些守护程序。
更多的。

为了限制使用NFSv3的主机,我们将在" 10.43.138.2"下面添加条目

# echo "rpcbind: 10.43.138.2" >> /etc/hosts.deny

现在,如果我们尝试使用此主机访问NFS共享,请执行以下操作:

# mount -o nfsvers=3 10.43.138.1:/dump/backups /mnt
mount.nfs: access denied by server while mounting 10.43.138.1:/dump/backups

但是,如果我尝试使用NFSv4访问相同的共享

# mount -o nfsvers=4 10.43.138.1:/dump/backups /mnt

有用。
因此hosts.deny无法阻止该请求。
为了解决这个问题,我们可以依靠防火墙来阻止相应的主机访问NFS服务器

5.1使用iptables限制NFS共享

# iptables -I INPUT -s 10.43.138.2 -p tcp --dport nfs -j DROP
# iptables -I INPUT -s 10.43.138.2 -p udp --dport nfs -j DROP

5.2使用防火墙丰富规则限制NFS共享

# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='10.10.10.4' service name='nfs'  reject"
# firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='10.10.10.4' service name='mountd'  reject"
# firewall-cmd --reload

但是,使用通配符,我们可以更好地控制希望允许访问NFS共享的主机(我们将在接下来学习)。

6.如何在NFS导出中使用通配符

机器名称可以包含通配符*
,或者可以包含在方括号中的字符类列表。
这可以用来使导出文件更紧凑

提示:

通配符不应与IP地址一起使用;但是,如果反向DNS查找失败,则它们可能会意外工作。
使用通配符,必须确保使用/etc/hosts或者DNS服务器将提供的主机名解析为IP地址。

6.1使用带有?主机名

我们可以使用通配符来匹配主机名中的单个字符,例如,匹配server1server2serverAserverX我们可以使用:

/dump/backups server?(sync)

如果我们希望匹配多个字符,则可以多次使用"?
"。
例如,要匹配server12server23serverABserverXY,我们可以使用:

/dump/backups server??(sync)

6.2使用带有主机名的方括号

我们可以使用方括号定义数字或者字符的范围。
下面的示例将匹配主机名在server00.example.com和server99.example.com之间的所有计算机。

/dump/backups server[0-9][0-9].example.com(sync)

要将server1映射到server5,我们可以使用

/dump/backups server[1-5](sync)

要使用方括号映射字符,例如,将serverA匹配至serverE,在这种情况下,请使用:

/dump/backups server[A-E](sync)

6.3在主机名上使用*

如我们所料,*表示匹配所有内容。
因此,假设我们在example.com下有多个子域,则可以简单地使用* .example.com来匹配所有子域

/dump/backups *.example.com(sync)

所以这将匹配

mail.example.com
cdn.example.com
host.example.com

但这不匹配

ab.cd.example.com

因此,为了匹配此条件,我们必须使用:

/dump/backups *.*.example.com(sync)

所以我希望你有主意。

7.将NFS共享导出为只读模式

要分配具有只读权限的共享,请执行以下操作:

# cat /etc/exports
/dump/backups 10.43.138.2(ro,sync)

刷新股票

# exportfs -r

验证导出的共享和选项:

# exportfs -v
/dump/backups  10.43.138.2(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)

8.将NFS共享导出为读写模式

要导出具有读写权限的共享,请使用:

# cat /etc/exports
/dump/backups 10.43.138.2(rw,sync)

刷新并验证共享和已应用的选项:

# exportfs -r
# exportfs -v
/dump/backups  10.43.138.2(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

现在,如果有人在客户端节点上的这些共享中创建文件:

[root@nfs-client ~]# mount -o nfsvers=4 10.43.138.1:/dump/backups /mnt

以root用户身份创建一个新文件

[root@nfs-client ~]# touch /mnt/file

验证权限

[root@nfs-client ~]# ls -l
total 0
-rw-r----- 1 nfsnobody nfsnobody 0 Aug 20 13:31 file

如我们所见,新文件是使用nobody权限创建的。
默认情况下,当以" root_squash"权限导出NFS共享时,因此将从root用户进行的任何文件访问和修改都将在匿名帐户(称为" nobody"用户)下进行。

尽管如果我们使用普通用户创建文件,则文件将反映为文件的用户和所有者:

[hynman@nfs-client ~]$ls -l /mnt/
total 0
-rw-r----- 1 nfsnobody nfsnobody 0 Aug 20 13:31 file
-rw-r----- 1 hynman    users     0 Aug 20 13:36 file1

9.仅使用NFSv4导出共享

如果我们希望创建只能通过NFSv4访问的共享,则必须修改/etc/nfs.conf

[root@nfs-server ~]# vim /etc/nfs.conf
[nfsd]
 vers2=n
 vers3=n
 vers4=y
 vers4.0=y
 vers4.1=y
 vers4.2=y

确保禁用vers2和vers3以仅允许通过NFSv4进行连接

(可选)禁用对RPCBIND,MOUNT和NSM协议调用的侦听,这在仅NFSv4的情况下是不必要的。
禁用相关服务:

[root@nfs-server ~]# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
Created symlink /etc/systemd/system/rpc-statd.service → /dev/null.
Created symlink /etc/systemd/system/rpcbind.service → /dev/null.
Created symlink /etc/systemd/system/rpcbind.socket → /dev/null.

配置NFS服务器后,重新启动NFS服务器以激活更改并启用它,使其在重启后自动启动。
我们还可以使用systemctl status nfs-server检查nfs状态。

[root@nfs-server ~]# systemctl restart nfs-server
[root@nfs-server ~]# systemctl enable nfs-server

使用netstat实用工具来列出侦听TCP和UDP协议的服务:

以下是仅NFSv4服务器上的netstat输出示例;还禁用了侦听RPCBIND,MOUNT和NSM的功能。
其中nfs是唯一正在监听的NFS服务:

[root@nfs-server ~]#  netstat --listening --tcp --udp | grep nfs
tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN
tcp6       0      0 [::]:nfs                [::]:*                  LISTEN

接下来,我们可以使用/etc/exports创建一个共享。
我们无需在此处定义任何其他权限:

/dump/backups 10.43.138.2(rw,sync)

现在,只能通过NFSv4访问此共享。

提示:

类似地,我们可以仅通过NFSv3控制NFS共享访问,也可以使用nfs.conf允许NFSv3和NFSv4.

10.在NFS共享上启用root访问

如前所述,默认情况下," root_squash"权限被添加到NFS共享中,这意味着该权限阻止远程root用户在安装了NFS的远程卷上拥有超级用户(root)特权。
其中挤压实际上是指挤压远程根用户的能力

因此,要启用root访问,我们将使用no_root_squash,它允许NFS客户端主机上的root用户以与超级用户通常相同的权限访问NFS挂载的目录。

要禁用西葫芦,我们使用:

# cat /etc/exports
/dump/backups 10.43.138.2(rw,sync,no_root_squash)

刷新共享

# exportfs -v
/dump/backups  10.43.138.2(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)