【共享服务】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状态信息,其中
mountd
和nlockmgr
服务启动端口不固定(可通过重启rpcbind
和nfs-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服务端防火墙开放相关服务固定端口
服务端防火墙开放2049
、111
、20048
、42315
端口,此时客户端可正常访问挂载
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