Linux NFS 服务配置
1. NFS 服务简介 🌐
NFS 是一种允许客户端通过网络访问远程服务器文件系统的协议。通过 NFS,用户可以像访问本地磁盘一样使用远程文件夹。
适用场景:
- 集中化存储管理
- 数据共享
- 负载均衡
2. NFS 服务原理 ⚙️
NFS 使用 RPC(远程过程调用)机制与客户端通信:
- 服务器端 将文件夹共享出来,指定可访问的主机和权限。
- 客户端 挂载共享文件夹后,可通过网络访问共享的内容。
2.1 工作流程
工作原理简图:
工作原理描述:
-
客户端发起请求:
- 客户端(如工作站)通过 NFS 协议向服务器请求访问共享的文件系统。
-
NFS 守护进程:
- 服务器端运行 NFS 守护进程(如
nfsd
),负责处理 NFS 请求。 nfsd
负责实际的文件系统操作,读取或写入文件等。
- 服务器端运行 NFS 守护进程(如
-
RPC(远程过程调用):
- NFS 使用 RPC 来处理远程调用。客户端通过
rpcbind
服务查找 NFS 服务的端口号。
- NFS 使用 RPC 来处理远程调用。客户端通过
-
挂载过程:
- 客户端发送挂载请求到服务器的
mountd
守护进程。 mountd
检查/etc/exports
文件中的配置,确定是否允许客户端挂载,并返回一个文件句柄(File Handle),客户端可以使用这个句柄来访问文件系统。
- 客户端发送挂载请求到服务器的
-
文件访问:
- 客户端使用文件句柄直接与
nfsd
交互,进行文件操作(如读、写、创建、删除等)。
- 客户端使用文件句柄直接与
-
文件锁定:
- 当客户端需要锁定文件时,会通过
lockd
守护进程来管理文件锁定,防止多个客户端同时修改文件。
- 当客户端需要锁定文件时,会通过
-
响应:
- 服务器通过 NFS 协议将响应(如文件内容、操作成功或失败的信息)发送回客户端。
2.2 NFS 协议版本
- NFSv3:支持异步操作,性能较好。
- NFSv4:更安全,支持状态化操作。
以下是 NFSv4 常用端口号的表格:
服务组件 | NFS 版本 | 协议 | 端口号 | 备注 |
---|---|---|---|---|
Portmapper (rpcbind) | v4 | TCP/UDP | 111 | 用于所有 RPC 服务的端口映射,尽管 NFSv4 使用单一端口,但仍可能需要 rpcbind 辅助服务的注册 |
NFS Daemon (nfsd) | v4 | TCP/UDP | 2049 | NFS 数据传输端口,所有 NFSv4 通信都在这个端口上进行 |
Kerberos | v4 | TCP/UDP | 88 | 如果启用 Kerberos 认证,用于 NFSv4 的安全性服务 |
备注:
- NFSv4 简化了端口使用,所有的 NFS 通信都在单一端口 2049 上进行。
rpcbind
仍然可能用于辅助服务的注册,但 NFSv4 本身不依赖于mountd
的单独端口。- 启用 Kerberos 认证时,需要开放 88 端口以支持 Kerberos 服务。
3. 安装 NFS 服务 🛠️
3.1 安装 NFS 服务端
在服务器上安装 NFS 软件包:
# Debian/Ubuntu
sudo apt update && sudo apt install nfs-kernel-server -y
# CentOS/RHEL
sudo yum install nfs-utils -y
3.2 安装 NFS 客户端
在客户端安装 NFS 客户端工具:
# Debian/Ubuntu
sudo apt install nfs-common -y
# CentOS/RHEL
sudo yum install nfs-utils -y
4. 配置 NFS 服务端 🗂️
4.1 编辑共享目录
选择需要共享的目录并设置权限:
sudo mkdir -p /mnt/shared_data # 创建共享目录
sudo chmod 777 /mnt/shared_data # 设置读写权限
4.2 配置导出文件
编辑 NFS 的导出配置文件 /etc/exports
:
sudo nano /etc/exports
添加如下内容:
/mnt/shared_data *(rw,sync,no_root_squash)
参数说明:
rw
:读写权限。sync
:同步模式,提高数据一致性。no_root_squash
:允许客户端的 root 用户拥有 root 权限。
4.3 启动和重启服务
sudo systemctl restart nfs-kernel-server # Debian/Ubuntu
sudo systemctl restart nfs-server # CentOS/RHEL
检查服务状态:
sudo systemctl status nfs-server
如果你想将 NFS 共享的配置分散到不同的文 件中,你可以创建 /etc/exports.d
目录, 保存多个 /etc/exports.d/*.exports
配置文件。
5. 挂载 NFS 共享目录 📂
5.1 检查共享目录
在客户端查看可用的共享目录:
showmount -e <服务器IP>
如果防火墙未配置好,会显示超时!
5.2 挂载共享目录
临时挂载:
sudo mount -t nfs <服务器IP>:/mnt/shared_data /mnt/nfs_client
永久挂载:
编辑
/etc/fstab
文件,添加以下内容:<服务器IP>:/mnt/shared_data /mnt/nfs_client nfs defaults 0 0
保存并加载:
sudo mount -a
6. NFS 常用操作 🔧
6.1 查看已挂载的 NFS 目录
mount | grep nfs
6.2 卸载 NFS 目录
sudo umount /mnt/nfs_client
6.3 重启 NFS 服务
sudo systemctl restart nfs-kernel-server # Debian/Ubuntu
sudo systemctl restart nfs-server # CentOS/RHEL
7. 安全性与优化 🔐
7.1 防火墙配置
示例
# 开放 portmap/rpcbind
firewall-cmd --add-port=111/tcp --permanent
firewall-cmd --add-port=111/udp --permanent
# 开放 NFS
firewall-cmd --add-port=2049/tcp --permanent
firewall-cmd --add-port=2049/udp --permanent
# 开放动态固定端口
firewall-cmd --add-port=4000/tcp --permanent
# 重载防火墙
firewall-cmd --reload
用途
-
TCP/UDP 111
- 服务:
portmap
或rpcbind
- 用于 RPC 服务的端口映射。
- 服务:
-
TCP/UDP 2049
- 服务:NFS 服务端主要端口
- 用于实际的文件传输。
-
mountd端口 4000
-
服务:
rpc.mountd
、rpc.statd
、rpc.lockd
等 -
动态分配端口,具体端口可以通过配置进行固定。这里固定4000端口。
注意,在 NFS 配置文件中(如
/etc/nfs.conf
或启动参数)指定端口:[mountd]
port=4000
-
7.2 限制访问的主机范围
修改配置,限制访问的主机范围,例如只允许 192.168.1.0/24
的设备访问:
/mnt/shared_data 192.168.1.0/24(rw,sync)
8. NFS 权限覆盖规则
8.1 NFS 权限优先级(从高到低)
在 NFS 配置中,权限的覆盖优先级是多方面的,特别是在多个配置文件或规则指向同一个分享目录时,了解覆盖规则对于权限管理至关重要。以下是 NFS 权限覆盖的完整优先级,从高到低排序:
- 服务器文件系统权限 (最高优先级)
- 用户 UID/GID 映射
- 导出配置文件中的规则优先级
- 客户端挂载选项
- 动态 ACL(访问控制列表)权限
- 内核限制和防火墙规则(最低优先级)
总结 🌟
NFS 是一个简单而高效的文件共享解决方案,通过 NFS 服务,为多台设备提供统一的文件访问!首次配置可以暂时关掉防火墙,降低难度!