连接 NFS 客户端

本页介绍了如何连接 NFS 客户端。

准备工作

如果您使用防火墙来控制网络流量,并希望允许 NFS 流量,请参阅 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 只读 关闭 其他网络可以从卷中读取数据,但不能写入数据。

客户端装载卷后,文件级访问权限会决定用户可以执行的操作。如需了解详情,请参阅 NFS 文件级访问权限控制(适用于 UNIX 风格的卷)

管理导出政策

按照以下说明使用 Google Cloud CLI 更新卷的导出政策。

gcloud

使用一个导出政策更新卷

使用一条导出政策规则更新卷:

gcloud netapp volumes update VOLUME_ID \
  --project=PROJECT_ID \
  --location=LOCATION \
  --export-policy=access-type=ACCESS_TYPE,allowed-clients=ALLOWED_CLIENTS_IP_ADDRESSES,has-root-access=TRUE_OR_FALSE,nfsv3=NFSV3,nfsv4=NFSV4

替换以下信息:

  • VOLUME_ID:卷的 ID。

  • PROJECT_ID:卷所在项目的名称。

  • LOCATION:卷的位置。

  • ACCESS_TYPE:访问类型必须是 READ_WRITEREAD_ONLYREAD_NONE 中的一个。

  • ALLOWED_CLIENTS_IP_ADDRESSES:以英文逗号分隔的允许的客户端 IP 地址或范围的列表。

  • NFSV3:设置为 truefalse 可将此规则应用于 NFSv3。

  • NFSV4:设置为 truefalse 可将此规则应用于 NFSv4。

添加多条导出政策规则

如需添加多条导出规则,请重复使用 export-policy 参数块。每个 export-policy 参数块都包含多个键值对,格式如下:

--export-policy=KEY1=VALUE1,KEY2=VALUE2,KEY3=VALUE3...

示例:使用英文冒号和英文逗号作为分隔符

如果您为 allowed-clients 指定了多个 IP 地址或 CIDR,Google Cloud CLI 可能无法正确解析值,因为 --export-policy 标志使用英文逗号作为不同键(例如 access-typenfsv3)之间的默认分隔符。如果某个值(例如 allowed-clients)也包含逗号,解析器将无法区分新键值对和 allowed-clients 列表中的其他 IP 地址。为了区分这些逗号,请配置 Google Cloud CLI 以使用其他参数分隔符并启用 Google Cloud CLI 转义

以下命令显示了导出政策的最佳实践中的示例。第一个规则使用英文冒号作为参数分隔符,以正确解析以英文逗号分隔的 allowed-clients 列表。第二条和第三条规则使用默认的英文逗号作为分隔符。

gcloud netapp volumes update my_volume --location=us-east4 \
--export-policy=^:^access-type=READ_WRITE:allowed-clients="10.10.5.3,10.10.5.9":nfsv3=true:nfsv4=true:has-root-access=true \
--export-policy=access-type=READ_WRITE,allowed-clients=10.0.5.0/24,nfsv3=true,has-root-access=false \
--export-policy=access-type=READ_ONLY,allowed-clients=10.0.6.0/24,nfsv3=true,has-root-access=false

示例:使用 squash-mode 作为参数

以下示例使用替代参数 squash-mode 为管理员主机创建 NO_ROOT_SQUASH 规则,并为 CIDR 范围创建 ALL_SQUASH 规则。

gcloud netapp volumes update my_volume --location=us-east4 \
--export-policy=^:^allowed-clients="10.10.5.3,10.10.5.9":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 卷导出政策

用户 ID 合并

NFS 导出政策可用于控制用户和群组 ID 压缩,让您能够出于安全目的将用户和群组 ID 重新映射到匿名用户 ID。

根用户废除

NFS 服务器通过将根用户 (UID=0) 重新映射为 nobody (UID=65534) 来提高安全性,这使得根用户成为对卷上的文件进行访问的无特权用户。此功能称为“根压缩”。在 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 File 服务等级,all-squash 不会自动更改卷的根 inode 的所有权。为此,请添加 no-root-squash 导出规则,允许根用户使用 chown 将根 inode 的所有权更改为所需的 UID。

  • 支持 has-root-access 参数。使用 has-root-accesssquash-mode,但不要同时使用这两个参数。

NFS 客户端的装载说明

使用以下说明,通过 Google Cloud 控制台、Google Cloud CLI 或 ONTAP 模式获取 NFS 客户端的装载说明。

控制台

  1. 前往 Google Cloud 控制台中的 NetApp Volumes 页面。

    转到“NetApp Volumes”

  2. 点击

  3. 点击 展开

  4. 选择装载说明

  5. 按照 Google Cloud 控制台中显示的装载说明操作。

  6. 首先在控制台中输入装载命令和选项。如需详细了解性能调优、内核并发、装载选项和预读取,请参阅针对 NetApp Volumes 优化 Linux NFS 客户端

    仅限 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 文档中的卷部分

ONTAP 模式

请按照以下步骤确定卷的主机名或 IP 地址以及导出路径:

  1. data_cifs 服务查找所有网络接口

  2. 确定导出路径,该路径与您为卷指定的联接路径相对应。

  3. 创建格式为 IP:junction-path 的装载路径,并添加任何所需的装载选项。

确定所需命令后,请参阅 ONTAP 模式,了解如何向存储池提交 ONTAP 命令。

其他 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 Volumes 上,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

  1. 在客户端上,打开文件 /etc/idmapd.conf,并将网域参数更改为以下值之一:

    • 如果您的卷未启用 LDAP,请执行以下操作:domain = defaultv4iddomain.com

    • 如果您的卷已启用 LDAP,请执行以下操作:domain = <FDQN_of_Windows_Domain>

  2. 运行以下命令,激活对 rpc.idmapd 所做的更改:

     nfsidmap -c

支持 NFSv4.2

Flex 统一、标准、高级和极速服务等级现在支持 NFSv4.2 协议,此外还支持已启用 NFSv4.1 的卷上的 NFSv4.1。

装载 NFS 卷时,Linux mount 命令会自动选择可用的最高 NFS 版本。装载已启用 NFSv4.1 的卷时,系统会自动默认使用 NFSv4.2,除非明确指定了 vers=4.1 装载选项。

NetApp Volumes 支持 NFS 扩展属性 xattrs 和 NFSv4.2。xattrs 的使用和限制(如 TR-4962 中详述)也适用。

NFS 卷访问的防火墙规则

NFS 使用多个端口在客户端和服务器之间进行通信。对于 Google Compute Engine 和 NetApp Volumes 之间的通信,默认情况下不会屏蔽这些端口。如果您使用防火墙,则必须允许访问以下端口,以用于完整的 NetApp 卷 PSA CIDR 或各个卷 IP 地址:

  • 111 TCP/UDP portmapper

  • 635 TCP/UDP mountd

  • 2049 TCP/UDP nfsd

  • 4045 TCP/UDP nlockmgr(仅限 NFSv3)

  • 4046 TCP/UDP status(仅限 NFSv3)

NetApp Volumes 的 IP 地址会自动从您在网络对等互连期间分配给服务的 CIDR 范围中分配。如需了解详情,请参阅配置专用服务访问通道

将建议性锁定与 NFSv3 搭配使用

如果您将建议性锁定与 NFSv3 搭配使用,则必须在客户端上运行 rpc.statd 守护程序,以支持网络锁定管理器。该管理器可与 NFS 搭配使用,以通过网络提供 System V 样式的建议性文件和记录锁定。您的 NFS 客户端必须为 rpc.statd 打开入站端口,以接收网络锁定管理器回调。在大多数 Linux 发行版中,当您装载第一个 NFS 共享时,rpc.statd 会启动。它使用随机端口,您可以使用 rpcinfo -p 命令来识别该端口。为了使 rpc.statd 与防火墙兼容,请将其配置为使用静态端口。

如需为 rpc.statd 设置静态端口,请参阅以下资源:

如果您不使用 NFSv3 建议性锁定或网络锁定管理器,则可以使用 nolock 装载选项装载 NFSv3 共享。

NFSv4.1 在 NFSv4.1 协议内实现锁定功能,该功能通过客户端发起的 TCP 连接在端口 2049 上运行到 NFSv4.1 服务器。客户端无需为入站流量打开防火墙端口。

将 Linux 连接到 LDAP

如果您使用的是 NFSv3 扩展群组或 NFSv4.1(带安全标识符),则已将 NetApp Volumes 配置为使用附加到存储池的 Active Directory 作为 LDAP 服务器。

为了在 NFS 客户端和服务器之间保持一致的用户信息,您可能需要将客户端配置为使用 Active Directory 作为 LDAP 名称服务来获取用户和群组信息。

使用以下资源配置 LDAP:

使用 Kerberized NFS 时,您可能需要使用本部分中提到的部署指南来配置 LDAP,并确保客户端和服务器之间的一致性。

后续步骤