本页介绍了如何连接 NFS 客户端。
准备工作
根据您的 Linux 发行版类型安装 NFS 客户端工具,以准备客户端:
RedHat
运行以下命令:
sudo yum install -y nfs-utils
SuSe
运行以下命令:
sudo yum install -y nfs-utils
Debian
运行以下命令:
sudo apt-get install nfs-common
Ubuntu
运行以下命令:
sudo apt-get install nfs-common
使用导出政策控制卷访问权限
NFSv3 和 NFSv4.1 中的卷访问权限控制基于客户端的 IP 地址。 卷的导出政策最多包含 20 条导出规则。每条规则都是以英文逗号分隔的 IP 或网络 CIDR 列表,用于定义已启用允许的客户端以挂载卷。规则还定义了客户端拥有的访问权限类型,例如读写或只读。
使用以下标签页可根据 NFS 版本查看政策:
不含 Kerberos 的 NFS
所有不使用 Kerberos 的 NFS 版本都使用 AUTH_SYS 安全风格。在此模式下,您必须严格管理导出规则,以仅允许您信任且可以确保用户 ID 和群组 ID 完整性的客户端。
出于安全考虑,NFS 服务器会自动将带有 UID=0(根)的 NFS 调用映射到 UID=65534(匿名),后者在文件系统上具有有限的权限。如需了解详情,请参阅用户 ID 合并。
将 NFSv4.1 与 Kerberos 搭配使用
使用 Kerberos 的 NFSv4.1 使用导出政策和额外的 Kerberos 身份验证来访问卷。您可以配置导出规则,以应用于以下内容:
仅限 Kerberos (
krb5)Kerberos 签名 (
krb5i)Kerberos 隐私权 (
krb5p)
导出政策最佳实践
我们建议您在制定导出政策时遵循以下最佳实践:
按从最具体到最不具体的顺序排列导出规则。
仅导出到受信任的客户端,例如具有受信任客户端的特定客户端或 CIDR。
将根访问权限限制为仅供一小部分受信任的管理客户端使用。
| 规则 | 允许的客户端 | 访问 | 根访问权限 | 说明 |
|---|---|---|---|---|
| 1 | 10.10.5.3、 10.10.5.9 |
读写 | 开启 | 管理客户端。根用户保持根身份,可以管理 所有文件权限。 |
| 2 | 10.10.5.0/24 | 读写 | 关闭 | 允许 10.10.5.0/24 网络中的所有其他客户端装载, 但 root 访问权限会映射到 nobody。 |
| 3 | 10.10.6.0/24 | 只读 | 关闭 | 其他网络可以从卷读取数据,但不能写入数据。 |
客户端装载卷后,文件级访问权限会决定用户可以执行的操作。如需了解详情,请参阅适用于 UNIX 样式卷的 NFS 文件级访问权限控制。
用户 ID 合并
NFS 导出政策可用于控制用户和群组 ID 压缩,以便出于安全目的将用户和群组 ID 重新映射到匿名用户 ID。
根用户废除
NFS 服务器通过将根用户 (UID=0) 重新映射为 nobody (UID=65534) 来提高安全性,这使得 root 成为对卷上的文件进行访问的无特权用户。此功能称为“根压缩”。在 NFS 服务器上,用于停用此功能并保留 root 权限的选项称为 no_root_squash。
默认情况下,未定义导出政策的卷无法供客户端 IP 地址访问。在 Google Cloud 控制台中创建导出政策规则时,默认设置包括读取和写入访问权限和 root squash。Google Cloud API、Google Cloud CLI 和 Terraform 之前支持使用 has-root-access 参数控制根用户压缩。虽然系统仍接受 has-root-access,但该参数已被 squash-mode 参数取代。
最佳实践是,创建一个专用导出规则,为可信的管理员主机启用 root 访问权限,并为其他客户端停用 root 访问权限。将此规则放在更通用的规则之前。
用户和群组 ID 压缩
squash-mode 参数可用于控制将用户 ID 和群组 ID 压缩为匿名 UID,这对于公共 SFTP Dropbox 目录非常有用。此参数还取代了 has-root-access 参数,并且在 API、Google Cloud CLI 和 Terraform 中均受支持。
squash-mode 参数接受以下值:
no-root-squash:在此模式下,根用户仍为 root,不会重新映射到 nobody (UID=65534)。root-squash:此设置会将根用户重新映射为 nobody。all-squash:此选项可为所有用户(包括 root 用户)提供匿名访问权限。所有用户都会重新映射到anon-uid参数指定的 UID 和 GID。使用all-squash时,您还必须指定anon-uid,并将access-type设置为READ_WRITE。
注意事项
对于包含 squash mode 的导出政策规则,请考虑以下事项:
一项导出政策仅支持一条
all-squash规则。启用
all-squash后,根用户会被废除为匿名用户。不过,使用no-root-squash的更高优先级规则可以覆盖此设置。卷复制不支持具有
squash-mode样式导出政策规则的卷。对于 Flex 服务等级,
all-squash不会自动更改卷的根 inode 的所有权。为此,请添加no-root-squash导出规则,允许根用户使用chown将根 inode 的所有权更改为所需的 UID。支持
has-root-access参数。使用has-root-access或squash-mode,但不要同时使用这两个参数。
修改卷
使用 Google Cloud CLI,按照以下说明操作,以使用 squash 模式更新卷的导出政策:
gcloud
使用 squash 模式更新具有导出政策的卷:
gcloud netapp volumes update VOLUME_ID \ --project=PROJECT_ID \ --location=LOCATION \ --export-policy=access-type=ACCESS_TYPE,squash-mode=SQUASH_MODE,anon-uid=ANON_UID,allowed-clients=ALLOWED_CLIENTS_IP_ADDRESSES
请替换以下信息:
VOLUME_ID:卷的 ID。PROJECT_ID:卷所在项目的名称。LOCATION:卷的位置。ACCESS_TYPE:访问类型必须是READ_WRITE、READ_ONLY或READ_NONE中的一个。SQUASH_MODE:导出规则必须是NO_ROOT_SQUASH、ROOT_SQUASH或ALL_SQUASH中的一个。ANON_UID:要压缩到的 UID 编号。ALLOWED_CLIENTS_IP_ADDRESSES:以英文逗号分隔的允许的客户端 IP 地址或范围的列表。
可以重复使用导出政策参数,以添加多条规则。
以下示例展示了导出政策同时包含 root-squash 和 all-squash 规则的情况:
gcloud netapp volumes update my_volume --location=us-east4 \ --export-policy=allowed-clients=10.0.1.18,nfsv3=true,access-type=READ_WRITE,squash-mode=NO_ROOT_SQUASH \ --export-policy=allowed-clients=10.0.2.0/24,nfsv3=true,access-type=READ_WRITE,squash-mode=ALL_SQUASH,anon-uid=2000
如需详细了解其他可选标志,请参阅 Google Cloud SDK 文档中的卷导出政策。
NFS 客户端的装载说明
请按照以下说明,使用 Google Cloud 控制台或 Google Cloud CLI 获取 NFS 客户端的装载说明:
控制台
前往 Google Cloud 控制台中的 NetApp Volumes 页面。
点击卷。
点击 展开。
选择装载说明。
按照 Google Cloud 控制台中显示的装载说明操作。
确定装载命令并使用装载选项,除非您的工作负载有特定的装载选项要求。
仅限 NFSv3:如果您的应用不使用锁,或者您未配置客户端以启用 NSM 通信,我们建议您添加
nolock装载选项。
gcloud
查找卷的装载说明:
gcloud netapp volumes describe VOLUME_NAME \ --project=PROJECT_ID \ --location=LOCATION \ --format="value(mountOptions.instructions)"
请替换以下信息:
VOLUME_NAME:卷的名称。PROJECT_ID:卷所在项目的名称。LOCATION:卷的位置。
如需详细了解其他可选标志,请参阅 Google Cloud SDK 关于卷的文档。
其他 NFSv4.1 说明
为 Flex Unified、Standard、Premium 和 Extreme 服务等级的卷启用 NFSv4.1 时,系统会自动为这些卷启用 NFSv4.2。Linux 装载命令始终会装载可用的最高 NFS 版本,除非您指定要装载的版本。如果您想使用 NFSv4.1 进行装载,请在装载命令中使用 -o vers=4.1 参数。
在 NFSv3 中,用户和群组由通过 NFSv3 协议发送的用户 ID (UID) 和群组 ID (GID) 进行标识。请务必确保在访问该卷的所有客户端上,相同的 UID 和 GID 代表相同的用户和群组。NFSv4 通过使用安全标识符,无需进行显式 UID 和 GID 映射。安全标识符是格式为 <username|groupname>@<full_qualified_domain> 的字符串。安全标识符的一个示例是 bob@example.com。客户端需要先将内部使用的 UID 和 GID 转换为安全标识符,然后再向服务器发送 NFSv4 请求。服务器需要将传入请求的安全标识符转换为 UID 和 GID,并将其响应的 UID 和 GID 转换为安全标识符。使用转换的优势在于,每个客户端和服务器都可以使用不同的内部 UID 和 GID。不过,缺点是所有客户端和服务器都需要维护 UID 和 GID、用户和群组名称之间的映射列表。客户端上的映射信息可以来自本地文件(如 /etc/passwd 和 /etc/groups)或 LDAP 目录。此映射的配置由 rpc.idmapd 管理,该工具必须在客户端上运行。
在 NetApp 卷上,LDAP 必须提供映射信息,并且 Active Directory 是唯一受支持的 RFC2307bis 兼容 LDAP 服务器。将 Kerberos 用于 NFSv4 时,安全标识符会以 username@DOMAINNAME 格式存储 Kerberos 正文,其中 DOMAINNAME(大写)会成为领域名称。
数字 ID
对于不想配置名称映射的用户,NFSv4 引入了一个名为 numeric ID 的选项,该选项会将 UID 和 GID 编码为文本字符串并作为安全标识符发送。这简化了用户的配置流程。
您可以使用以下命令检查客户端设置:
cat /sys/module/nfs/parameters/nfs4_disable_idmapping
默认值为 Y,用于启用数字 ID。NetApp Volumes 支持使用数字 ID。
在 NFS 客户端上配置 rpc.idmapd
无论您使用哪种类型的 ID 或安全标识符,都必须在 NFS 客户端上配置 rpc.idmapd。如果您已按照准备工作部分中的客户端实用程序安装说明进行操作,则该实用程序应该已安装,但可能未运行。某些发行版会在您装载第一个 NFS 卷时使用 systemd 自动启动它。rpc.idmapd 所需的最低配置是设置网域。否则,用户根目录将显示为 nobody,并带有 UID=65534 or 4294967295。
按照以下说明在 NFS 客户端上配置 rpc.idmapd:
在客户端上,打开文件
/etc/idmapd.conf,并将网域参数更改为以下值之一:如果您的卷未启用 LDAP,请执行以下操作:
domain = defaultv4iddomain.com。如果您的卷已启用 LDAP,则为
domain = <FDQN_of_Windows_Domain>。
运行以下命令,激活对
rpc.idmapd所做的更改:nfsidmap -c
支持 NFSv4.2
除了 NFSv4.1 之外,Flex Unified、Standard、Premium 和 Extreme 服务等级现在还支持在已启用 NFSv4.1 的卷上使用 NFSv4.2 协议。
装载 NFS 卷时,Linux mount 命令会自动选择可用的最高 NFS 版本。装载已启用 NFSv4.1 的卷时,系统会自动默认使用 NFSv4.2,除非明确指定 vers=4.1 装载选项。
NetApp Volumes 支持 NFS 扩展属性 xattrs 和 NFSv4.2。xattrs 的使用情况和限制(如 TR-4962 中详述)也适用。
将 Linux 连接到 LDAP
如果您使用的是 NFSv3 扩展群组或 NFSv4.1(带安全标识符),则已将 NetApp Volumes 配置为使用附加到存储池的 Active Directory 作为 LDAP 服务器。
为了在 NFS 客户端和服务器之间保持一致的用户信息,您可能需要将客户端配置为使用 Active Directory 作为 LDAP 名称服务来获取用户和群组信息。
使用以下资源配置 LDAP:
使用 Kerberized NFS 时,您可能需要使用本部分中提到的部署指南来配置 LDAP,并确保客户端和服务器之间的一致性。