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

当有客户端向本机发起请求时,检查流程如下:


  1. 检查此次请求是否匹配 /etc/hosts.allow 的规则,若匹配则允许访问。
  2. 如果不匹配 hosts.allow ,则检查此次请求是否匹配 /etc/hosts.deny 的规则,若匹配则拒绝访问
  3. 若 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