NFS服务器的安全设置及性能调优
背景
虽说现在到处是oss、minio、fastdfs的天下,但NFS对于很多公司来说,还是有其可取之处的,像我们的项目是一直在用的,今天好好研究下相关配置。
安装
略
配置
配置文件 /etc/exports,内容通常如下:
directory machine1(option11,option12)
directory
要共享的目录。如 /data/
machine1
nfs客户端,就是哪些机器可以访问他,可以是指定ip,也可以是一个ip段。
option 重要的权限有如下几种:
- ro : 只读,不可写
- rw:有读写权限
- no_root_squash/root_squash:默认情况下,客户端上的root用户发出的任何请求都会变成服务端的nobody用户权限去执行。如果开启了此项,客户端上的root用户发出的请求等同服务端的root用户权限,会有安全隐患,不建议使用 no_root_squash
- async/sync: 默认情况下,所有exportfs命令都将使用异步,即使用sync选项文件先保存在内存中,达到触发条件再发往服务端,性能较好,但存在风险。若使用同步async,则实时存到服务端。
举个例子,现在有172.18.11.1、172.18.11.2要访问NFS服务端,/data/ 目录需要读写,/home/ 目录只读权限,示例如下:
/data 172.18.11.1(rw) 172.18.11.2(rw)
/home 172.18.11.1(ro) 172.18.11.2(ro)
如果是整个ip段需要访问的话,示例如下:
/data 172.18.11.0/24(rw)
/home 172.18.11.0/24(ro)
安全
最开始不清楚有多少主机需要使用NFS服务端,所以在 /etc/exports 指定了一个段可以访问,如下
/data 172.18.11.0/24(rw)
但安全部门不允许,要求指定ip,修改 /etc/exports 为:
/data 172.18.11.1(rw) 172.18.11.2(rw)
除了在 /etc/exports 指定ip,也可以通过 /etc/hosts.allow、/etc/hosts.deny 来限制
这两个文件可以指定局域网内有哪些机器可以使用本机的服务。该文件每一行的文件格式如下:
service ip
当有客户端向本机发起请求时,检查流程如下:
- 检查此次请求是否匹配 /etc/hosts.allow 的规则,若匹配则允许访问。
- 如果不匹配 hosts.allow ,则检查此次请求是否匹配 /etc/hosts.deny 的规则,若匹配则拒绝访问
- 若 hosts.allow、hosts.deny 均不匹配,则允许访问。
下面开始操作:
首先在 hosts.deny 拒绝所有
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
然后在 hosts.allow 允许指定ip
lockd: 172.18.11.1
mountd: 172.18.11.1
rquotad: 172.18.11.1
statd: 172.18.11.1
性能
同步/异步
同步就是数据已经写入本地存储后,服务器才会回复客户端说OK了,当NFS服务器或网络出现故障时,文件丢失的可能性较小。
异步则是不等待数据写入存储即回复客户端说OK了,则节省I/O请求的时间并节约性能。但是存在数据丢失的风险。
看你怎么选了。
NFS 守护进程的数量
NFS使用服务器上的线程来处理输入输出的I/O请求,这在进程中显示为nfsd,默认情况下NFS启动8个nfsd进程,而现在的服务器配置都比较高,可以调整为16个或32个。
tcp参数调优
两个参数:系统输入和输出队列
增加输入和输出队列的大小允许通过 NFS 传输更多数据。实际上,正在增加可以存储数据的缓冲区的大小。内存中可以存储的数据越多,NFS 处理它的速度就越快(即,排队的数据越多)。NFS 服务器 NFS 守护进程共享相同的套接字输入和输出队列,因此如果队列更大,所有 NFS 守护进程都有更多的缓冲区并且可以更快地发送和接收数据。对于输入队列,要修改的两个值是/proc/sys/net/core/rmem_default(读取队列的默认大小,以字节为单位)和/proc/sys/net/core/rmem_max(读取队列的最大大小)以字节为单位的读取队列)。这些值很容易修改:
echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/rmem_max
这些命令将读取缓冲区大小更改为 256KiB(以 2 为基数),由 NFS 守护进程共享。您可以对 NFS 守护进程共享的写入缓冲区执行相同的操作:
echo 262144 > /proc/sys/net/core/wmem_default
echo 262144 > /proc/sys/net/core/wmem_max