【共享服务】nfs常见问题处理


一、nfs服务端防火墙策略配置

1、问题描述

启用nfs服务端防火墙之后,客户端无法进行showmount及挂载操作

  • 服务端开启防火墙
ufw allow 22
ufw enable
  • 客户端showmount失败
[root@node189 ~]# showmount -e 172.16.21.62
clnt_create: RPC: Port mapper failure - Timed out

2、原因分析

nfs服务端未开放相关服务组件访问端口

  • 查看服务端rpc状态信息,其中mountdnlockmgr 服务启动端口不固定(可通过重启rpcbindnfs-server服务前后对比打印信息)
root@node62:~# 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
    100005    1   udp  49828  mountd
    100005    1   tcp  48723  mountd
    100005    2   udp  39593  mountd
    100005    2   tcp  37875  mountd
    100005    3   udp  60110  mountd
    100005    3   tcp  45926  mountd
    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  55554  nlockmgr
    100021    3   udp  55554  nlockmgr
    100021    4   udp  55554  nlockmgr
    100021    1   tcp  43039  nlockmgr
    100021    3   tcp  43039  nlockmgr
    100021    4   tcp  43039  nlockmgr
  • 确认nfs相关服务组件及端口占用如下
服务名称 端口名称 协议名称 备注
nfs 2049 tcp/udp 端口固定
portmapper 111 tcp/udp 端口固定
mountd 20048 tcp/udp 端口不固定,需人为修改固定
nlockmgr 42315 tcp/udp 端口不固定,需人为修改固定

3、解决方法

3.1、更改相关服务为固定端口
  • 更改mountd 服务端口为20048
echo "mountd 20048/tcp" >> /etc/services
echo "mountd 20048/udp" >> /etc/services
  • 更改nlockmgr 服务端口为42315
echo "fs.nfs.nlm_udpport=42315" >> /etc/sysctl.conf
echo "fs.nfs.nlm_tcpport=42315" >> /etc/sysctl.conf
sysctl -p
3.2、nfs服务端防火墙开放相关服务固定端口

服务端防火墙开放20491112004842315 端口,此时客户端可正常访问挂载

ufw allow 2049/tcp
ufw allow 2049/udp
ufw allow 111/tcp
ufw allow 111/udp
ufw allow 20048/tcp
ufw allow 20048/udp
ufw allow 42315/tcp
ufw allow 42315/udp
  • 此时客户端可正常showmount及挂载访问
[root@node189 ~]# showmount -e 172.16.21.62
clnt_create: RPC: Port mapper failure - Timed out

[root@node189 ~]# showmount -e 172.16.21.62
Export list for 172.16.21.62:
/cephnfs/cephfs/nfsdir *
/cephnfs/cephfs        127.0.0
[root@node189 ~]# mount -t nfs 172.16.21.62:/cephnfs/cephfs/nfsdir /mnt

二、漏洞扫描工具检测nfs服务端存在漏洞,可以对nfs服务端进行showmount -e操作

1、问题描述:

客户使用漏洞扫描工具,检测到nfs服务端存在被攻击风险,相关信息如下

  • 详细描述:可以对目标主机进行"showmount -e"操作,此操作将泄漏目标主机大量敏感信息,比如目录结构。更糟糕的是,如果访问控制不严的话,攻击者可能直接访问到目标主机上的数据
  • 修补建议:限制可以获取到NFS输出列表的IP和用户。
    除非绝对必要,请关闭NFS服务,MOUNTD

2、解决方法:

默认情况下,nfs服务端未做任何限制,任意主机都可以对nfs服务端进行"showmount -e"操作。
一个IP请求连入,linux的检查策略是先看/etc/hosts.allow中是否允许,如果允许直接放行;如果没有,则再看/etc/hosts.deny中是否禁止,如果禁止那么就禁止连入。
两个配置文件的关系为:/etc/hosts.allow 的设定优先于/etc/hosts.deny
service_name 必须与/etc/rc.d/init.d/* 里面的程序名称要相同

  • 1、修改/etc/hosts.allow配置文件,添加允许访问的服务及客户端IP地址
    注:当存在多个IP地址时可使用, 分割开,如mountd:172.16.21.111,172.16.21.245
 [root@node117 ~]# cat /etc/hosts.allow 
 mountd:172.16.21.111
 rpcbind:172.16.21.111:allow
  • 2、修改/etc/hosts.deny配置文件,默认不允许任何客户端访问mountd和rpcbind服务
[root@node117 ~]# cat /etc/hosts.deny
mountd:ALL
rpcbind:ALL:deny
  • 3、重启nfs服务
[root@node117 ~]# systemctl restart nfs

在白名单的客户端可以正常进行"showmount -e"操作,而不在白名单的客户端禁止访问

[root@node111 ~]# showmount -e 172.16.21.117
Export list for 172.16.21.117:
/cephnfs/cephfs/ftp 172.16.21.111
.
[root@node112 ~]# showmount -e 172.16.21.117
clnt_create: RPC: Port mapper failure - Authentication error

三、客户端挂载nfs失败,提示"mount.nfs:access denied by server while mounting"

1、问题描述

客户端挂载nfs失败,提示"mount.nfs:access denied by server while mounting"

mount -t nfs x.x.x.x:/share /mnt
mount.nfs: access denied by server while mounting x.x.x.x:/share

2、原因分析

客户端挂载nfs失败是一个比较常见的问题,通常有很多原因会导致出现这样的结果
挂载的时候可以指定-vvvv参数查看更多具体错误信息

mount -t nfs -vvvv server.example.com:/share /mnt

3、解决方法

此处列举一些常见可能导致挂载失败的原因,以及对应解决方法

3.1、客户端nfs挂载协议与服务端不一致
  • 问题原因
    服务端只支持nfs v3协议连接,而客户端默认挂载通常使用nfs v4协议,协议不匹配导致挂载失败
  • 解决办法
    通常遇到这种问题,客户端挂载指定-o nfsvers=3即可
mount -t nfs -o nfsvers=3 x.x.x.x:/share /mnt
3.2、nfs无法提供锁服务
  • 问题原因
    问题错误打印信息如下,nfs默认使用远程锁(即local_lock=none),但是提供远程锁的rpc.statd服务未启动
mount.nfs:rpc.statd is not running but is required for remote locking.
mount.nfs:Either use '-o nolock' to keep locks local,or start statd.
  • 解决方法
    有以下两种解决方法:
    1、使用远程锁:启动服务端rpc.statd服务,使用这个服务提供远程锁
    2、使用本地锁:客户端挂载指定-o nolock,查看此时客户端挂载参数使用本地锁(local_lock=all)
mount -t nfs -o nolock x.x.x.x:/share /mnt