在Linux中导出NFS共享的10个示例
导出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使用带有?主机名
我们可以使用?
通配符来匹配主机名中的单个字符,例如,匹配server1
,server2
,serverA
和serverX
我们可以使用:
/dump/backups server?(sync)
如果我们希望匹配多个字符,则可以多次使用"?
"。
例如,要匹配server12
,server23
,serverAB
,serverXY
,我们可以使用:
/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)