配置 NFS Server
NFS 背景知识介绍
NFS 是一种古老的用于在 UNIX/Linux 主机之间进行文件分享的协议. 它古老到你必须穿着白大褂才能接近一台计算机的年代. 在那个年代, 所有的联网计算机都被认为是可信的, 而不像现今这样, 任何人都有多种多样方法能连接到你的计算机. 因此, NFS 在开发的时候专注于快速及易用的文件共享, 而忽视了其安全性设计.
在 NFS 协议里, 其安全性是基于主机的. 也就是说, 当你创建了一个文件共享时, 它是基于主机进行权限分配, 而不是基于帐户进行权限分配. 当某台主机连接至 NFS Server 端时, 在该台主机上的用户与 NFS Server 上的具有相同 ID 的用户具有相同的权限. 例如, 客户端 ID 501 的用户与 Server 端 ID 501 的用户具有相同的权限. 因此, 这会引发十分严重的系统安全性问题. 例如: 假设在客户端上有一个用户 Ethan, 其 ID 为 1001, 而在主机端有一个用户 Alex, 其 ID 也为 1001, 且其属于管理员组. 对于计算机而言, 其仅仅识别用户 ID, 而不会关心用户的用户名. 因此, 则当客户端连接至服务器端并进行文件访问时, Server 端进行比判后发现用户 ID 为 1001 的客户端需要访问本机文件, 且其属于管理员组, 因此就会给予其相应的管理员组的权限, 这是一个十分危险的行为, 如此以来,××× 就可以尝试通过穷举的方法, 获取系统的管理权限, 危害性不言而喻.
也正是基于此, NFS 通常会和 NIS 服务联合使用. NIS 服务提供了集中化的用户管理服务, 下一篇博文我会详细介绍该协议.
目前, NFS 共有 4 个版本, 在最新的 NFSV4 中, Kerberos 可以作为一个选项, 为 NFS 协议安全性保驾护航. 本文暂不涉及 kerberos 的配置.
理解 NFS 进程
为了使用 NFS server, 需要配置几个相应的组件. 首先就是 NFS Server 本身, 这是由 linux 内核提供的. 而为了提供服务, NFS 还使用了另一个服务, 即 NFS RPC(远程过程调用)portmapper.(在 CentOS6 后, 该服务已经被替换为 rpcbind 服务)首先, 我们先看一下 RPC 服务的作用.
大家都知道, 现代计算机提供的服务都有其自身固定的端口号. 比如 telnet 协议使用 23 号端口, ssh 使用 22 号端口, http 协议使用 80 号端口, 但 NFS 却没有其固定的端口号, 归根结底, 这是由于 NFS 诞生时, TCP 和 UDP 端口的使用尚未形成统一的规范. 所以, NFS 就使用了自定义的端口号, 也就是所谓的 RPC 功能号码 (RPC program numbers). 直至 NFSV3 为了与现代计算机提供服务的方式相兼容, 这些功能号码必须被转换成一个固定的端口号, 这即是 portmapper(rpcbind) 这个程序的功能. 当一个基于 rpc 的程序 (比如 nfs) 启动时, 它就会将自身正在监听的端口号向 rpc 进行注册. 当某个客户端想要与基于 RPC 的服务进行通信时, 它首先会连接至 portmapper(rpcbind)进程, 从而查找出服务端正在监听的号码, 并与之进行通信. 为了查找你的服务器端正在监听哪些 RPC 端口号, 可以使用命令 rpcinfo -p 命令. 在我的计算机上它显示如下:
[root@localhost ~]# 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
100024 1 udp 58017 status
100005 1 udp 20048 mountd
- 100024 1 tcp 48387 status
- 100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
- 100005 3 tcp 20048 mountd
- 100003 3 tcp 2049 nfs
- 100003 4 tcp 2049 nfs
- 100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 33529 nlockmgr
100021 3 udp 33529 nlockmgr
100021 4 udp 33529 nlockmgr
- 100021 1 tcp 44320 nlockmgr
- 100021 3 tcp 44320 nlockmgr
- 100021 4 tcp 44320 nlockmgr
从命令输出可以看到, NFS 正在监听 2049 端口, 并且其支持 Version3, 4. 其内部使用了 RPC 端口号 10003. 由于 NFS 需要向 RPC 服务进行注册自身使用的端口号, 所以在启动 NFS 服务之前, 必须确保 portmapper 服务已经启动. 所有的各 Linux 主要发行版均会在你启动 NFS Server 时自动确保该点实现.
当启动 portmapper 后, 其它的 NFS Server 组件就可以启动了. 首先即是 rpc.nfsd 进程. 该进程用来通知 portmapper 有一个 NFS Server 启动了, 并且告诉 NFS Server 端 portmapper 的功能号.
第二个需要启动的就是 rpc.mountd 进程. 该进程允许客户端将 nfs Server 共享文件挂载至本地.
第三个可选启动的即是 rpc.lockd 进程. 该进程确保在同一时刻, 仅有一个用户可以访问同一个文件. 这些进程不需要手动启动, 它们由启动 NFS Server 时的脚本自动加载运行.
需要注意的是从 NFSV4 开始, NFS 进程发生了重大变化. 在 NFSV4 中, 其使用固定的端口号 2049 对外提供服务. 这使得配置管理和使用 NFS 变得更容易了, 特别是在一些使用防火墙的场景中.
最后一个部分是关于 NFS Server 端的配置文件, 总共有两个文件. 第一个是 / etc/exports 文件. 在该文件中, 指出了 NFS 需要共享的文件. 在其余的 Linux 发行版诸如: SUSE 和 Red Hat, 还用另一个配置文件:/etc/sysconfig/nfs, 该配置文件配置了 NFS 的线程数及启动参数等等.
配置 NFS Server 端
在大多数的 linux 发行版中, 有两个配置文件需要进行配置. 第一个即为 / etc/exports. 在所有的 linux 发行版中都有该配置文件. 在该文件中用于配置你想在网络中共享的文件目录. 除此之外, 还可能用到 / etc/sysconfig/nfs 文件, 该文件中定义了一系列的参数, 定义了 NFS Server 的服务方式.
在 / etc/exports 中定义文件共享的方式的结构如下:
目录 主机(选项)
其中, 目录即是你想共享的文件目录, 例如: /share.
其次, 主机定义了允许访问你开放的共享目录的主机名, 可以通过以下几种方式定义:
l 主机名, 可以是短主机名也可以 FQDN 名
l 单个的主机 IP 地址
l 通过名称标识的某个网段, 例如:*.mydomain.com
l 通过 IP 地址和子网掩码表示的某个网段, 例如: 192.168.10.0/255.255.255.0
l 用 * 号表示的所有网段
配置完允许哪些主机可以访问 NFS Server 上的共享目录后, 还需指定这些主机访问该文件夹时的选项. 常用的选项如表一所示:
表一 常用 NFS 选项
选项 | 含义 |
RO | 故名思义,只读导出,无论目录权限如何,用户只能以只读权限访问,任何的写入均是被禁止的。 |
Rw | 文件系统以可读写的方式导出,最终用户访问时的权限,由本地目录的权限决定。 |
Root_squash | 当以 root 用户的身份访问共享目录时,其用户 ID 被映射成 65534, 即 nobody。 也即意味着你不会有任何的写权限,并且根据 NFS Server 端的配置,很可能没有任何的权限。这是一个默认选项。它确保了当某个终端用户用 root 用户访问共享目录时,不会得到 root 用户的权限,从而保证了系统的安全性。 |
No_root_squash | 不压缩 root 用户权限。即当用户以 root 用户的身份访问某个文件夹时,给予其相应的 root 权限。 |
Sync | 同步写入磁盘选项,该选项用于保证用户对文件或目录所做的修改,在其它用户访问前即时生效。虽然使用该选项效率稍低,但由于其可以有效减少文件丢失,推荐使用。 |
举个例子:
/ ilulissat(rw) kangerlussuaq(rw,no_root_squash)
在本例中, ilulissat 主机对共享的根文件系统有读写权限, 但该主机的 root 用户当访问共享的根文件系统时其并不具有 root 权限. 而 kangerlussuaq 用户对共享的根文件系统也享有读写权限, 并且当从该主机以 root 用户访问该共享根文件系统时, 其拥有 root 权限.
通过 exportfs 调整导出文件系统
当 NFS Server 启动后, 其在 / var/lib/nfs/xtab 文件中保留了一份导出文件目录, 其通过在 NFS Server 初始化时调用 exportfs -a 命令实现. 通过使用 exportfs 命令, 可以更改 NFS Server 的文件系统导出列表, 而不必编辑 / etc/exports 文件或者重启 NFS Server. 例如: 以下命令实现将 / srv 目录导出至 192.1681.0 网段:
exportfs 192.168.1.0/255.255.255.0:/srv
执行上述命令后, 导出即刻生效, 但重启 NFS Server 后会失效. 因此, 如果需要其永久有效, 必须将其包含至 / etc/exports 文件中.
配置 NFS Client
NFS Server 端配置好后, 就可以开始配置 NFS Client 端了, 有两种办法实现挂载 NFS 系统:
l 手动挂载
l 通过 fstab 自动挂载
通过 mount 命令手动挂载
最快的访问 NFS 共享目录的方法就是调用 mount 命令. 仅需指定需挂载的文件系统的类型为 nfs, 并且指明需要挂载的目录以及挂载点, 就可以快速进行访问了. 下面的例子演示了如下通过本地的 / mnt 目录访问 NFS Server 上共享的 / opt 目录.
mount -t nfs STN:/opt /mnt
需要特别注意是的 NFS Server 名称后的冒号, 它将 NFS Server 的名称和其共享的目录分割开来. 尽管你可以不加任何参数的挂载并访问 NFS Server 的共享目录, 但是仍然有一些参数可以使得访问 nfs 的共享目录更加容易一些. 常见的选项如表 2 所示.
表 2: 常用的 NFS 挂载选项
选项 | 含义 |
Soft | 使用该选项,用来告诉 mount 命令,不要一直不间断尝试挂载远程共享目录。如果默认超时时间(60s)过后, 仍然挂载不上,就不再尝试挂载。对那些非关键的挂载可以使用该选项。 |
Hard | 使用该选项,用来告诉 mount 命令,要一直尝试不间断挂载远程共享目录。需要注意的是如果在系统启动的时候使用该选项,有可能导致启动进程停滞。因此,仅在确实需要挂载的目录下使用该选项。 |
Fg | 该选项为默认选项。用来告诉 mount 命令所有的 mount 操作必须在前台运行。结果就是在挂载过程中在当前终端界面用户无法进行其它工作。 |
Bg | 该选项用来进行后台挂载。如果第一次挂载不成功的话,所有的其它的尝试过载均在后台进行。 |
Rsize=n | 通过这个选项,用户可以指定客户端从服务器端可以一次性读取的字节数。 由于兼容性的原因,该参数默认为 1024 字节。NFSV3 后的版本可以读取更多数据。为了提高系统访问速度,可以将其设置为了一个更大的值,如 8192。 |
Wsize=n | 该选项用来设置一次性可以写入的最大字节数。默认为 1024 字节。NFSV3 后的版本可以处理更多的数据,所以可以指定例如 8192 字节以提高系统的写入速度。 |
Retry=n | 这个选项用来指明一次挂载可以等待的最大的分钟数。默认值是 10000(6.94 天)。可以考虑将其设置为一个更小的值以避免在不能建立的 mount 连接上长时间等待。 |
Nosuid | 用这个选项指明 SUID 及 SGID 选项不能用于导出文件系统上,这是一个安全选项。 |
Noexec | 使用该选项用来禁止在导出文件系统上执行任何可执行文件 |
通过 fstab 自动挂载 NFS 共享目录
使用 mount 命令可以快速的挂载 NFS 共享目录. 但如果需要多次挂载相同的共享目录, 则应该使用 / etc/fstab 文件. 如果你已经了解了如何在 / etc/fstab 下增加新的条目, 则自动挂载就会变得非常简单. 唯一的区别就是必须要指定的完整 nfs 共享目录的路径而不是指定设备名称, 同时, 还必须指定相应的挂载选项. 当通过 / etc/fstab 自动挂载时, 应该总是指定 rsize,wsize 及 soft 选项进行性能优化. 可以通过服务器的名字或 IP 地址指定 NFS 服务器. 举个例子:
server:/nfsshare /mnt/nfsserver nfs rsize=8192,wsize=8192,soft 1 2
获取 NFS 共享目录导出列表
为了挂载 NFS 共享目录, 必须首先了解 server 端提供了哪些导出目录. 可以通过使用命令 showmount 得出. 命令使用非常简单: showmount -e 后跟想要检查的 host 的主机名即可. 例如:
- showmount -e localhost:
- [root@localhost /]# showmount -e localhost
- Export list for localhost:
- /usr/centos_6.4iso 10.1.11.0/24
好了, 这就是 NFS 系统的全部内容, 有任何问题欢迎私信我交流, 有不对的地方欢迎评论区指正!
来源: http://www.bubuko.com/infodetail-2704312.html