一、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
